{-# LANGUAGE DeriveFunctor, DerivingVia #-}
{-# OPTIONS_HADDOCK not-home #-}
module Control.Effect.Internal.Optional where
import Control.Monad
import Control.Monad.Trans.Control
import Control.Monad.Trans.Identity
import Control.Effect
import Control.Effect.Carrier
import Control.Effect.Carrier.Internal.Interpret
import Control.Effect.Type.Optional
newtype HoistOptionCall b a = HoistOptionCall (forall x. (a -> x) -> b x -> b x)
deriving (Functor)
type HoistOption (b :: * -> *) = Optional (HoistOptionCall b)
data HoistOptionH
instance Carrier m => PrimHandler HoistOptionH (HoistOption m) m where
effPrimHandler (Optionally (HoistOptionCall b) m) = b id m
{-# INLINEABLE effPrimHandler #-}
newtype HoistOptionC m a = HoistOptionC {
unHoistOptionC :: m a
}
deriving ( Functor, Applicative, Monad
, Alternative, MonadPlus
, MonadFix, MonadFail, MonadIO
, MonadThrow, MonadCatch, MonadMask
)
deriving (MonadTrans, MonadTransControl) via IdentityT
deriving via InterpretPrimC HoistOptionH (HoistOption m) m
instance Carrier m => Carrier (HoistOptionC m)