stateref-0.3: src/Data/MRef/Types.hs
{-# LANGUAGE
MultiParamTypeClasses,
FunctionalDependencies,
GADTs
#-}
-- |This module defines the \"MRef\" abstraction, which is a set of
-- type-classes for things that behave like 'Control.Concurrent.MVar.MVar's.
-- See the documentation there for more info.
--
-- This interface may be subject to future expansion. Presently, rather
-- than providing something like 'Control.Concurrent.MVar.tryTakeMVar',
-- instances for \"'Data.StateRef.Types.ReadRef' sr m ('Maybe' a)\" are
-- provided, giving 'Data.StateRef.Types.readReference' the same type
-- tryTakeMRef would have if it existed. There is currently nothing like
-- 'Control.Concurrent.MVar.tryPutMVar', though. Perhaps there should be.
-- Or, perhaps this is the sort of thing the weird (to me) signature of
-- 'Data.IORef.atomicModifyIORef' is for, and an argument for a similar
-- signature for 'Data.StateRef.Types.modifyStateRef' or the addition of
-- a new atomicModifyStateRef function.
--
-- I would like to resolve these questions in version 0.3 of this package.
module Data.MRef.Types where
data MRef m a where
MRef :: (TakeMRef sr m a, PutMRef sr m a) => !sr -> MRef m a
class HasMRef m where
newMRef :: a -> m (MRef m a)
newEmptyMRef :: m (MRef m a)
class Monad m => NewMRef sr m a | sr -> a where
-- |See 'Control.Concurrent.MVar.newMVar'
newMReference :: a -> m sr
-- |See 'Control.Concurrent.MVar.newEmptyMVar'
newEmptyMReference :: m sr
class Monad m => TakeMRef sr m a | sr -> a where
-- |See 'Control.Concurrent.MVar.takeMVar'
takeMReference :: sr -> m a
class Monad m => PutMRef sr m a | sr -> a where
-- |See 'Control.Concurrent.MVar.putMVar'
putMReference :: sr -> a -> m ()