module Data.StateRef
( module Data.StateRef
, module Data.StateRef.Types
, module Data.StateRef.Instances
, module Data.Accessor
) where
import Data.StateRef.Types
import Data.StateRef.Instances
import Data.Accessor
readRef :: Ref m a -> m a
readRef :: Ref m a -> m a
readRef = Ref m a -> m a
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference
writeRef :: Ref m a -> a -> m ()
writeRef :: Ref m a -> a -> m ()
writeRef = Ref m a -> a -> m ()
forall sr (m :: * -> *) a. WriteRef sr m a => sr -> a -> m ()
writeReference
atomicModifyRef :: Ref m a -> (a -> (a,b)) -> m b
atomicModifyRef :: Ref m a -> (a -> (a, b)) -> m b
atomicModifyRef = Ref m a -> (a -> (a, b)) -> m b
forall sr (m :: * -> *) a b.
ModifyRef sr m a =>
sr -> (a -> (a, b)) -> m b
atomicModifyReference
modifyRef :: Ref m a -> (a -> a) -> m ()
modifyRef :: Ref m a -> (a -> a) -> m ()
modifyRef = Ref m a -> (a -> a) -> m ()
forall sr (m :: * -> *) a.
ModifyRef sr m a =>
sr -> (a -> a) -> m ()
modifyReference
readsRef :: (ReadRef sr m a,
Monad m) =>
sr -> (a -> b) -> m b
readsRef :: sr -> (a -> b) -> m b
readsRef sr
r a -> b
f = do
a
x <- sr -> m a
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference sr
r
b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> b
f a
x)
newCounter :: (HasRef m, Monad m, Enum a) => a -> m (m a)
newCounter :: a -> m (m a)
newCounter a
n = do
Ref m a
c <- a -> m (Ref m a)
forall (m :: * -> *) a. HasRef m => a -> m (Ref m a)
newRef a
n
m a -> m (m a)
forall (m :: * -> *) a. Monad m => a -> m a
return (m a -> m (m a)) -> m a -> m (m a)
forall a b. (a -> b) -> a -> b
$ do
a
x <- Ref m a -> m a
forall (m :: * -> *) a. Ref m a -> m a
readRef Ref m a
c
Ref m a -> a -> m ()
forall (m :: * -> *) a. Ref m a -> a -> m ()
writeRef Ref m a
c (a -> a
forall a. Enum a => a -> a
succ a
x)
a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
mkLapseReader
:: (ReadRef sr m a, HasRef m, Monad m) =>
sr -> (a -> a -> b) -> m (m b)
mkLapseReader :: sr -> (a -> a -> b) -> m (m b)
mkLapseReader sr
var a -> a -> b
f = do
a
startVal <- sr -> m a
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference sr
var
Ref m a
prevRef <- a -> m (Ref m a)
forall (m :: * -> *) a. HasRef m => a -> m (Ref m a)
newRef a
startVal
m b -> m (m b)
forall (m :: * -> *) a. Monad m => a -> m a
return (m b -> m (m b)) -> m b -> m (m b)
forall a b. (a -> b) -> a -> b
$ do
a
newVal <- sr -> m a
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference sr
var
a
prevVal <- Ref m a -> m a
forall (m :: * -> *) a. Ref m a -> m a
readRef Ref m a
prevRef
Ref m a -> a -> m ()
forall sr (m :: * -> *) a. WriteRef sr m a => sr -> a -> m ()
writeReference Ref m a
prevRef a
newVal
b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> a -> b
f a
newVal a
prevVal)