{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE QuantifiedConstraints #-}
module Bluefin.Internal.DslBuilderEff where
import Bluefin.Internal
import Bluefin.Internal.OneWayCoercible
( OneWayCoercible,
oneWayCoerce,
oneWayCoercible,
oneWayCoercibleImpl,
)
newtype DslBuilderEff h es r
= MkDslBuilderEff {forall (h :: Effects -> *) (es :: Effects) r.
DslBuilderEff h es r
-> forall (e :: Effects). h e -> Eff (e :& es) r
unMkDslBuilderEff :: forall e. h e -> Eff (e :& es) r}
useImplDslBuilderEff ::
(e :> es) =>
DslBuilderEff h e r ->
DslBuilderEff h es r
useImplDslBuilderEff :: forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEff h e r -> DslBuilderEff h es r
useImplDslBuilderEff = DslBuilderEff h e r -> DslBuilderEff h es r
forall a b. OneWayCoercible a b => a -> b
oneWayCoerce
runDslBuilderEff ::
h es ->
DslBuilderEff h es r ->
Eff es r
runDslBuilderEff :: forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEff h es r -> Eff es r
runDslBuilderEff h es
h DslBuilderEff h es r
f = Eff (es :& es) r -> Eff es r
forall (e :: Effects) r. Eff (e :& e) r -> Eff e r
makeOp (DslBuilderEff h es r
-> forall (e :: Effects). h e -> Eff (e :& es) r
forall (h :: Effects -> *) (es :: Effects) r.
DslBuilderEff h es r
-> forall (e :: Effects). h e -> Eff (e :& es) r
unMkDslBuilderEff DslBuilderEff h es r
f h es
h)
dslBuilderEff ::
(forall e. h e -> Eff (e :& es) r) ->
DslBuilderEff h es r
dslBuilderEff :: forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEff h es r
dslBuilderEff = (forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEff h es r
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEff h es r
MkDslBuilderEff
instance
(e :> es) =>
OneWayCoercible (DslBuilderEff h e r) (DslBuilderEff h es r)
where
oneWayCoercibleImpl :: OneWayCoercibleD (DslBuilderEff h e r) (DslBuilderEff h es r)
oneWayCoercibleImpl = OneWayCoercibleD (DslBuilderEff h e r) (DslBuilderEff h es r)
forall {k} (a :: k) (b :: k). Coercible a b => OneWayCoercibleD a b
oneWayCoercible
instance (Handle h) => Functor (DslBuilderEff h es) where
fmap :: forall a b.
(a -> b) -> DslBuilderEff h es a -> DslBuilderEff h es b
fmap a -> b
f DslBuilderEff h es a
g =
(forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEff h es r
dslBuilderEff ((forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b)
-> (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff 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) -> DslBuilderEff h (e :& es) a -> Eff (e :& es) a
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEff h es r -> Eff es r
runDslBuilderEff (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEff h es a -> DslBuilderEff h (e :& es) a
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEff h e r -> DslBuilderEff h es r
useImplDslBuilderEff DslBuilderEff h es a
g))
instance (Handle h) => Applicative (DslBuilderEff h es) where
pure :: forall a. a -> DslBuilderEff h es a
pure a
x = (forall (e :: Effects). h e -> Eff (e :& es) a)
-> DslBuilderEff h es a
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEff h es r
dslBuilderEff (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))
DslBuilderEff h es (a -> b)
f <*> :: forall a b.
DslBuilderEff h es (a -> b)
-> DslBuilderEff h es a -> DslBuilderEff h es b
<*> DslBuilderEff h es a
x = (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEff h es r
dslBuilderEff ((forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b)
-> (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b
forall a b. (a -> b) -> a -> b
$ \h e
h ->
h (e :& es)
-> DslBuilderEff h (e :& es) (a -> b) -> Eff (e :& es) (a -> b)
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEff h es r -> Eff es r
runDslBuilderEff (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEff h es (a -> b) -> DslBuilderEff h (e :& es) (a -> b)
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEff h e r -> DslBuilderEff h es r
useImplDslBuilderEff DslBuilderEff 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) -> DslBuilderEff h (e :& es) a -> Eff (e :& es) a
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEff h es r -> Eff es r
runDslBuilderEff (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEff h es a -> DslBuilderEff h (e :& es) a
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEff h e r -> DslBuilderEff h es r
useImplDslBuilderEff DslBuilderEff h es a
x)
instance (Handle h) => Monad (DslBuilderEff h es) where
DslBuilderEff h es a
m >>= :: forall a b.
DslBuilderEff h es a
-> (a -> DslBuilderEff h es b) -> DslBuilderEff h es b
>>= a -> DslBuilderEff h es b
f = (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b
forall (h :: Effects -> *) (es :: Effects) r.
(forall (e :: Effects). h e -> Eff (e :& es) r)
-> DslBuilderEff h es r
dslBuilderEff ((forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b)
-> (forall (e :: Effects). h e -> Eff (e :& es) b)
-> DslBuilderEff h es b
forall a b. (a -> b) -> a -> b
$ \h e
h -> do
a
r <- h (e :& es) -> DslBuilderEff h (e :& es) a -> Eff (e :& es) a
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEff h es r -> Eff es r
runDslBuilderEff (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEff h es a -> DslBuilderEff h (e :& es) a
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEff h e r -> DslBuilderEff h es r
useImplDslBuilderEff DslBuilderEff h es a
m)
h (e :& es) -> DslBuilderEff h (e :& es) b -> Eff (e :& es) b
forall (h :: Effects -> *) (es :: Effects) r.
h es -> DslBuilderEff h es r -> Eff es r
runDslBuilderEff (h e -> h (e :& es)
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle h e
h) (DslBuilderEff h es b -> DslBuilderEff h (e :& es) b
forall (e :: Effects) (es :: Effects) (h :: Effects -> *) r.
(e :> es) =>
DslBuilderEff h e r -> DslBuilderEff h es r
useImplDslBuilderEff (a -> DslBuilderEff h es b
f a
r))