diff options
Diffstat (limited to 'libraries/base/Control/Monad/ST.hs')
-rw-r--r-- | libraries/base/Control/Monad/ST.hs | 73 |
1 files changed, 28 insertions, 45 deletions
diff --git a/libraries/base/Control/Monad/ST.hs b/libraries/base/Control/Monad/ST.hs index 397b072533..0508b6e50f 100644 --- a/libraries/base/Control/Monad/ST.hs +++ b/libraries/base/Control/Monad/ST.hs @@ -1,11 +1,14 @@ -{-# LANGUAGE CPP #-} +{-# LANGUAGE CPP, SafeImports #-} +#if sh_SAFE_DEFAULT +{-# LANGUAGE Safe #-} +#endif ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.ST -- Copyright : (c) The University of Glasgow 2001 -- License : BSD-style (see the file libraries/base/LICENSE) --- +-- -- Maintainer : libraries@haskell.org -- Stability : experimental -- Portability : non-portable (requires universal quantification for runST) @@ -16,55 +19,35 @@ -- ----------------------------------------------------------------------------- -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 - - -- * 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 - -#if defined(__GLASGOW_HASKELL__) -import Control.Monad.Fix () -#else -import Control.Monad.Fix +module Control.Monad.ST ( + module Control.Monad.ST.Safe +#if !sh_SAFE_DEFAULT + -- * Unsafe Functions + , unsafeInterleaveST + , unsafeIOToST + , unsafeSTToIO #endif + ) where -#include "Typeable.h" +import safe Control.Monad.ST.Safe -#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") +#if !sh_SAFE_DEFAULT +import qualified Control.Monad.ST.Unsafe as U -fixST :: (a -> ST s a) -> ST s a -fixST f = LazyST.lazyToStrictST (LazyST.fixST (LazyST.strictToLazyST . f)) +{-# DEPRECATED unsafeInterleaveST, unsafeIOToST, unsafeSTToIO + "Please import from Control.Monad.ST.Unsafe instead; This will be removed in the next release" + #-} +{-# INLINE unsafeInterleaveST #-} unsafeInterleaveST :: ST s a -> ST s a -unsafeInterleaveST = - LazyST.lazyToStrictST . LazyST.unsafeInterleaveST . LazyST.strictToLazyST -#endif +unsafeInterleaveST = U.unsafeInterleaveST + +{-# INLINE unsafeIOToST #-} +unsafeIOToST :: IO a -> ST s a +unsafeIOToST = U.unsafeIOToST -#if !defined(__GLASGOW_HASKELL__) -instance MonadFix (ST s) where - mfix = fixST +{-# INLINE unsafeSTToIO #-} +unsafeSTToIO :: ST s a -> IO a +unsafeSTToIO = U.unsafeSTToIO #endif |