{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances #-} -- | -- Module : Simulation.Aivika.Lattice.Ref.Base.Strict -- Copyright : Copyright (c) 2016-2017, David Sorokin -- License : BSD3 -- Maintainer : David Sorokin -- Stability : experimental -- Tested with: GHC 7.10.3 -- -- Here is an implementation of strict mutable references, where -- 'LIO' is an instance of 'MonadRef' and 'MonadRef0'. -- module Simulation.Aivika.Lattice.Ref.Base.Strict () where import Simulation.Aivika.Trans.Internal.Types import Simulation.Aivika.Trans.Comp import Simulation.Aivika.Trans.Simulation import Simulation.Aivika.Trans.Ref.Base.Strict import Simulation.Aivika.Trans.Observable import Simulation.Aivika.Lattice.Internal.LIO import qualified Simulation.Aivika.Lattice.Internal.Ref.Strict as R import Simulation.Aivika.Lattice.Internal.Estimate import Simulation.Aivika.Lattice.Internal.Event -- | The implementation of mutable references. instance MonadRef LIO where -- | The mutable reference. newtype Ref LIO a = Ref { refValue :: R.Ref a } {-# INLINE newRef #-} newRef = fmap Ref . R.newRef {-# INLINE readRef #-} readRef (Ref r) = R.readRef r {-# INLINE writeRef #-} writeRef (Ref r) = R.writeRef r {-# INLINE modifyRef #-} modifyRef (Ref r) = R.modifyRef r {-# INLINE equalRef #-} equalRef (Ref r1) (Ref r2) = (r1 == r2) -- | A subtype of mutable references that can be created under more weak conditions. instance MonadRef0 LIO where {-# INLINE newRef0 #-} newRef0 = fmap Ref . R.newRef0 -- | An instance of the specified type class. instance Observable (Ref LIO) (Estimate LIO) where {-# INLINE readObservable #-} readObservable (Ref r) = estimateStrictRef r