X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FMonad%2FST.hs;h=4260d0e86eef10b5c78938a97a8f36864010dcb7;hb=8afc9fecd586d3c4f7ef9c69fb1686a79e5f441d;hp=02d8d15d76530ec9f2d85f4a6d2370db1e71d568;hpb=746ef6a7fd71bb1e9ebe3cd107c5f9f79f3b7a68;p=ghc-base.git diff --git a/Control/Monad/ST.hs b/Control/Monad/ST.hs index 02d8d15..4260d0e 100644 --- a/Control/Monad/ST.hs +++ b/Control/Monad/ST.hs @@ -1,56 +1,63 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.ST -- Copyright : (c) The University of Glasgow 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : experimental -- Portability : non-portable (requires universal quantification for runST) -- --- The State Transformer Monad, ST +-- This library provides support for /strict/ state threads, as +-- described in the PLDI \'94 paper by John Launchbury and Simon Peyton +-- Jones /Lazy Functional State Threads/. -- ----------------------------------------------------------------------------- module Control.Monad.ST - ( - ST -- abstract, instance of Functor, Monad, Typeable. - , runST -- :: (forall s. ST s a) -> a - , fixST -- :: (a -> ST s a) -> ST s a - , unsafeInterleaveST -- :: 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 + + -- * Unsafe operations + unsafeInterleaveST, -- :: ST s a -> ST s a + unsafeIOToST, -- :: IO a -> ST s a + unsafeSTToIO -- :: ST s a -> IO a + ) where - , unsafeIOToST -- :: IO a -> ST s a +import Control.Monad.Fix - , RealWorld -- abstract - , stToIO -- :: ST RealWorld a -> IO a - ) where +#include "Typeable.h" -import Prelude +#ifdef __HUGS__ +import Data.Typeable +import Hugs.ST +import qualified Hugs.LazyST as LazyST -import Control.Monad.Fix -import Data.Dynamic +INSTANCE_TYPEABLE2(ST,sTTc,"ST") +INSTANCE_TYPEABLE0(RealWorld,realWorldTc,"RealWorld") -#ifdef __GLASGOW_HASKELL__ -import GHC.ST -import GHC.Base ( unsafeCoerce#, RealWorld ) -import GHC.IOBase ( IO(..), stToIO ) +fixST :: (a -> ST s a) -> ST s a +fixST f = LazyST.lazyToStrictST (LazyST.fixST (LazyST.strictToLazyST . f)) --- 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 +unsafeInterleaveST :: ST s a -> ST s a +unsafeInterleaveST = + LazyST.lazyToStrictST . LazyST.unsafeInterleaveST . LazyST.strictToLazyST #endif -instance MonadFix (ST s) where - mfix = fixST - --- --------------------------------------------------------------------------- --- Typeable instance +#ifdef __GLASGOW_HASKELL__ +import GHC.ST ( ST, runST, fixST, unsafeInterleaveST ) +import GHC.Base ( RealWorld ) +import GHC.IO ( stToIO, unsafeIOToST, unsafeSTToIO ) +#endif -sTTc :: TyCon -sTTc = mkTyCon "ST" +instance MonadFix (ST s) where + mfix = fixST -instance (Typeable a, Typeable b) => Typeable (ST a b) where - typeOf st = mkAppTy sTTc [typeOf ((undefined :: ST a b -> a) st), - typeOf ((undefined :: ST a b -> b) st)]