packages feed

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 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/