summaryrefslogtreecommitdiff
path: root/compiler/GHC/Data/IOEnv.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Data/IOEnv.hs')
-rw-r--r--compiler/GHC/Data/IOEnv.hs8
1 files changed, 7 insertions, 1 deletions
diff --git a/compiler/GHC/Data/IOEnv.hs b/compiler/GHC/Data/IOEnv.hs
index 439f101ecc..850d111818 100644
--- a/compiler/GHC/Data/IOEnv.hs
+++ b/compiler/GHC/Data/IOEnv.hs
@@ -29,7 +29,7 @@ module GHC.Data.IOEnv (
tryM, tryAllM, tryMostM, fixM,
-- I/O operations
- IORef, newMutVar, readMutVar, writeMutVar, updMutVar,
+ IORef, newMutVar, readMutVar, writeMutVar, updMutVar, updMutVarM,
atomicUpdMutVar, atomicUpdMutVar'
) where
@@ -193,6 +193,12 @@ readMutVar var = liftIO (readIORef var)
updMutVar :: IORef a -> (a -> a) -> IOEnv env ()
updMutVar var upd = liftIO (modifyIORef var upd)
+updMutVarM :: IORef a -> (a -> IOEnv env a) -> IOEnv env ()
+updMutVarM ref upd
+ = do { contents <- liftIO $ readIORef ref
+ ; new_contents <- upd contents
+ ; liftIO $ writeIORef ref new_contents }
+
-- | Atomically update the reference. Does not force the evaluation of the
-- new variable contents. For strict update, use 'atomicUpdMutVar''.
atomicUpdMutVar :: IORef a -> (a -> (a, b)) -> IOEnv env b