1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
------------------------------------------------------------------------------
-- | Author : Michael Hanus
--   Version: January 2017
--
-- This library provides mutable references in the IO monad.
------------------------------------------------------------------------------
{-# LANGUAGE CPP #-}

module Data.IORef
  (
    IORef, newIORef, readIORef, writeIORef, modifyIORef
  ) where

-- | Mutable variables containing values of some type.
-- The values are not evaluated when they are assigned to an IORef.

data IORef a = IORef a -- precise structure internally defined




-- | Creates a new IORef with an initial value.
newIORef :: a -> IO (IORef a)
newIORef external

-- | Reads the current value of an IORef.
readIORef :: IORef a -> IO a
readIORef ref = prim_readIORef $# ref

prim_readIORef :: IORef a -> IO a
prim_readIORef external

-- | Updates the value of an IORef.
writeIORef :: IORef a -> a -> IO ()
writeIORef ref val = (prim_writeIORef $# ref) val

prim_writeIORef :: IORef a -> a -> IO ()
prim_writeIORef external

-- | Modify the value of an IORef.
modifyIORef :: IORef a -> (a -> a) -> IO ()
modifyIORef ref f = readIORef ref >>= writeIORef ref . f