module Control.Effect.Handler.Heftia.Provider where
import Control.Effect.Class (type (~>))
import Control.Effect.Class.Provider (ProviderS (Provide))
import Control.Effect.Heftia (Elaborator)
import Control.Monad.Trans (MonadTrans, lift)
elaborateProvider ::
(c h, e h) =>
(f ~> h) ->
(forall x. i -> h x -> f (g x)) ->
Elaborator (ProviderS c e i g) f
elaborateProvider :: forall (c :: (* -> *) -> Constraint) (h :: * -> *)
(e :: (* -> *) -> Constraint) (f :: * -> *) i (g :: * -> *).
(c h, e h) =>
(f ~> h)
-> (forall x. i -> h x -> f (g x))
-> Elaborator (ProviderS c e i g) f
elaborateProvider f ~> h
iLower forall x. i -> h x -> f (g x)
run (Provide i
i forall (h :: * -> *). (c h, e h) => (f ~> h) -> h a1
a) = forall x. i -> h x -> f (g x)
run i
i forall a b. (a -> b) -> a -> b
$ forall (h :: * -> *). (c h, e h) => (f ~> h) -> h a1
a f ~> h
iLower
{-# INLINE elaborateProvider #-}
elaborateProviderT ::
(Monad m, MonadTrans t, c (t m), e (t m)) =>
(forall x. i -> t m x -> m (g x)) ->
Elaborator (ProviderS c e i g) m
elaborateProviderT :: forall (m :: * -> *) (t :: (* -> *) -> * -> *)
(c :: (* -> *) -> Constraint) (e :: (* -> *) -> Constraint) i
(g :: * -> *).
(Monad m, MonadTrans t, c (t m), e (t m)) =>
(forall x. i -> t m x -> m (g x))
-> Elaborator (ProviderS c e i g) m
elaborateProviderT = forall (c :: (* -> *) -> Constraint) (h :: * -> *)
(e :: (* -> *) -> Constraint) (f :: * -> *) i (g :: * -> *).
(c h, e h) =>
(f ~> h)
-> (forall x. i -> h x -> f (g x))
-> Elaborator (ProviderS c e i g) f
elaborateProvider forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
{-# INLINE elaborateProviderT #-}