module Control.Monad.Prim
( module Control.Monad.Prim.Class
, Prim
, runPrim
) where
import Control.Applicative
import Control.Monad.Prim.Class
import GHC.Exts
newtype Prim s a = Prim { unPrim :: State# s -> (# State# s, a #) }
runPrim :: MonadPrim m => Prim (World m) a -> m a
runPrim = prim . unPrim
instance Functor (Prim s) where
fmap f m = Prim $ \ s -> case unPrim m s of
(# s', a #) -> (# s', f a #)
instance Applicative (Prim s) where
pure a = Prim $ \ s -> (# s, a #)
f <*> a = Prim $ \ s -> case unPrim f s of
(# s', f' #) -> case unPrim a s' of
(# s'', a' #) -> (# s'', f' a' #)
instance Monad (Prim s) where
return a = Prim $ \ s -> (# s, a #)
m >>= k = Prim $ \ s -> case unPrim m s of
(# s', a #) -> unPrim (k a) s'
m >> n = Prim $ \ s -> case unPrim m s of
(# s', _ #) -> unPrim n s'
instance MonadPrim (Prim s) where
type World (Prim s) = s
prim = Prim