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

import GHC.Base (State#, RealWorld)
import GHC.IO (IO(IO))
import Data.Coerce (coerce)

-- do the instances by hand?
newtype RT a = RT (State# RealWorld -> (# State# RealWorld, a #))
  deriving ((forall a b. (a -> b) -> RT a -> RT b)
-> (forall a b. a -> RT b -> RT a) -> Functor RT
forall a b. a -> RT b -> RT a
forall a b. (a -> b) -> RT a -> RT b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> RT a -> RT b
fmap :: forall a b. (a -> b) -> RT a -> RT b
$c<$ :: forall a b. a -> RT b -> RT a
<$ :: forall a b. a -> RT b -> RT a
Functor, Functor RT
Functor RT =>
(forall a. a -> RT a)
-> (forall a b. RT (a -> b) -> RT a -> RT b)
-> (forall a b c. (a -> b -> c) -> RT a -> RT b -> RT c)
-> (forall a b. RT a -> RT b -> RT b)
-> (forall a b. RT a -> RT b -> RT a)
-> Applicative RT
forall a. a -> RT a
forall a b. RT a -> RT b -> RT a
forall a b. RT a -> RT b -> RT b
forall a b. RT (a -> b) -> RT a -> RT b
forall a b c. (a -> b -> c) -> RT a -> RT b -> RT c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall a. a -> RT a
pure :: forall a. a -> RT a
$c<*> :: forall a b. RT (a -> b) -> RT a -> RT b
<*> :: forall a b. RT (a -> b) -> RT a -> RT b
$cliftA2 :: forall a b c. (a -> b -> c) -> RT a -> RT b -> RT c
liftA2 :: forall a b c. (a -> b -> c) -> RT a -> RT b -> RT c
$c*> :: forall a b. RT a -> RT b -> RT b
*> :: forall a b. RT a -> RT b -> RT b
$c<* :: forall a b. RT a -> RT b -> RT a
<* :: forall a b. RT a -> RT b -> RT a
Applicative, Applicative RT
Applicative RT =>
(forall a b. RT a -> (a -> RT b) -> RT b)
-> (forall a b. RT a -> RT b -> RT b)
-> (forall a. a -> RT a)
-> Monad RT
forall a. a -> RT a
forall a b. RT a -> RT b -> RT b
forall a b. RT a -> (a -> RT b) -> RT b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall a b. RT a -> (a -> RT b) -> RT b
>>= :: forall a b. RT a -> (a -> RT b) -> RT b
$c>> :: forall a b. RT a -> RT b -> RT b
>> :: forall a b. RT a -> RT b -> RT b
$creturn :: forall a. a -> RT a
return :: forall a. a -> RT a
Monad) via IO

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