Add unsafeInline*
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 18 Apr 2010 15:29:22 +0000 (15:29 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Sun, 18 Apr 2010 15:29:22 +0000 (15:29 +0000)
Control/Monad/Primitive.hs

index 259217f..2e0fc2a 100644 (file)
 module Control.Monad.Primitive (
   PrimMonad(..), RealWorld, primitive_,
   primToPrim, primToIO, primToST,
-  unsafePrimToPrim, unsafePrimToIO, unsafePrimToST
+  unsafePrimToPrim, unsafePrimToIO, unsafePrimToST,
+  unsafeInlinePrim, unsafeInlineIO, unsafeInlineST
 ) where
 
 import GHC.Prim   ( State#, RealWorld )
-import GHC.Base   ( unsafeCoerce# )
+import GHC.Base   ( unsafeCoerce#, realWorld# )
 import GHC.IOBase ( IO(..) )
 import GHC.ST     ( ST(..) )
 
@@ -77,3 +78,15 @@ unsafePrimToST = unsafePrimToPrim
 unsafePrimToIO :: PrimMonad m => m a -> IO a
 unsafePrimToIO = unsafePrimToPrim
 
+unsafeInlinePrim :: PrimMonad m => m a -> a
+{-# INLINE unsafeInlinePrim #-}
+unsafeInlinePrim m = unsafeInlineIO (unsafePrimToIO m)
+
+unsafeInlineIO :: IO a -> a
+{-# INLINE unsafeInlineIO #-}
+unsafeInlineIO m = case internal m realWorld# of (# _, r #) -> r
+
+unsafeInlineST :: ST s a -> a
+{-# INLINE unsafeInlineST #-}
+unsafeInlineST = unsafeInlinePrim
+