{-# LANGUAGE UndecidableInstances #-}

module Prologue.Control.Monad.Primitive (module Prologue.Control.Monad.Primitive, module X) where

import qualified Control.Monad.IO.Class  as IOClass

import Prelude
import Prelude                 as X (IO)
import Control.Monad.IO.Class  as X (MonadIO, liftIO)
import Control.Monad.Primitive as X (PrimMonad (PrimState, primitive), RealWorld, primitive_, PrimBase, liftPrim)

-- import qualified Control.Monad.IO.Class  as IOClass


-- -- === Definitions === --
--
-- type PrimMonadST s m = (PrimMonad m, PrimState m ~ s)
-- type MonadIO       m = PrimMonadST RealWorld m
--
--
-- -- === Utils === --
--
-- liftIO :: MonadIO m => IO a -> m a
-- liftIO = liftPrim ; {-# INLINE liftIO #-}
--
--
-- -- === Intances === --
--
-- instance {-# OVERLAPPABLE #-} (MonadIO m, Monad m) => IOClass.MonadIO m where
--     liftIO = liftIO ; {-# INLINE liftIO #-}