2777fe4a8aad718a9d55c4bf891ea003b4e60f7e
[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 PrelUnsafeST
33 import PrelST
34 import PrelBase ( Eq(..), Int, Bool, ($), ()(..) )
35 import Monad
36 import Ix
37
38 \end{code}
39
40 %*********************************************************
41 %*                                                      *
42 \subsection{Variables}
43 %*                                                      *
44 %*********************************************************
45
46 \begin{code}
47 newtype STRef s a = STRef (MutableVar s a) 
48     deriving Eq
49
50 newSTRef :: a -> ST s (STRef s a)
51 newSTRef v = newVar v >>= \ var -> return (STRef var)
52
53 readSTRef :: STRef s a -> ST s a
54 readSTRef (STRef var) = readVar var
55
56 writeSTRef :: STRef s a -> a -> ST s ()
57 writeSTRef (STRef var) v = writeVar var v
58 \end{code}
59
60 %*********************************************************
61 %*                                                      *
62 \subsection{Arrays}
63 %*                                                      *
64 %*********************************************************
65
66 \begin{code}
67 newtype STArray s ix elt = STArray (MutableArray s ix elt)
68     deriving Eq
69
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)
77
78 newSTArray ixs elt = 
79     newArray ixs elt >>= \arr -> 
80     return (STArray arr)
81
82 boundsSTArray (STArray arr) = boundsOfArray arr
83
84 readSTArray (STArray arr) ix = readArray arr ix
85
86 writeSTArray (STArray arr) ix elt = writeArray arr ix elt
87
88 thawSTArray arr = thawArray arr >>= \starr -> return (STArray starr)
89
90 freezeSTArray (STArray arr) = freezeArray arr
91
92 unsafeFreezeSTArray (STArray arr) = unsafeFreezeArray arr
93 \end{code}
94