packages feed

ref-mtl (empty) → 0.2

raw patch · 4 files changed

+252/−0 lines, 4 filesdep +basedep +mtldep +stmsetup-changed

Dependencies added: base, mtl, stm

Files

+ Control/Monad/Ref.hs view
@@ -0,0 +1,193 @@+-- Copyright (c) 2006-2010+--         The President and Fellows of Harvard College.+--+-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions+-- are met:+-- 1. Redistributions of source code must retain the above copyright+--    notice, this list of conditions and the following disclaimer.+-- 2. Redistributions in binary form must reproduce the above copyright+--    notice, this list of conditions and the following disclaimer in the+--    documentation and/or other materials provided with the distribution.+-- 3. Neither the name of the University nor the names of its contributors+--    may be used to endorse or promote products derived from this software+--    without specific prior written permission.+--+-- THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND+-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE+-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+-- SUCH DAMAGE.++--------------------------------------------------------------------------------+-- |+-- Module      :  Control.Monad.Ref+-- Copyright   :  (c) Harvard University 2006-2010+-- License     :  BSD-style+-- Maintainer  :  mainland@eecs.harvard.edu+--+-- Stability   :  experimental+-- Portability :  non-portable+--+--------------------------------------------------------------------------------++{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE UndecidableInstances #-}++module Control.Monad.Ref (+    MonadRef(..),+    MonadAtomicRef(..)+  ) where++import Control.Concurrent.STM (STM)+import Control.Concurrent.STM.TVar (TVar,+                                    newTVar,+                                    readTVar,+                                    writeTVar)+import Control.Monad.ST (ST)+import Control.Monad.Cont (ContT)+import Control.Monad.Error (ErrorT, Error)+import Control.Monad.List (ListT)+import Control.Monad.Reader (ReaderT)+import Control.Monad.State.Lazy as Lazy (StateT)+import Control.Monad.State.Strict as Strict (StateT)+import Control.Monad.Trans (lift)+import Control.Monad.Writer.Lazy as Lazy (WriterT)+import Control.Monad.Writer.Strict as Strict (WriterT)+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+-- references, allowing one to write code that uses references and can operate+-- in any monad that supports reference operations.++class (Monad m) => MonadRef r m | m -> r where+    -- |Create a new reference+    newRef    :: a -> m (r a)+    -- |Read the value of a reference+    readRef   :: r a -> m a+    -- |Write a new value to a reference+    writeRef  :: r a -> a -> m ()+    -- |Mutate the contents of a reference+    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+    writeRef  = writeSTRef+    modifyRef = modifySTRef++instance MonadRef IORef IO where+    newRef    = newIORef+    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 (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 (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 (ListT 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
+ LICENSE view
@@ -0,0 +1,26 @@+Copyright (c) 2006-2010+        The President and Fellows of Harvard College.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:+1. Redistributions of source code must retain the above copyright+   notice, this list of conditions and the following disclaimer.+2. Redistributions in binary form must reproduce the above copyright+   notice, this list of conditions and the following disclaimer in the+   documentation and/or other materials provided with the distribution.+3. Neither the name of the University nor the names of its contributors+   may be used to endorse or promote products derived from this software+   without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,3 @@+import Distribution.Simple++main = defaultMain
+ ref-mtl.cabal view
@@ -0,0 +1,30 @@+name:           ref-mtl+version:        0.2+cabal-version:  >= 1.6+license:        BSD3+license-file:   LICENSE+copyright:      (c) 2006-2010 Harvard University+author:         Geoffrey Mainland <mainland@eecs.harvard.edu>+maintainer:     mainland@eecs.harvard.edu+stability:      alpha+homepage:       http://www.eecs.harvard.edu/~mainland/+category:       Control+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.++build-type:     Simple++library+  exposed-modules:+    Control.Monad.Ref++  build-depends:+    base >= 4 && < 5,+    stm >= 2.1 && < 2.2,+    mtl >= 1.1 && < 1.2++source-repository head+  type:     svn+  location: http://senseless.eecs.harvard.edu/repos/mainland-projects/ref-mtl/trunk/