Copyright | (c) Nicolas Pouillard 2009-2017 |
---|---|
License | BSD3 |
Maintainer | Nicolas Pouillard <nicolas.pouillard@gmail.com> |
Stability | provisional |
Safe Haskell | None |
Language | Haskell98 |
- data IORef a :: * -> *
- newIORef :: NFData sa => sa -> SIO (IORef sa)
- readIORef :: IORef a -> SIO a
- writeIORef :: NFData sa => IORef sa -> sa -> SIO ()
- modifyIORef :: NFData sa => IORef sa -> (sa -> sa) -> SIO ()
- atomicModifyIORef :: (NFData sa, NFData sb) => IORef sa -> (sa -> (sa, sb)) -> SIO sb
- mkWeakIORef :: IORef a -> SIO () -> SIO (Weak (IORef a))
Documentation
A mutable variable in the IO
monad
newIORef :: NFData sa => sa -> SIO (IORef sa) Source #
Build a new IORef
, but deeply force the value before storing it.
writeIORef :: NFData sa => IORef sa -> sa -> SIO () Source #
Deeply force a value and write it into an IORef
modifyIORef :: NFData sa => IORef sa -> (sa -> sa) -> SIO () Source #
Mutate the contents of an IORef
atomicModifyIORef :: (NFData sa, NFData sb) => IORef sa -> (sa -> (sa, sb)) -> SIO sb Source #
Atomically modifies the contents of an IORef
.
This function is useful for using IORef
in a safe way in a multithreaded program.
If you only have one IORef
, then using atomicModifyIORef
to access and modify
it will prevent race conditions.
Extending the atomicity to multiple IORef
s is problematic, so it is recommended that
if you need to do anything more complicated then using Control.Concurrent.MVar.MVar
instead is a good idea.
Internally this function is using Data.IORef.atomicModifyIORef'
.