summaryrefslogtreecommitdiff
path: root/libraries/base/Control/Monad/ST.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/Control/Monad/ST.hs')
-rw-r--r--libraries/base/Control/Monad/ST.hs73
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