{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UnboxedTuples #-}
module Control.Prim.Monad.Unsafe
( unsafePrim
, unsafePrim_
, unsafePrimBase
, unsafePrimBase_
, unsafePrimBaseToPrim
, unsafePrimBaseToIO
, unsafePrimBaseToST
, unsafeIOToPrim
, unsafeSTToPrim
, unsafeLiftPrimBase
, noDuplicatePrim
, unsafeDupablePerformPrimBase
, unsafeInlineIO
, unsafeInlineST
, unsafeInlinePrimBase
, unsafeInterleavePrimBase
, unsafeDupableInterleavePrimBase
, unsafePerformIO
, unsafeDupablePerformIO
, unsafeInterleaveIO
, unsafeDupableInterleaveIO
) where
import System.IO.Unsafe
import Control.Prim.Monad.Internal
import GHC.IO
import GHC.Exts
unsafePrim :: MonadPrim s m => (State# s' -> (# State# s', a #)) -> m a
unsafePrim :: (State# s' -> (# State# s', a #)) -> m a
unsafePrim State# s' -> (# State# s', a #)
m = (State# s -> (# State# s, a #)) -> m a
forall s (m :: * -> *) a.
MonadPrim s m =>
(State# s -> (# State# s, a #)) -> m a
prim ((State# s' -> (# State# s', a #)) -> State# s -> (# State# s, a #)
unsafeCoerce# State# s' -> (# State# s', a #)
m)
{-# INLINE unsafePrim #-}
unsafePrim_ :: MonadPrim s m => (State# s' -> State# s') -> m ()
unsafePrim_ :: (State# s' -> State# s') -> m ()
unsafePrim_ State# s' -> State# s'
m = (State# s -> State# s) -> m ()
forall s (m :: * -> *).
MonadPrim s m =>
(State# s -> State# s) -> m ()
prim_ ((State# s' -> State# s') -> State# s -> State# s
unsafeCoerce# State# s' -> State# s'
m)
{-# INLINE unsafePrim_ #-}
unsafePrimBase :: MonadPrimBase s' m => m a -> State# s -> (# State# s, a #)
unsafePrimBase :: m a -> State# s -> (# State# s, a #)
unsafePrimBase m a
m = (State# s' -> (# State# s', a #)) -> State# s -> (# State# s, a #)
unsafeCoerce# (m a -> State# s' -> (# State# s', a #)
forall s (m :: * -> *) a.
MonadPrimBase s m =>
m a -> State# s -> (# State# s, a #)
primBase m a
m)
{-# INLINE unsafePrimBase #-}
unsafePrimBase_ :: MonadPrimBase s' m => m () -> State# s -> State# s
unsafePrimBase_ :: m () -> State# s -> State# s
unsafePrimBase_ m ()
m = (State# s' -> State# s') -> State# s -> State# s
unsafeCoerce# (m () -> State# s' -> State# s'
forall s (m :: * -> *).
MonadPrimBase s m =>
m () -> State# s -> State# s
primBase_ m ()
m)
{-# INLINE unsafePrimBase_ #-}
unsafePrimBaseToPrim :: (MonadPrimBase sn n, MonadPrim sm m) => n a -> m a
unsafePrimBaseToPrim :: n a -> m a
unsafePrimBaseToPrim n a
m = (State# sm -> (# State# sm, a #)) -> m a
forall s (m :: * -> *) a.
MonadPrim s m =>
(State# s -> (# State# s, a #)) -> m a
prim ((State# sn -> (# State# sn, a #))
-> State# sm -> (# State# sm, a #)
unsafeCoerce# (n a -> State# sn -> (# State# sn, a #)
forall s (m :: * -> *) a.
MonadPrimBase s m =>
m a -> State# s -> (# State# s, a #)
primBase n a
m))
{-# INLINE unsafePrimBaseToPrim #-}
unsafePrimBaseToST :: MonadPrimBase sm m => m a -> ST s a
unsafePrimBaseToST :: m a -> ST s a
unsafePrimBaseToST = m a -> ST s a
forall sn (n :: * -> *) sm (m :: * -> *) a.
(MonadPrimBase sn n, MonadPrim sm m) =>
n a -> m a
unsafePrimBaseToPrim
{-# INLINE unsafePrimBaseToST #-}
unsafePrimBaseToIO :: MonadPrimBase s m => m a -> IO a
unsafePrimBaseToIO :: m a -> IO a
unsafePrimBaseToIO = m a -> IO a
forall sn (n :: * -> *) sm (m :: * -> *) a.
(MonadPrimBase sn n, MonadPrim sm m) =>
n a -> m a
unsafePrimBaseToPrim
{-# INLINE unsafePrimBaseToIO #-}
unsafeIOToPrim :: MonadPrim s m => IO a -> m a
unsafeIOToPrim :: IO a -> m a
unsafeIOToPrim = IO a -> m a
forall sn (n :: * -> *) sm (m :: * -> *) a.
(MonadPrimBase sn n, MonadPrim sm m) =>
n a -> m a
unsafePrimBaseToPrim
{-# INLINE unsafeIOToPrim #-}
unsafeSTToPrim :: MonadPrim s' m => ST s a -> m a
unsafeSTToPrim :: ST s a -> m a
unsafeSTToPrim = ST s a -> m a
forall sn (n :: * -> *) sm (m :: * -> *) a.
(MonadPrimBase sn n, MonadPrim sm m) =>
n a -> m a
unsafePrimBaseToPrim
{-# INLINE unsafeSTToPrim #-}
noDuplicatePrim :: MonadPrim s m => m ()
#if __GLASGOW_HASKELL__ >= 802
noDuplicatePrim :: m ()
noDuplicatePrim = (State# s -> State# s) -> m ()
forall s (m :: * -> *).
MonadPrim s m =>
(State# s -> State# s) -> m ()
prim_ State# s -> State# s
forall d. State# d -> State# d
noDuplicate#
#else
noDuplicatePrim = unsafeIOToPrim $ prim_ noDuplicate#
#endif
unsafeDupablePerformPrimBase :: MonadPrimBase s m => m a -> a
unsafeDupablePerformPrimBase :: m a -> a
unsafeDupablePerformPrimBase m a
m = IO a -> a
forall a. IO a -> a
unsafeDupablePerformIO (m a -> IO a
forall s (m :: * -> *) a. MonadPrimBase s m => m a -> IO a
unsafePrimBaseToIO m a
m)
unsafeInlineIO :: IO a -> a
unsafeInlineIO :: IO a -> a
unsafeInlineIO (IO State# RealWorld -> (# State# RealWorld, a #)
m) = case State# RealWorld -> (# State# RealWorld, a #)
m State# RealWorld
realWorld# of (# State# RealWorld
_, a
r #) -> a
r
{-# INLINE unsafeInlineIO #-}
unsafeInlineST :: ST s a -> a
unsafeInlineST :: ST s a -> a
unsafeInlineST = ST s a -> a
forall s (m :: * -> *) a. MonadPrimBase s m => m a -> a
unsafeInlinePrimBase
{-# INLINE unsafeInlineST #-}
unsafeInlinePrimBase :: MonadPrimBase s m => m a -> a
unsafeInlinePrimBase :: m a -> a
unsafeInlinePrimBase m a
m = IO a -> a
forall a. IO a -> a
unsafeInlineIO (m a -> IO a
forall s (m :: * -> *) a. MonadPrimBase s m => m a -> IO a
unsafePrimBaseToIO m a
m)
{-# INLINE unsafeInlinePrimBase #-}
unsafeInterleavePrimBase :: MonadPrimBase s m => m a -> m a
unsafeInterleavePrimBase :: m a -> m a
unsafeInterleavePrimBase m a
x = m a -> m a
forall s (m :: * -> *) a. MonadPrimBase s m => m a -> m a
unsafeDupableInterleavePrimBase (m ()
forall s (m :: * -> *). MonadPrim s m => m ()
noDuplicatePrim m () -> m a -> m a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m a
x)
{-# INLINE unsafeInterleavePrimBase #-}
unsafeDupableInterleavePrimBase :: MonadPrimBase s m => m a -> m a
unsafeDupableInterleavePrimBase :: m a -> m a
unsafeDupableInterleavePrimBase m a
x =
(State# s -> (# State# s, a #)) -> m a
forall s (m :: * -> *) a.
MonadPrim s m =>
(State# s -> (# State# s, a #)) -> m a
prim ((State# s -> (# State# s, a #)) -> m a)
-> (State# s -> (# State# s, a #)) -> m a
forall a b. (a -> b) -> a -> b
$ \State# s
s ->
let r :: a
r = case m a -> State# s -> (# State# s, a #)
forall s (m :: * -> *) a.
MonadPrimBase s m =>
m a -> State# s -> (# State# s, a #)
primBase m a
x State# s
s of
(# State# s
_, a
res #) -> a
res
in (# State# s
s, a
r #)
{-# NOINLINE unsafeDupableInterleavePrimBase #-}
unsafeLiftPrimBase :: forall sn n sm m a. (MonadPrimBase sn n, MonadPrim sm m) => n a -> m a
unsafeLiftPrimBase :: n a -> m a
unsafeLiftPrimBase n a
m = (State# sm -> (# State# sm, a #)) -> m a
forall s (m :: * -> *) a.
MonadPrim s m =>
(State# s -> (# State# s, a #)) -> m a
prim (n a -> State# sm -> (# State# sm, a #)
forall s' (m :: * -> *) a s.
MonadPrimBase s' m =>
m a -> State# s -> (# State# s, a #)
unsafePrimBase n a
m)
{-# INLINE unsafeLiftPrimBase #-}