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 :: forall (m :: * -> *) a. 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 :: forall (m :: * -> *) a. 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 :: forall (m :: * -> *) a b. Ref m a -> (a -> (a, b)) -> m b
atomicModifyRef = Ref m a -> (a -> (a, b)) -> m b
forall b. 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 :: forall (m :: * -> *) a. 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 :: forall sr (m :: * -> *) a b.
(ReadRef sr m a, Monad m) =>
sr -> (a -> b) -> m b
readsRef sr
r a -> b
f = do
x <- sr -> m a
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference sr
r
return (f x)
newCounter :: (HasRef m, Monad m, Enum a) => a -> m (m a)
newCounter :: forall (m :: * -> *) a. (HasRef m, Monad m, Enum a) => a -> m (m a)
newCounter a
n = do
c <- a -> m (Ref m a)
forall a. a -> m (Ref m a)
forall (m :: * -> *) a. HasRef m => a -> m (Ref m a)
newRef a
n
return $ do
x <- readRef c
writeRef c (succ x)
return x
mkLapseReader
:: (ReadRef sr m a, HasRef m, Monad m) =>
sr -> (a -> a -> b) -> m (m b)
mkLapseReader :: forall sr (m :: * -> *) a b.
(ReadRef sr m a, HasRef m, Monad m) =>
sr -> (a -> a -> b) -> m (m b)
mkLapseReader sr
var a -> a -> b
f = do
startVal <- sr -> m a
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference sr
var
prevRef <- newRef startVal
return $ do
newVal <- readReference var
prevVal <- readRef prevRef
writeReference prevRef newVal
return (f newVal prevVal)