ST,
+ runST,
unsafeInterleaveST,
-- ST is one, so you'll likely need some Monad bits
ST.STRef,
newSTRef, readSTRef, writeSTRef,
- ST.STArray,
- newSTArray, readSTArray, writeSTArray, Ix,
+ STArray,
+ newSTArray, readSTArray, writeSTArray, boundsSTArray,
+ thawSTArray, freezeSTArray, unsafeFreezeSTArray,
+ Ix,
strictToLazyST, lazyToStrictST
) where
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))
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}
%*********************************************************
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 ->