2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[module_ST]{The State Transformer Monad, @ST@}
7 {-# OPTIONS -fno-implicit-prelude #-}
13 runST, -- :: (All s => ST s a) -> a
14 fixST, -- :: (a -> ST s a) -> ST s a
18 -- ST is one, so you'll likely need some Monad bits
22 newSTRef, readSTRef, writeSTRef,
25 newSTArray, readSTArray, writeSTArray, boundsSTArray,
26 thawSTArray, freezeSTArray, unsafeFreezeSTArray,
32 import Unsafe ( unsafeInterleaveST )
34 import PrelBase ( Eq(..), Int, Bool, ($), ()(..) )
40 %*********************************************************
42 \subsection{Variables}
44 %*********************************************************
47 newtype STRef s a = STRef (MutableVar s a)
50 newSTRef :: a -> ST s (STRef s a)
51 newSTRef v = newVar v >>= \ var -> return (STRef var)
53 readSTRef :: STRef s a -> ST s a
54 readSTRef (STRef var) = readVar var
56 writeSTRef :: STRef s a -> a -> ST s ()
57 writeSTRef (STRef var) v = writeVar var v
60 %*********************************************************
64 %*********************************************************
67 newtype STArray s ix elt = STArray (MutableArray s ix elt)
70 newSTArray :: Ix ix => (ix,ix) -> elt -> ST s (STArray s ix elt)
71 writeSTArray :: Ix ix => STArray s ix elt -> ix -> elt -> ST s ()
72 readSTArray :: Ix ix => STArray s ix elt -> ix -> ST s elt
73 boundsSTArray :: Ix ix => STArray s ix elt -> (ix, ix)
74 thawSTArray :: Ix ix => Array ix elt -> ST s (STArray s ix elt)
75 freezeSTArray :: Ix ix => STArray s ix elt -> ST s (Array ix elt)
76 unsafeFreezeSTArray :: Ix ix => STArray s ix elt -> ST s (Array ix elt)
79 newArray ixs elt >>= \arr ->
82 boundsSTArray (STArray arr) = boundsOfArray arr
84 readSTArray (STArray arr) ix = readArray arr ix
86 writeSTArray (STArray arr) ix elt = writeArray arr ix elt
88 thawSTArray arr = thawArray arr >>= \starr -> return (STArray starr)
90 freezeSTArray (STArray arr) = freezeArray arr
92 unsafeFreezeSTArray (STArray arr) = unsafeFreezeArray arr