Add atomicModifyMutVar
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 25 Sep 2012 21:56:02 +0000 (21:56 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 25 Sep 2012 21:56:02 +0000 (21:56 +0000)
Data/Primitive/MutVar.hs

index ebccd6a..e77406d 100644 (file)
@@ -17,12 +17,14 @@ module Data.Primitive.MutVar (
   newMutVar,
   readMutVar,
   writeMutVar,
-  
+
+  atomicModifyMutVar,
   modifyMutVar
 ) where
 
 import Control.Monad.Primitive ( PrimMonad(..), primitive_ )
-import GHC.Prim ( MutVar#, sameMutVar#, newMutVar#, readMutVar#, writeMutVar# )
+import GHC.Prim ( MutVar#, sameMutVar#, newMutVar#,
+                  readMutVar#, writeMutVar#, atomicModifyMutVar# )
 import Data.Typeable ( Typeable )
 
 -- | A 'MutVar' behaves like a single-element mutable array associated
@@ -50,6 +52,11 @@ writeMutVar :: PrimMonad m => MutVar (PrimState m) a -> a -> m ()
 {-# INLINE writeMutVar #-}
 writeMutVar (MutVar mv#) newValue = primitive_ (writeMutVar# mv# newValue)
 
+-- | Atomically mutate the contents of a 'MutVar'
+atomicModifyMutVar :: PrimMonad m => MutVar (PrimState m) a -> (a -> (a,b)) -> m b
+{-# INLINE atomicModifyMutVar #-}
+atomicModifyMutVar (MutVar mv#) f = primitive $ atomicModifyMutVar# mv# f
+
 -- | Mutate the contents of a 'MutVar' 
 modifyMutVar :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()
 {-# INLINE modifyMutVar #-}