{-# LANGUAGE
MultiParamTypeClasses,
FunctionalDependencies,
GADTs
#-}
module Data.StateRef.Types where
data Ref m a where
Ref :: ModifyRef sr m a => !sr -> Ref m a
class WriteRef sr m a | sr -> a where
writeReference :: sr -> a -> m ()
class ReadRef sr m a | sr -> a where
readReference :: sr -> m a
class (ReadRef sr m a, WriteRef sr m a) => ModifyRef sr m a | sr -> a where
atomicModifyReference :: sr -> (a -> (a,b)) -> m b
modifyReference :: sr -> (a -> a) -> m ()
defaultAtomicModifyReference :: sr -> (t -> (a, b)) -> m b
defaultAtomicModifyReference sr
ref t -> (a, b)
f = do
t
x <- sr -> m t
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference sr
ref
let (a
x', b
b) = t -> (a, b)
f t
x
sr -> a -> m ()
forall sr (m :: * -> *) a. WriteRef sr m a => sr -> a -> m ()
writeReference sr
ref a
x'
b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return b
b
defaultModifyReference :: sr -> (t -> a) -> m ()
defaultModifyReference sr
ref t -> a
f = do
t
x <- sr -> m t
forall sr (m :: * -> *) a. ReadRef sr m a => sr -> m a
readReference sr
ref
let x' :: a
x' = t -> a
f t
x
sr -> a -> m ()
forall sr (m :: * -> *) a. WriteRef sr m a => sr -> a -> m ()
writeReference sr
ref a
x'
() -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
class NewRef sr m a | sr -> a where
newReference :: a -> m sr
class HasRef m where
newRef :: a -> m (Ref m a)