summaryrefslogtreecommitdiff
path: root/Control/Monad/Ref.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Control/Monad/Ref.hs')
-rw-r--r--Control/Monad/Ref.hs83
1 files changed, 83 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