diff options
author | GeoffreyMainland <> | 2010-09-22 17:57:48 (GMT) |
---|---|---|
committer | Luite Stegeman <luite@luite.com> | 2010-09-22 17:57:48 (GMT) |
commit | 34e1c7bc1730f0ae1abaa3da81e3b478cf67c40c (patch) | |
tree | 7a1c8ff1ce8f371fd9ee0dcddadf4637eb0e3648 |
version 0.10.1
-rw-r--r-- | Control/Monad/Ref.hs | 83 | ||||
-rw-r--r-- | LICENSE | 26 | ||||
-rw-r--r-- | Setup.hs | 3 | ||||
-rw-r--r-- | ref-tf.cabal | 24 |
4 files changed, 136 insertions, 0 deletions
diff --git a/Control/Monad/Ref.hs b/Control/Monad/Ref.hs new file mode 100644 index 0000000..01b2f04 --- /dev/null +++ b/Control/Monad/Ref.hs @@ -0,0 +1,83 @@ +-- 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 (uses Control.Monad.ST) +-- +-- Mutable references in the (strict) ST monad. +-- +-------------------------------------------------------------------------------- + +{-# LANGUAGE TypeFamilies #-} + +module Control.Monad.Ref ( + MonadRef(..) + ) where + +import Control.Monad.ST +import Data.IORef +import Data.STRef + +-- |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. + +class (Monad m) => MonadRef m where + type Ref m :: * -> * + + -- |Create a new reference + newRef :: a -> m (Ref m a) + -- |Read the value of a reference + readRef :: Ref m a -> m a + -- |Write a new value to a reference + writeRef :: Ref m a -> a -> m () + -- |Mutate the contents of a reference + modifyRef :: Ref m a -> (a -> a) -> m () + modifyRef r f = readRef r >>= writeRef r . f + +instance MonadRef (ST s) where + type Ref (ST s) = STRef s + + newRef = newSTRef + readRef = readSTRef + writeRef = writeSTRef + modifyRef = modifySTRef + +instance MonadRef IO where + type Ref IO = IORef + + newRef = newIORef + readRef = readIORef + writeRef = writeIORef + modifyRef = modifyIORef @@ -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. diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..e8ef27d --- /dev/null +++ b/Setup.hs @@ -0,0 +1,3 @@ +import Distribution.Simple + +main = defaultMain diff --git a/ref-tf.cabal b/ref-tf.cabal new file mode 100644 index 0000000..7abfb83 --- /dev/null +++ b/ref-tf.cabal @@ -0,0 +1,24 @@ +name: ref-tf +version: 0.1 +cabal-version: >= 1.2 +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 |