{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE QuantifiedConstraints #-}
module Bluefin.Internal.DslBuilderEffects where
import Bluefin.Internal
import Bluefin.Internal.OneWayCoercible
( OneWayCoercible,
oneWayCoercible,
oneWayCoercibleImpl,
oneWayCoerce,
)
newtype DslBuilderEffects h es r
= MkDslBuilderEffects {forall (h :: Effects -> *) (es :: Effects) r.
DslBuilderEffects h es r
-> forall (e :: Effects). h e -> Eff (e :& es) r
unMkDslBuilderEffects :: forall e. h e -> Eff (e :& es) r}
useImplDslBuilderEffects :: (e :> es) => DslBuilderEffects h e r -> DslBuilderEffects h es r
useImplDslBuilderEffects :: forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEffects h e r -> DslBuilderEffects h es r
useImplDslBuilderEffects = DslBuilderEffects h e r -> DslBuilderEffects h es r
forall a b. OneWayCoercible a b => a -> b
oneWayCoerce
runDslBuilderEffects :: h es -> DslBuilderEffects h es r -> Eff es r
runDslBuilderEffects :: forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEffects h es r -> Eff es r
runDslBuilderEffects h es
h DslBuilderEffects h es r
f = Eff (es :& es) r -> Eff es r
forall (e :: Effects) r. Eff (e :& e) r -> Eff e r
makeOp (DslBuilderEffects h es r
-> forall (e :: Effects). h e -> Eff (e :& es) r
forall (h :: Effects -> *) (es :: Effects) r.
DslBuilderEffects h es r
-> forall (e :: Effects). h e -> Eff (e :& es) r
unMkDslBuilderEffects DslBuilderEffects h es r
f h es
h)
dslBuilderEffects :: (forall e. h e -> Eff (e :& es) r) -> DslBuilderEffects h es r
dslBuilderEffects :: forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEffects h es r
dslBuilderEffects = (forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEffects h es r
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEffects h es r
MkDslBuilderEffects
instance
(e :> es) =>
OneWayCoercible (DslBuilderEffects h e r) (DslBuilderEffects h es r)
where
oneWayCoercibleImpl :: OneWayCoercibleD
(DslBuilderEffects h e r) (DslBuilderEffects h es r)
oneWayCoercibleImpl = OneWayCoercibleD
(DslBuilderEffects h e r) (DslBuilderEffects h es r)
forall {k} (a :: k) (b :: k). Coercible a b => OneWayCoercibleD a b
oneWayCoercible
instance (Handle h) => Functor (DslBuilderEffects h es) where
fmap :: forall a b.
(a -> b) -> DslBuilderEffects h es a -> DslBuilderEffects h es b
fmap a -> b
f DslBuilderEffects h es a
g =
(forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEffects h es r
dslBuilderEffects ((forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b)
-> (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b
forall a b. (a -> b) -> a -> b
$ \h e
h ->
(a -> b) -> Eff (e :& es) a -> Eff (e :& es) b
forall a b. (a -> b) -> Eff (e :& es) a -> Eff (e :& es) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (h (e :& es) -> DslBuilderEffects h (e :& es) a -> Eff (e :& es) a
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEffects h es r -> Eff es r
runDslBuilderEffects (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEffects h es a -> DslBuilderEffects h (e :& es) a
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEffects h e r -> DslBuilderEffects h es r
useImplDslBuilderEffects DslBuilderEffects h es a
g))
instance (Handle h) => Applicative (DslBuilderEffects h es) where
pure :: forall a. a -> DslBuilderEffects h es a
pure a
x = (forall (e :: Effects). h e -> Eff (e :& es) a)
-> DslBuilderEffects h es a
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEffects h es r
dslBuilderEffects (Eff (e :& es) a -> h e -> Eff (e :& es) a
forall a. a -> h e -> a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Eff (e :& es) a
forall a. a -> Eff (e :& es) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x))
DslBuilderEffects h es (a -> b)
f <*> :: forall a b.
DslBuilderEffects h es (a -> b)
-> DslBuilderEffects h es a -> DslBuilderEffects h es b
<*> DslBuilderEffects h es a
x = (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEffects h es r
dslBuilderEffects ((forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b)
-> (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b
forall a b. (a -> b) -> a -> b
$ \h e
h ->
h (e :& es)
-> DslBuilderEffects h (e :& es) (a -> b) -> Eff (e :& es) (a -> b)
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEffects h es r -> Eff es r
runDslBuilderEffects (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEffects h es (a -> b)
-> DslBuilderEffects h (e :& es) (a -> b)
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEffects h e r -> DslBuilderEffects h es r
useImplDslBuilderEffects DslBuilderEffects h es (a -> b)
f)
Eff (e :& es) (a -> b) -> Eff (e :& es) a -> Eff (e :& es) b
forall a b.
Eff (e :& es) (a -> b) -> Eff (e :& es) a -> Eff (e :& es) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> h (e :& es) -> DslBuilderEffects h (e :& es) a -> Eff (e :& es) a
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEffects h es r -> Eff es r
runDslBuilderEffects (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEffects h es a -> DslBuilderEffects h (e :& es) a
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEffects h e r -> DslBuilderEffects h es r
useImplDslBuilderEffects DslBuilderEffects h es a
x)
instance (Handle h) => Monad (DslBuilderEffects h es) where
DslBuilderEffects h es a
m >>= :: forall a b.
DslBuilderEffects h es a
-> (a -> DslBuilderEffects h es b) -> DslBuilderEffects h es b
>>= a -> DslBuilderEffects h es b
f = (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEffects h es r
dslBuilderEffects ((forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b)
-> (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEffects h es b
forall a b. (a -> b) -> a -> b
$ \h e
h -> do
a
r <- h (e :& es) -> DslBuilderEffects h (e :& es) a -> Eff (e :& es) a
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEffects h es r -> Eff es r
runDslBuilderEffects (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEffects h es a -> DslBuilderEffects h (e :& es) a
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEffects h e r -> DslBuilderEffects h es r
useImplDslBuilderEffects DslBuilderEffects h es a
m)
h (e :& es) -> DslBuilderEffects h (e :& es) b -> Eff (e :& es) b
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEffects h es r -> Eff es r
runDslBuilderEffects (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEffects h es b -> DslBuilderEffects h (e :& es) b
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEffects h e r -> DslBuilderEffects h es r
useImplDslBuilderEffects (a -> DslBuilderEffects h es b
f a
r))