Add stateTVar which I've found very helpful to cut boilerplate with
authorXimin Luo <ximin@dfinity.org>
Tue, 26 Jun 2018 18:27:18 +0000 (11:27 -0700)
committerHerbert Valerio Riedel <hvr@gnu.org>
Tue, 18 Sep 2018 15:47:21 +0000 (17:47 +0200)
Control/Concurrent/STM/TVar.hs

index ca8c7fb..abd4fd2 100644 (file)
@@ -28,6 +28,7 @@ module Control.Concurrent.STM.TVar (
         writeTVar,
         modifyTVar,
         modifyTVar',
+        stateTVar,
         swapTVar,
 #ifdef __GLASGOW_HASKELL__
         registerDelay,
@@ -65,6 +66,18 @@ modifyTVar' var f = do
 {-# INLINE modifyTVar' #-}
 
 
+-- |
+-- Like 'modifyTVar'' but the function is a simple state transition that can
+-- return a side value which is passed on as the result of the 'STM'.
+stateTVar :: TVar s -> (s -> (a, s)) -> STM a
+stateTVar var f = do
+   s <- readTVar var
+   let (a, s') = f s -- since we destructure this, we are strict in f
+   writeTVar var s'
+   return a
+{-# INLINE stateTVar #-}
+
+
 -- Like 'swapTMVar' but for 'TVar'.
 -- | Swap the contents of a 'TVar' for a new value.
 --