{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE MagicHash, UnboxedTuples #-}
module Control.Monad.RT (RT, module Control.Monad.RT) where

import Control.Monad.RT.Unsafe

import GHC.Base (runRW#)
import GHC.IO (IO(IO))
import Data.Coerce (coerce)

{-# INLINE runRT #-}
runRT :: RT a -> a
runRT :: forall a. RT a -> a
runRT (RT State# RealWorld -> (# State# RealWorld, a #)
mx) = case (State# RealWorld -> (# State# RealWorld, a #))
-> (# State# RealWorld, a #)
forall o. (State# RealWorld -> o) -> o
runRW# State# RealWorld -> (# State# RealWorld, a #)
mx of (# State# RealWorld
_, a
x #) -> a
x

{-# INLINE rtToIO #-}
rtToIO :: RT a -> IO a
rtToIO :: forall a. RT a -> IO a
rtToIO = RT a -> IO a
forall a b. Coercible a b => a -> b
coerce