Control.Concurrent.STM.TVar: added modifyTVar, modifyTVar', swapTVar
authorSimon Marlow <marlowsd@gmail.com>
Mon, 11 Apr 2011 10:06:24 +0000 (11:06 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 11 Apr 2011 10:06:24 +0000 (11:06 +0100)
Control/Concurrent/STM/TVar.hs

index b3695b6..d445493 100644 (file)
@@ -20,6 +20,9 @@ module Control.Concurrent.STM.TVar (
        readTVar,
        readTVarIO,
        writeTVar,
+       modifyTVar,
+       modifyTVar',
+       swapTVar,
 #ifdef __GLASGOW_HASKELL__
        registerDelay
 #endif
@@ -34,3 +37,32 @@ import Control.Sequential.STM
 #if ! (MIN_VERSION_base(4,2,0))
 readTVarIO = atomically . readTVar
 #endif
+
+
+-- Like 'modifyIORef' but for 'TVar'.
+-- | Mutate the contents of a 'TVar'. /N.B./, this version is
+-- non-strict.
+modifyTVar :: TVar a -> (a -> a) -> STM ()
+modifyTVar var f = do
+    x <- readTVar var
+    writeTVar var (f x)
+{-# INLINE modifyTVar #-}
+
+
+-- | Strict version of 'modifyTVar'.
+modifyTVar' :: TVar a -> (a -> a) -> STM ()
+modifyTVar' var f = do
+    x <- readTVar var
+    writeTVar var $! f x
+{-# INLINE modifyTVar' #-}
+
+
+-- Like 'swapTMVar' but for 'TVar'.
+-- | Swap the contents of a 'TVar' for a new value.
+swapTVar :: TVar a -> a -> STM a
+swapTVar var new = do
+    old <- readTVar var
+    writeTVar var new
+    return old
+{-# INLINE swapTVar #-}
+