-- | This module extends "Data.IORef" with operations forcing the value written to the IORef. -- Some of these functions are available in later versions of GHC, but not all. module Data.IORef.Extra( module Data.IORef, writeIORef', atomicWriteIORef', atomicModifyIORef_, atomicModifyIORef'_ ) where import Data.IORef import Control.Exception -- | Evaluates the value before calling 'writeIORef'. writeIORef' :: IORef a -> a -> IO () writeIORef' ref x = do evaluate x writeIORef ref x -- | Evaluates the value before calling 'atomicWriteIORef'. atomicWriteIORef' :: IORef a -> a -> IO () atomicWriteIORef' ref x = do evaluate x atomicWriteIORef ref x -- | Variant of 'atomicModifyIORef' which ignores the return value atomicModifyIORef_ :: IORef a -> (a -> a) -> IO () atomicModifyIORef_ r f = atomicModifyIORef r $ \v -> (f v, ()) -- | Variant of 'atomicModifyIORef'' which ignores the return value atomicModifyIORef'_ :: IORef a -> (a -> a) -> IO () atomicModifyIORef'_ r f = atomicModifyIORef' r $ \v -> (f v, ())