ref-fd 0.1 → 0.2
raw patch · 2 files changed
+154/−14 lines, 2 filesdep +stmdep +transformersPVP ok
version bump matches the API change (PVP)
Dependencies added: stm, transformers
API changes (from Hackage documentation)
+ Control.Monad.Ref: atomicModifyRef :: MonadAtomicRef r m => r a -> (a -> (a, b)) -> m b
+ Control.Monad.Ref: class MonadRef r m => MonadAtomicRef r m | m -> r
+ Control.Monad.Ref: instance (Error e, MonadAtomicRef r m) => MonadAtomicRef r (ErrorT e m)
+ Control.Monad.Ref: instance (Error e, MonadRef r m) => MonadRef r (ErrorT e m)
+ Control.Monad.Ref: instance (Monoid w, MonadAtomicRef r m) => MonadAtomicRef r (WriterT w m)
+ Control.Monad.Ref: instance (Monoid w, MonadRef r m) => MonadRef r (WriterT w m)
+ Control.Monad.Ref: instance MonadAtomicRef IORef IO
+ Control.Monad.Ref: instance MonadAtomicRef TVar STM
+ Control.Monad.Ref: instance MonadAtomicRef r m => MonadAtomicRef r (ContT r' m)
+ Control.Monad.Ref: instance MonadAtomicRef r m => MonadAtomicRef r (IdentityT m)
+ Control.Monad.Ref: instance MonadAtomicRef r m => MonadAtomicRef r (ListT m)
+ Control.Monad.Ref: instance MonadAtomicRef r m => MonadAtomicRef r (MaybeT m)
+ Control.Monad.Ref: instance MonadAtomicRef r m => MonadAtomicRef r (ReaderT r' m)
+ Control.Monad.Ref: instance MonadAtomicRef r m => MonadAtomicRef r (StateT s m)
+ Control.Monad.Ref: instance MonadRef TVar STM
+ Control.Monad.Ref: instance MonadRef r m => MonadRef r (ContT r' m)
+ Control.Monad.Ref: instance MonadRef r m => MonadRef r (IdentityT m)
+ Control.Monad.Ref: instance MonadRef r m => MonadRef r (ListT m)
+ Control.Monad.Ref: instance MonadRef r m => MonadRef r (MaybeT m)
+ Control.Monad.Ref: instance MonadRef r m => MonadRef r (ReaderT r' m)
+ Control.Monad.Ref: instance MonadRef r m => MonadRef r (StateT s m)
- Control.Monad.Ref: class (Monad m) => MonadRef r m | m -> r
+ Control.Monad.Ref: class Monad m => MonadRef r m | m -> r
- Control.Monad.Ref: modifyRef :: (MonadRef r m) => r a -> (a -> a) -> m ()
+ Control.Monad.Ref: modifyRef :: MonadRef r m => r a -> (a -> a) -> m ()
- Control.Monad.Ref: newRef :: (MonadRef r m) => a -> m (r a)
+ Control.Monad.Ref: newRef :: MonadRef r m => a -> m (r a)
- Control.Monad.Ref: readRef :: (MonadRef r m) => r a -> m a
+ Control.Monad.Ref: readRef :: MonadRef r m => r a -> m a
- Control.Monad.Ref: writeRef :: (MonadRef r m) => r a -> a -> m ()
+ Control.Monad.Ref: writeRef :: MonadRef r m => r a -> a -> m ()
Files
- Control/Monad/Ref.hs +144/−9
- ref-fd.cabal +10/−5
Control/Monad/Ref.hs view
@@ -33,26 +33,53 @@ -- Maintainer : mainland@eecs.harvard.edu -- -- Stability : experimental--- Portability : non-portable (uses Control.Monad.ST)------ Mutable references in the (strict) ST monad.+-- Portability : non-portable -- -------------------------------------------------------------------------------- +{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-} module Control.Monad.Ref (- MonadRef(..)+ MonadRef(..),+ MonadAtomicRef(..) ) where -import Control.Monad.ST-import Data.IORef-import Data.STRef+import Control.Concurrent.STM (STM)+import Control.Concurrent.STM.TVar (TVar,+ newTVar,+ readTVar,+ writeTVar)+import Control.Monad.ST (ST)+import Control.Monad.Trans.Cont (ContT)+import Control.Monad.Trans.Error (ErrorT, Error)+import Control.Monad.Trans.Identity (IdentityT)+import Control.Monad.Trans.List (ListT)+import Control.Monad.Trans.Maybe (MaybeT)+import Control.Monad.Trans.Reader (ReaderT)+import Control.Monad.Trans.State.Lazy as Lazy (StateT)+import Control.Monad.Trans.State.Strict as Strict (StateT)+import Control.Monad.Trans.Writer.Lazy as Lazy (WriterT)+import Control.Monad.Trans.Writer.Strict as Strict (WriterT)+import Control.Monad.Trans.Class (lift)+import Data.IORef (IORef,+ atomicModifyIORef,+ modifyIORef,+ newIORef,+ readIORef,+ writeIORef)+import Data.Monoid (Monoid)+import Data.STRef (STRef,+ modifySTRef,+ newSTRef,+ readSTRef,+ writeSTRef) --- | The 'MonadRef' type class abstracts over the details of manipulating+-- |The 'MonadRef' type class abstracts over the details of manipulating -- references, allowing one to write code that uses references and can operate--- in either the ST monad or the IO monad.+-- in any monad that supports reference operations. class (Monad m) => MonadRef r m | m -> r where -- |Create a new reference@@ -65,6 +92,10 @@ modifyRef :: r a -> (a -> a) -> m () modifyRef r f = readRef r >>= writeRef r . f +class (MonadRef r m) => MonadAtomicRef r m | m -> r where+ -- |Atomically mutate the contents of a reference+ atomicModifyRef :: r a -> (a -> (a, b)) -> m b+ instance MonadRef (STRef s) (ST s) where newRef = newSTRef readRef = readSTRef@@ -76,3 +107,107 @@ readRef = readIORef writeRef = writeIORef modifyRef = modifyIORef++instance MonadRef TVar STM where+ newRef = newTVar+ readRef = readTVar+ writeRef = writeTVar++instance MonadRef r m => MonadRef r (ContT r' m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance (Error e, MonadRef r m) => MonadRef r (ErrorT e m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance MonadRef r m => MonadRef r (IdentityT m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance MonadRef r m => MonadRef r (ListT m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance MonadRef r m => MonadRef r (MaybeT m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance MonadRef r m => MonadRef r (ReaderT r' m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance MonadRef r m => MonadRef r (Lazy.StateT s m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance MonadRef r m => MonadRef r (Strict.StateT s m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance (Monoid w, MonadRef r m) => MonadRef r (Lazy.WriterT w m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance (Monoid w, MonadRef r m) => MonadRef r (Strict.WriterT w m) where+ newRef r = lift $ newRef r+ readRef r = lift $ readRef r+ writeRef r x = lift $ writeRef r x+ modifyRef r f = lift $ modifyRef r f++instance MonadAtomicRef IORef IO where+ atomicModifyRef = atomicModifyIORef++instance MonadAtomicRef TVar STM where+ atomicModifyRef r f = do x <- readRef r+ let (x', y) = f x+ writeRef r x'+ return y++instance MonadAtomicRef r m => MonadAtomicRef r (ContT r' m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance (Error e, MonadAtomicRef r m) => MonadAtomicRef r (ErrorT e m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance MonadAtomicRef r m => MonadAtomicRef r (IdentityT m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance MonadAtomicRef r m => MonadAtomicRef r (ListT m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance MonadAtomicRef r m => MonadAtomicRef r (MaybeT m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance MonadAtomicRef r m => MonadAtomicRef r (ReaderT r' m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance MonadAtomicRef r m => MonadAtomicRef r (Lazy.StateT s m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance MonadAtomicRef r m => MonadAtomicRef r (Strict.StateT s m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance (Monoid w, MonadAtomicRef r m) => MonadAtomicRef r (Lazy.WriterT w m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f++instance (Monoid w, MonadAtomicRef r m) => MonadAtomicRef r (Strict.WriterT w m) where+ atomicModifyRef r f = lift $ atomicModifyRef r f
ref-fd.cabal view
@@ -1,6 +1,6 @@ name: ref-fd-version: 0.1-cabal-version: >= 1.2+version: 0.2+cabal-version: >= 1.6 license: BSD3 license-file: LICENSE copyright: (c) 2006-2010 Harvard University@@ -9,8 +9,7 @@ stability: alpha homepage: http://www.eecs.harvard.edu/~mainland/ category: Control-synopsis: A type class for monads with references using functional- dependencies.+synopsis: A type class for monads with references using type families. description: Contains a 'MonadRef' type class that abstracts over the details of manipulating references, allowing one to write code that can operate in either the ST monad or the IO monad.@@ -22,4 +21,10 @@ Control.Monad.Ref build-depends:- base >= 4 && < 5+ base >= 4 && < 5,+ stm >= 2.1 && < 2.2,+ transformers >= 0.2 && < 0.3++source-repository head+ type: svn+ location: http://senseless.eecs.harvard.edu/repos/mainland-projects/ref-fd/trunk/