2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[module_ST]{The State Transformer Monad, @ST@}
10 import IOBase ( error ) -- [Source not needed]
13 import PrelBase ( Int, Bool, ($), ()(..) )
14 import GHC ( newArray#, readArray#, writeArray#, sameMutableArray# )
17 %*********************************************************
19 \subsection{Variables}
21 %*********************************************************
24 type MutableVar s a = MutableArray s Int a
26 newVar :: a -> ST s (MutableVar s a)
27 readVar :: MutableVar s a -> ST s a
28 writeVar :: MutableVar s a -> a -> ST s ()
29 sameVar :: MutableVar s a -> MutableVar s a -> Bool
31 newVar init = ST $ \ (S# s#) ->
32 case (newArray# 1# init s#) of { StateAndMutableArray# s2# arr# ->
33 (MutableArray vAR_IXS arr#, S# s2#) }
35 vAR_IXS = error "newVar: Shouldn't access `bounds' of a MutableVar\n"
37 readVar (MutableArray _ var#) = ST $ \ (S# s#) ->
38 case readArray# var# 0# s# of { StateAndPtr# s2# r ->
41 writeVar (MutableArray _ var#) val = ST $ \ (S# s#) ->
42 case writeArray# var# 0# val s# of { s2# ->
45 sameVar (MutableArray _ var1#) (MutableArray _ var2#)
46 = sameMutableArray# var1# var2#
51 sameMutableArray :: MutableArray s ix elt -> MutableArray s ix elt -> Bool
52 sameMutableByteArray :: MutableByteArray s ix -> MutableByteArray s ix -> Bool
54 sameMutableArray (MutableArray _ arr1#) (MutableArray _ arr2#)
55 = sameMutableArray# arr1# arr2#
57 sameMutableByteArray (MutableByteArray _ arr1#) (MutableByteArray _ arr2#)
58 = sameMutableByteArray# arr1# arr2#