{-# language DeriveAnyClass #-}
{-# language DataKinds #-}
{-# language FlexibleContexts #-}
{-# language GADTs #-}
{-# language RankNTypes #-}
{-# language PolyKinds #-}
{-# language UndecidableInstances #-}
module IO.Effects.Lift where
import IO.Effects.Internal ( Member, Program( Program, programToIO ), ProgramWithHandler, interpret, send )
import Control.Monad.IO.Class ( MonadIO, liftIO )
data Lift n m a where
Lift :: n a -> Lift n m a
{-# inline run #-}
run :: ProgramWithHandler ( Lift IO ) '[] a -> IO a
run p =
programToIO ( interpret ( \( Lift io ) -> Program io ) p)
instance Member ( Lift IO ) es => MonadIO ( Program es ) where
{-# inline liftIO #-}
liftIO =
send . Lift