Add Data.Primitive.MutVar, bump version to 0.4.1
authorJustin Bonnar <justinbonnar@gmail.com>
Mon, 9 Jan 2012 05:35:26 +0000 (05:35 +0000)
committerJustin Bonnar <justinbonnar@gmail.com>
Mon, 9 Jan 2012 05:35:26 +0000 (05:35 +0000)
Data/Primitive/MutVar.hs [new file with mode: 0644]
primitive.cabal

diff --git a/Data/Primitive/MutVar.hs b/Data/Primitive/MutVar.hs
new file mode 100644 (file)
index 0000000..ebccd6a
--- /dev/null
@@ -0,0 +1,58 @@
+{-# LANGUAGE MagicHash, UnboxedTuples, DeriveDataTypeable #-}
+
+-- |
+-- Module      : Data.Primitive.MutVar
+-- Copyright   : (c) Justin Bonnar 2011
+-- License     : BSD-style
+--
+-- Maintainer  : Justin Bonnar <justinbonnar@gmail.com>
+-- Portability : non-portable
+-- 
+-- Primitive boxed mutable variables
+--
+
+module Data.Primitive.MutVar (
+  MutVar(..),
+  
+  newMutVar,
+  readMutVar,
+  writeMutVar,
+  
+  modifyMutVar
+) where
+
+import Control.Monad.Primitive ( PrimMonad(..), primitive_ )
+import GHC.Prim ( MutVar#, sameMutVar#, newMutVar#, readMutVar#, writeMutVar# )
+import Data.Typeable ( Typeable )
+
+-- | A 'MutVar' behaves like a single-element mutable array associated
+-- with a primitive state token.
+data MutVar s a = MutVar (MutVar# s a)
+  deriving ( Typeable )
+
+instance Eq (MutVar s a) where
+  MutVar mva# == MutVar mvb# = sameMutVar# mva# mvb#
+
+-- | Create a new 'MutVar' with the specified initial value
+newMutVar :: PrimMonad m => a -> m (MutVar (PrimState m) a)
+{-# INLINE newMutVar #-}
+newMutVar initialValue = primitive $ \s# ->
+  case newMutVar# initialValue s# of
+    (# s'#, mv# #) -> (# s'#, MutVar mv# #)
+
+-- | Read the value of a 'MutVar'
+readMutVar :: PrimMonad m => MutVar (PrimState m) a -> m a
+{-# INLINE readMutVar #-}
+readMutVar (MutVar mv#) = primitive (readMutVar# mv#)
+
+-- | Write a new value into a 'MutVar'
+writeMutVar :: PrimMonad m => MutVar (PrimState m) a -> a -> m ()
+{-# INLINE writeMutVar #-}
+writeMutVar (MutVar mv#) newValue = primitive_ (writeMutVar# mv# newValue)
+
+-- | Mutate the contents of a 'MutVar' 
+modifyMutVar :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()
+{-# INLINE modifyMutVar #-}
+modifyMutVar (MutVar mv#) g = primitive_ $ \s# ->
+  case readMutVar# mv# s# of
+    (# s'#, a #) -> writeMutVar# mv# (g a) s'#
index 3e19e84..bb8faf3 100644 (file)
@@ -1,5 +1,5 @@
 Name:           primitive
-Version:        0.4.0.1
+Version:        0.4.1
 License:        BSD3
 License-File:   LICENSE
 Author:         Roman Leshchinskiy <rl@cse.unsw.edu.au>
@@ -13,6 +13,10 @@ Description:
         This package provides wrappers for primitive array operations from
         GHC.Prim.
         .
+        Changes in version 0.4.1
+        .
+        * New module "Data.Primitive.MutVar"
+        .
         Changes in version 0.4.0.1
         .
         * Critical bug fix in @fillByteArray@
@@ -47,6 +51,7 @@ Library
         Data.Primitive.Array
         Data.Primitive.ByteArray
         Data.Primitive.Addr
+        Data.Primitive.MutVar
 
   Other-Modules:
         Data.Primitive.Internal.Compat