From 0fafbcb0fa66573de86c23855db77437d0ffebe8 Mon Sep 17 00:00:00 2001
From: sof <unknown>
Date: Mon, 20 Sep 1999 10:22:40 +0000
Subject: [PATCH] [project @ 1999-09-20 10:22:40 by sof] Added 'updateIORef ::
 IORef a -> (a->a) -> IO ()'

---
 ghc/lib/exts/IOExts.lhs | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/ghc/lib/exts/IOExts.lhs b/ghc/lib/exts/IOExts.lhs
index a0de1cc21240..0ee5a505b7ef 100644
--- a/ghc/lib/exts/IOExts.lhs
+++ b/ghc/lib/exts/IOExts.lhs
@@ -22,6 +22,7 @@ module IOExts
         , newIORef
         , readIORef
         , writeIORef
+	, updateIORef
 
 	, mkWeakIORef
 
@@ -106,9 +107,9 @@ unsafePtrEq a b =
 \end{code}
 
 \begin{code}
-newIORef   :: a -> IO (IORef a)
-readIORef  :: IORef a -> IO a
-writeIORef :: IORef a -> a -> IO ()
+newIORef    :: a -> IO (IORef a)
+readIORef   :: IORef a -> IO a
+writeIORef  :: IORef a -> a -> IO ()
 
 #ifdef __HUGS__
 type IORef a = STRef RealWorld a
@@ -124,6 +125,13 @@ readIORef  (IORef var) = stToIO (readVar var)
 writeIORef (IORef var) v = stToIO (writeVar var v)
 #endif
 
+updateIORef :: IORef a -> (a -> a) -> IO ()
+updateIORef ref f = do
+  x <- readIORef ref
+  let x' = f x
+  writeIORef ref x'
+  -- or should we return new value ? (or old?)
+
 mkWeakIORef :: IORef a -> IO () -> IO (Weak (IORef a))
 mkWeakIORef r@(IORef (MutableVar r#)) f = IO $ \s ->
   case mkWeak# r# r f s of (# s1, w #) -> (# s1, Weak w #)
-- 
GitLab