summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffreyMainland <>2010-09-22 17:57:48 (GMT)
committerLuite Stegeman <luite@luite.com>2010-09-22 17:57:48 (GMT)
commit34e1c7bc1730f0ae1abaa3da81e3b478cf67c40c (patch)
tree7a1c8ff1ce8f371fd9ee0dcddadf4637eb0e3648
version 0.10.1
-rw-r--r--Control/Monad/Ref.hs83
-rw-r--r--LICENSE26
-rw-r--r--Setup.hs3
-rw-r--r--ref-tf.cabal24
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
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..86e0dc1
--- /dev/null
+++ b/LICENSE
@@ -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