module Control.Mutation where
import Data.IORef
import Data.STRef
import Control.Monad.ST
import Control.Monad.Trans
class Mutation m where
type Ref m :: * -> *
newRef :: a -> m (Ref m a)
readRef :: Ref m a -> m a
writeRef :: Ref m a -> a -> m ()
instance Mutation IO where
type Ref IO = IORef
newRef = newIORef
readRef = readIORef
writeRef = writeIORef
instance Mutation (ST s) where
type Ref (ST s) = STRef s
newRef = newSTRef
readRef = readSTRef
writeRef = writeSTRef
instance (Monad m, Mutation m, MonadTrans t)
=> Mutation (t m) where
type Ref (t m) = Ref m
newRef = lift . newRef
readRef = lift . readRef
writeRef = (lift .) . writeRef