stateref-0.2.1.1: src/Data/MRef/Classes.hs
{-
- ``Data/MRef/Classes''
- (c) 2008 Cook, J. MR SSD, Inc.
-}
{-# LANGUAGE
MultiParamTypeClasses,
FunctionalDependencies
#-}
-- |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.Classes.ReadRef' sr m ('Maybe' a)\" are
-- provided, giving 'Data.StateRef.Classes.readRef' 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.Classes.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.Classes where
class Monad m => NewMRef sr m a | sr -> a where
-- |See 'Control.Concurrent.MVar.newMVar'
newMRef :: a -> m sr
-- |See 'Control.Concurrent.MVar.newEmptyMVar'
newEmptyMRef :: m sr
class Monad m => TakeMRef sr m a | sr -> a where
-- |See 'Control.Concurrent.MVar.takeMVar'
takeMRef :: sr -> m a
class Monad m => PutMRef sr m a | sr -> a where
-- |See 'Control.Concurrent.MVar.putMVar'
putMRef :: sr -> a -> m ()
class Monad m => DefaultMRef sr m a | sr -> a, m a -> sr