X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FMonad%2FST.hs;h=397b07253343f84f0367ffc257e3ee30be861b75;hb=41e8fba828acbae1751628af50849f5352b27873;hp=5ea105224babbd25198d67fa10cbb38cd154f694;hpb=037da109abc1f2fa1b33cf441663039751eaae46;p=ghc-base.git diff --git a/Control/Monad/ST.hs b/Control/Monad/ST.hs index 5ea1052..397b072 100644 --- a/Control/Monad/ST.hs +++ b/Control/Monad/ST.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE CPP #-} + ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.ST @@ -10,36 +12,48 @@ -- -- This library provides support for /strict/ state threads, as -- described in the PLDI \'94 paper by John Launchbury and Simon Peyton --- Jones /Lazy State Threads/. +-- Jones /Lazy Functional State Threads/. -- ----------------------------------------------------------------------------- module Control.Monad.ST ( - -- * The 'ST' Monad - ST, -- abstract, instance of Functor, Monad, Typeable. - runST, -- :: (forall s. ST s a) -> a - fixST, -- :: (a -> ST s a) -> ST s a + -- * The 'ST' Monad + ST, -- abstract, instance of Functor, Monad, Typeable. + runST, -- :: (forall s. ST s a) -> a + fixST, -- :: (a -> ST s a) -> ST s a - -- * Converting 'ST' to 'IO' - RealWorld, -- abstract - stToIO, -- :: ST RealWorld a -> IO a + -- * Converting 'ST' to 'IO' + RealWorld, -- abstract + stToIO, -- :: ST RealWorld a -> IO a - -- * Unsafe operations - unsafeInterleaveST, -- :: ST s a -> ST s a - unsafeIOToST -- :: IO a -> ST s a + -- * Unsafe operations + unsafeInterleaveST, -- :: ST s a -> ST s a + unsafeIOToST, -- :: IO a -> ST s a + unsafeSTToIO -- :: ST s a -> IO a ) where -import Prelude - +#if defined(__GLASGOW_HASKELL__) +import Control.Monad.Fix () +#else import Control.Monad.Fix -import Data.Typeable +#endif #include "Typeable.h" -#ifdef __HUGS__ +#if defined(__GLASGOW_HASKELL__) +import GHC.ST ( ST, runST, fixST, unsafeInterleaveST ) +import GHC.Base ( RealWorld ) +import GHC.IO ( stToIO, unsafeIOToST, unsafeSTToIO ) +#elif defined(__HUGS__) +import Data.Typeable import Hugs.ST import qualified Hugs.LazyST as LazyST +#endif + +#if defined(__HUGS__) +INSTANCE_TYPEABLE2(ST,sTTc,"ST") +INSTANCE_TYPEABLE0(RealWorld,realWorldTc,"RealWorld") fixST :: (a -> ST s a) -> ST s a fixST f = LazyST.lazyToStrictST (LazyST.fixST (LazyST.strictToLazyST . f)) @@ -49,22 +63,8 @@ unsafeInterleaveST = LazyST.lazyToStrictST . LazyST.unsafeInterleaveST . LazyST.strictToLazyST #endif -#ifdef __GLASGOW_HASKELL__ -import GHC.ST -import GHC.Base ( unsafeCoerce#, RealWorld ) -import GHC.IOBase ( IO(..), stToIO ) - --- This relies on IO and ST having the same representation modulo the --- constraint on the type of the state --- -unsafeIOToST :: IO a -> ST s a -unsafeIOToST (IO io) = ST $ \ s -> (unsafeCoerce# io) s -#endif - +#if !defined(__GLASGOW_HASKELL__) instance MonadFix (ST s) where - mfix = fixST - --- --------------------------------------------------------------------------- --- Typeable instance + mfix = fixST +#endif -INSTANCE_TYPEABLE2(ST,sTTc,"ST")