[project @ 1998-01-26 11:04:18 by simonm]
[ghc-hetmet.git] / ghc / lib / glaExts / LazyST.lhs
index 91c3971..d18b716 100644 (file)
@@ -12,6 +12,7 @@ module LazyST (
 
        ST,
 
+       runST,
        unsafeInterleaveST,
 
         -- ST is one, so you'll likely need some Monad bits
@@ -20,8 +21,10 @@ module LazyST (
        ST.STRef,
        newSTRef, readSTRef, writeSTRef,
 
-       ST.STArray,
-       newSTArray, readSTArray, writeSTArray, Ix,
+       STArray,
+       newSTArray, readSTArray, writeSTArray, boundsSTArray, 
+       thawSTArray, freezeSTArray, unsafeFreezeSTArray, 
+       Ix,
 
        strictToLazyST, lazyToStrictST
     ) where
@@ -29,10 +32,11 @@ module LazyST (
 import qualified ST
 import qualified STBase
 import ArrBase
-import qualified Unsafe   ( unsafeInterleaveST )
+import qualified UnsafeST   ( unsafeInterleaveST )
 import PrelBase        ( Eq(..), Int, Bool, ($), ()(..) )
 import Monad
 import Ix
+import GHC
 
 newtype ST s a = ST (STBase.State s -> (a,STBase.State s))
 
@@ -48,6 +52,10 @@ instance Monad (ST s) where
              ST k_a = k r
            in
            k_a new_s
+
+-- ToDo: un-inline this, it could cause problems...
+runST :: (All s => ST s a) -> a
+runST st = case st of ST st -> let (r,_) = st (STBase.S# realWorld#) in r
 \end{code}
 
 %*********************************************************
@@ -98,8 +106,11 @@ unsafeFreezeSTArray (STArray arr) = strictToLazyST (unsafeFreezeArray arr)
 
 strictToLazyST :: STBase.ST s a -> ST s a
 strictToLazyST (STBase.ST m) = ST $ \s ->
-        let STBase.S# s# = s in
-       case m s# of { STBase.STret s2# r -> (r, STBase.S# s2#) }
+        let 
+           STBase.S# s# = s
+           STBase.STret s2# r = m s# 
+       in
+       (r, STBase.S# s2#)
 
 lazyToStrictST :: ST s a -> STBase.ST s a
 lazyToStrictST (ST m) = STBase.ST $ \s ->