{-# LANGUAGE AllowAmbiguousTypes #-}
module Effectful.Provider.List
(
ProviderList(..)
, ProviderList_
, runProviderList
, runProviderList_
, provideList
, provideList_
, provideListWith
, provideListWith_
, type (++)
, KnownSubset
) where
import Data.Coerce
import Data.Functor.Identity
import GHC.Stack
import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Internal.Effect
data ProviderList (providedEs :: [Effect]) (input :: Type) (f :: Type -> Type) :: Effect where
ProvideListWith
:: forall providedEs input f es a
. input
-> Eff (providedEs ++ es) a
-> ProviderList providedEs input f (Eff es) (f a)
type ProviderList_ providedEs input = ProviderList providedEs input Identity
type instance DispatchOf (ProviderList providedEs input f) = Dynamic
runProviderList
:: forall providedEs input f es a
. (HasCallStack, KnownSubset providedEs (providedEs ++ es))
=> (forall r. HasCallStack => input -> Eff (providedEs ++ es) r -> Eff es (f r))
-> Eff (ProviderList providedEs input f : es) a
-> Eff es a
runProviderList :: forall (providedEs :: [Effect]) input (f :: Type -> Type)
(es :: [Effect]) a.
(HasCallStack, KnownSubset providedEs (providedEs ++ es)) =>
(forall r.
HasCallStack =>
input -> Eff (providedEs ++ es) r -> Eff es (f r))
-> Eff (ProviderList providedEs input f : es) a -> Eff es a
runProviderList forall r.
HasCallStack =>
input -> Eff (providedEs ++ es) r -> Eff es (f r)
provider = EffectHandler (ProviderList providedEs input f) es
-> Eff (ProviderList providedEs input f : es) a -> Eff es a
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic) =>
EffectHandler e es -> Eff (e : es) a -> Eff es a
interpret (EffectHandler (ProviderList providedEs input f) es
-> Eff (ProviderList providedEs input f : es) a -> Eff es a)
-> EffectHandler (ProviderList providedEs input f) es
-> Eff (ProviderList providedEs input f : es) a
-> Eff es a
forall a b. (a -> b) -> a -> b
$ \LocalEnv localEs
env -> \case
ProvideListWith input
input Eff (providedEs ++ es) a
action -> input -> Eff (providedEs ++ es) a -> Eff es (f a)
forall r.
HasCallStack =>
input -> Eff (providedEs ++ es) r -> Eff es (f r)
provider input
input (Eff (providedEs ++ es) a -> Eff es (f a))
-> Eff (providedEs ++ es) a -> Eff es (f a)
forall a b. (a -> b) -> a -> b
$ do
LocalEnv localEs
-> ((forall {r}. Eff localEs r -> Eff (providedEs ++ es) r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a
forall (localEs :: [Effect]) (es :: [Effect]) a.
HasCallStack =>
LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff es r) -> Eff es a) -> Eff es a
localSeqUnlift LocalEnv localEs
env (((forall {r}. Eff localEs r -> Eff (providedEs ++ es) r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a)
-> ((forall {r}. Eff localEs r -> Eff (providedEs ++ es) r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a
forall a b. (a -> b) -> a -> b
$ \forall {r}. Eff localEs r -> Eff (providedEs ++ es) r
unlift -> do
forall (lentEs :: [Effect]) (es :: [Effect]) (localEs :: [Effect])
a.
(HasCallStack, KnownSubset lentEs es) =>
LocalEnv localEs
-> ((forall r. Eff (lentEs ++ localEs) r -> Eff localEs r)
-> Eff es a)
-> Eff es a
localSeqLend @providedEs LocalEnv localEs
env (((forall r. Eff (providedEs ++ localEs) r -> Eff localEs r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a)
-> ((forall r. Eff (providedEs ++ localEs) r -> Eff localEs r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a
forall a b. (a -> b) -> a -> b
$ \forall r. Eff (providedEs ++ localEs) r -> Eff localEs r
lend -> do
Eff localEs a -> Eff (providedEs ++ es) a
forall {r}. Eff localEs r -> Eff (providedEs ++ es) r
unlift (Eff localEs a -> Eff (providedEs ++ es) a)
-> (Eff (providedEs ++ es) a -> Eff localEs a)
-> Eff (providedEs ++ es) a
-> Eff (providedEs ++ es) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Eff (providedEs ++ localEs) a -> Eff localEs a
Eff (providedEs ++ es) a -> Eff localEs a
forall r. Eff (providedEs ++ localEs) r -> Eff localEs r
lend (Eff (providedEs ++ es) a -> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a -> Eff (providedEs ++ es) a
forall a b. (a -> b) -> a -> b
$ Eff (providedEs ++ es) a
action
runProviderList_
:: forall providedEs input es a
. (HasCallStack, KnownSubset providedEs (providedEs ++ es))
=> (forall r. HasCallStack => input -> Eff (providedEs ++ es) r -> Eff es r)
-> Eff (ProviderList_ providedEs input : es) a
-> Eff es a
runProviderList_ :: forall (providedEs :: [Effect]) input (es :: [Effect]) a.
(HasCallStack, KnownSubset providedEs (providedEs ++ es)) =>
(forall r.
HasCallStack =>
input -> Eff (providedEs ++ es) r -> Eff es r)
-> Eff (ProviderList_ providedEs input : es) a -> Eff es a
runProviderList_ forall r.
HasCallStack =>
input -> Eff (providedEs ++ es) r -> Eff es r
provider = EffectHandler (ProviderList_ providedEs input) es
-> Eff (ProviderList_ providedEs input : es) a -> Eff es a
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic) =>
EffectHandler e es -> Eff (e : es) a -> Eff es a
interpret (EffectHandler (ProviderList_ providedEs input) es
-> Eff (ProviderList_ providedEs input : es) a -> Eff es a)
-> EffectHandler (ProviderList_ providedEs input) es
-> Eff (ProviderList_ providedEs input : es) a
-> Eff es a
forall a b. (a -> b) -> a -> b
$ \LocalEnv localEs
env -> \case
ProvideListWith input
input Eff (providedEs ++ es) a
action -> input -> Eff (providedEs ++ es) a -> Eff es a
forall r.
HasCallStack =>
input -> Eff (providedEs ++ es) r -> Eff es r
provider input
input (Eff (providedEs ++ es) a -> Eff es a)
-> Eff (providedEs ++ es) a -> Eff es a
forall a b. (a -> b) -> a -> b
$ do
LocalEnv localEs
-> ((forall {r}. Eff localEs r -> Eff (providedEs ++ es) r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a
forall (localEs :: [Effect]) (es :: [Effect]) a.
HasCallStack =>
LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff es r) -> Eff es a) -> Eff es a
localSeqUnlift LocalEnv localEs
env (((forall {r}. Eff localEs r -> Eff (providedEs ++ es) r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a)
-> ((forall {r}. Eff localEs r -> Eff (providedEs ++ es) r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a
forall a b. (a -> b) -> a -> b
$ \forall {r}. Eff localEs r -> Eff (providedEs ++ es) r
unlift -> do
forall (lentEs :: [Effect]) (es :: [Effect]) (localEs :: [Effect])
a.
(HasCallStack, KnownSubset lentEs es) =>
LocalEnv localEs
-> ((forall r. Eff (lentEs ++ localEs) r -> Eff localEs r)
-> Eff es a)
-> Eff es a
localSeqLend @providedEs LocalEnv localEs
env (((forall r. Eff (providedEs ++ localEs) r -> Eff localEs r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a)
-> ((forall r. Eff (providedEs ++ localEs) r -> Eff localEs r)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ es) a
forall a b. (a -> b) -> a -> b
$ \forall r. Eff (providedEs ++ localEs) r -> Eff localEs r
lend -> do
Eff localEs a -> Eff (providedEs ++ es) a
forall {r}. Eff localEs r -> Eff (providedEs ++ es) r
unlift (Eff localEs a -> Eff (providedEs ++ es) a)
-> (Eff (providedEs ++ localEs) (Identity a) -> Eff localEs a)
-> Eff (providedEs ++ localEs) (Identity a)
-> Eff (providedEs ++ es) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Eff (providedEs ++ localEs) a -> Eff localEs a
Eff (providedEs ++ localEs) (Identity a) -> Eff localEs a
forall r. Eff (providedEs ++ localEs) r -> Eff localEs r
lend (Eff (providedEs ++ localEs) (Identity a)
-> Eff (providedEs ++ es) a)
-> Eff (providedEs ++ localEs) (Identity a)
-> Eff (providedEs ++ es) a
forall a b. (a -> b) -> a -> b
$ Eff (providedEs ++ localEs) a
-> Eff (providedEs ++ localEs) (Identity a)
forall a b. Coercible a b => a -> b
coerce Eff (providedEs ++ localEs) a
Eff (providedEs ++ es) a
action
provideList
:: forall providedEs f es a
. (HasCallStack, ProviderList providedEs () f :> es)
=> Eff (providedEs ++ es) a
-> Eff es (f a)
provideList :: forall (providedEs :: [Effect]) (f :: Type -> Type)
(es :: [Effect]) a.
(HasCallStack, ProviderList providedEs () f :> es) =>
Eff (providedEs ++ es) a -> Eff es (f a)
provideList = ProviderList providedEs () f (Eff es) (f a) -> Eff es (f a)
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (ProviderList providedEs () f (Eff es) (f a) -> Eff es (f a))
-> (Eff (providedEs ++ es) a
-> ProviderList providedEs () f (Eff es) (f a))
-> Eff (providedEs ++ es) a
-> Eff es (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (providedEs :: [Effect]) input (f :: Type -> Type)
(es :: [Effect]) a.
input
-> Eff (providedEs ++ es) a
-> ProviderList providedEs input f (Eff es) (f a)
ProvideListWith @providedEs ()
provideList_
:: forall providedEs es a
. (HasCallStack, ProviderList_ providedEs () :> es)
=> Eff (providedEs ++ es) a
-> Eff es a
provideList_ :: forall (providedEs :: [Effect]) (es :: [Effect]) a.
(HasCallStack, ProviderList_ providedEs () :> es) =>
Eff (providedEs ++ es) a -> Eff es a
provideList_ = Eff es (Identity a) -> Eff es a
forall (es :: [Effect]) a. Eff es (Identity a) -> Eff es a
dropIdentity (Eff es (Identity a) -> Eff es a)
-> (Eff (providedEs ++ es) a -> Eff es (Identity a))
-> Eff (providedEs ++ es) a
-> Eff es a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProviderList providedEs () Identity (Eff es) (Identity a)
-> Eff es (Identity a)
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (ProviderList providedEs () Identity (Eff es) (Identity a)
-> Eff es (Identity a))
-> (Eff (providedEs ++ es) a
-> ProviderList providedEs () Identity (Eff es) (Identity a))
-> Eff (providedEs ++ es) a
-> Eff es (Identity a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (providedEs :: [Effect]) input (f :: Type -> Type)
(es :: [Effect]) a.
input
-> Eff (providedEs ++ es) a
-> ProviderList providedEs input f (Eff es) (f a)
ProvideListWith @providedEs ()
provideListWith
:: forall providedEs input f es a
. (HasCallStack, ProviderList providedEs input f :> es)
=> input
-> Eff (providedEs ++ es) a
-> Eff es (f a)
provideListWith :: forall (providedEs :: [Effect]) input (f :: Type -> Type)
(es :: [Effect]) a.
(HasCallStack, ProviderList providedEs input f :> es) =>
input -> Eff (providedEs ++ es) a -> Eff es (f a)
provideListWith input
input = ProviderList providedEs input f (Eff es) (f a) -> Eff es (f a)
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (ProviderList providedEs input f (Eff es) (f a) -> Eff es (f a))
-> (Eff (providedEs ++ es) a
-> ProviderList providedEs input f (Eff es) (f a))
-> Eff (providedEs ++ es) a
-> Eff es (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (providedEs :: [Effect]) input (f :: Type -> Type)
(es :: [Effect]) a.
input
-> Eff (providedEs ++ es) a
-> ProviderList providedEs input f (Eff es) (f a)
ProvideListWith @providedEs input
input
provideListWith_
:: forall providedEs input es a
. (HasCallStack, ProviderList_ providedEs input :> es)
=> input
-> Eff (providedEs ++ es) a
-> Eff es a
provideListWith_ :: forall (providedEs :: [Effect]) input (es :: [Effect]) a.
(HasCallStack, ProviderList_ providedEs input :> es) =>
input -> Eff (providedEs ++ es) a -> Eff es a
provideListWith_ input
input = Eff es (Identity a) -> Eff es a
forall (es :: [Effect]) a. Eff es (Identity a) -> Eff es a
dropIdentity (Eff es (Identity a) -> Eff es a)
-> (Eff (providedEs ++ es) a -> Eff es (Identity a))
-> Eff (providedEs ++ es) a
-> Eff es a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProviderList providedEs input Identity (Eff es) (Identity a)
-> Eff es (Identity a)
forall (e :: Effect) (es :: [Effect]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (ProviderList providedEs input Identity (Eff es) (Identity a)
-> Eff es (Identity a))
-> (Eff (providedEs ++ es) a
-> ProviderList providedEs input Identity (Eff es) (Identity a))
-> Eff (providedEs ++ es) a
-> Eff es (Identity a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (providedEs :: [Effect]) input (f :: Type -> Type)
(es :: [Effect]) a.
input
-> Eff (providedEs ++ es) a
-> ProviderList providedEs input f (Eff es) (f a)
ProvideListWith @providedEs input
input
dropIdentity :: Eff es (Identity a) -> Eff es a
dropIdentity :: forall (es :: [Effect]) a. Eff es (Identity a) -> Eff es a
dropIdentity = Eff es (Identity a) -> Eff es a
forall a b. Coercible a b => a -> b
coerce