238f71335935e809c9fc7d28bc89fc396908456d
[ghc-hetmet.git] / ghc / lib / exts / ST.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
3 %
4 \section[module_ST]{The State Transformer Monad, @ST@}
5
6 \begin{code}
7 {-# OPTIONS -fno-implicit-prelude #-}
8
9 module ST (
10
11         ST,
12
13         runST,                          -- :: (All s => ST s a) -> a
14         fixST,                          -- :: (a -> ST s a) -> ST s a
15
16         unsafeInterleaveST,
17
18         -- ST is one, so you'll likely need some Monad bits
19         module Monad,
20
21         STRef,
22         newSTRef, readSTRef, writeSTRef,
23
24         STArray,
25         newSTArray, readSTArray, writeSTArray, boundsSTArray, 
26         thawSTArray, freezeSTArray, unsafeFreezeSTArray, 
27         Ix
28
29     ) where
30
31 import PrelArr
32 import PrelST
33 import PrelBase ( Eq(..), Int, Bool, ($), ()(..) )
34 import Monad
35 import Ix
36
37 \end{code}
38
39 %*********************************************************
40 %*                                                      *
41 \subsection{Variables}
42 %*                                                      *
43 %*********************************************************
44
45 \begin{code}
46 newtype STRef s a = STRef (MutableVar s a) 
47     deriving Eq
48
49 newSTRef :: a -> ST s (STRef s a)
50 newSTRef v = newVar v >>= \ var -> return (STRef var)
51
52 readSTRef :: STRef s a -> ST s a
53 readSTRef (STRef var) = readVar var
54
55 writeSTRef :: STRef s a -> a -> ST s ()
56 writeSTRef (STRef var) v = writeVar var v
57 \end{code}
58
59 %*********************************************************
60 %*                                                      *
61 \subsection{Arrays}
62 %*                                                      *
63 %*********************************************************
64
65 \begin{code}
66 newtype STArray s ix elt = STArray (MutableArray s ix elt)
67     deriving Eq
68
69 newSTArray              :: Ix ix => (ix,ix) -> elt -> ST s (STArray s ix elt)
70 writeSTArray            :: Ix ix => STArray s ix elt -> ix -> elt -> ST s () 
71 readSTArray             :: Ix ix => STArray s ix elt -> ix -> ST s elt 
72 boundsSTArray           :: Ix ix => STArray s ix elt -> (ix, ix)  
73 thawSTArray             :: Ix ix => Array ix elt -> ST s (STArray s ix elt)
74 freezeSTArray           :: Ix ix => STArray s ix elt -> ST s (Array ix elt)
75 unsafeFreezeSTArray     :: Ix ix => STArray s ix elt -> ST s (Array ix elt)
76
77 newSTArray ixs elt = 
78     newArray ixs elt >>= \arr -> 
79     return (STArray arr)
80
81 boundsSTArray (STArray arr) = boundsOfArray arr
82
83 readSTArray (STArray arr) ix = readArray arr ix
84
85 writeSTArray (STArray arr) ix elt = writeArray arr ix elt
86
87 thawSTArray arr = thawArray arr >>= \starr -> return (STArray starr)
88
89 freezeSTArray (STArray arr) = freezeArray arr
90
91 unsafeFreezeSTArray (STArray arr) = unsafeFreezeArray arr
92 \end{code}
93