{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE PatternSynonyms #-}
module Control.Effect.Transform where
import Control.Effect (Eff (..), Free, hoist, sendFor, type (~>))
import Control.Effect.Interpret (interposeFor, interpret, reinterpret)
import Data.Effect.OpenUnion (
Each,
Has,
In,
KnownLength,
KnownOrder,
Membership,
RemoveExps,
RemoveHOEs,
Suffix,
SuffixUnder,
Union,
WeakenExps,
WeakenHOEs,
hfmapUnion,
identityMembership,
inject,
keyMembership,
labelMembership,
mapUnion,
prefixFor,
prefixFor1,
suffixFor,
weaken,
weakenExps,
weakenFor,
weakenHOEs,
weakens,
weakensUnder,
(!:),
pattern Here,
type (++),
type (:>),
)
import Data.Effect.Tag (Tagged (Tag), unTag, type (#))
raise :: forall e es a ff c. (Free c ff) => Eff ff es a -> Eff ff (e ': es) a
raise :: forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
Free c ff =>
Eff ff es a -> Eff ff (e : es) a
raise = Eff ff es a -> Eff ff (e : es) a
forall (es :: [Effect]) (es' :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(Suffix es es', Free c ff) =>
Eff ff es a -> Eff ff es' a
raises
{-# INLINE raise #-}
raises :: forall es es' a ff c. (Suffix es es', Free c ff) => Eff ff es a -> Eff ff es' a
raises :: forall (es :: [Effect]) (es' :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(Suffix es es', Free c ff) =>
Eff ff es a -> Eff ff es' a
raises = (Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll Union es (Eff ff es') x -> Union es' (Eff ff es') x
forall (es :: [Effect]) (es' :: [Effect]) (f :: * -> *) a.
Suffix es es' =>
Union es f a -> Union es' f a
Union es (Eff ff es') ~> Union es' (Eff ff es')
weakens
{-# INLINE raises #-}
raiseUnder :: forall e0 e1 es a ff c. (Free c ff) => Eff ff (e0 ': es) a -> Eff ff (e0 ': e1 ': es) a
raiseUnder :: forall (e0 :: Effect) (e1 :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
Free c ff =>
Eff ff (e0 : es) a -> Eff ff (e0 : e1 : es) a
raiseUnder = Eff ff (e0 : es) a -> Eff ff (e0 : e1 : es) a
forall (e :: Effect) (es :: [Effect]) (es' :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(Suffix es es', Free c ff) =>
Eff ff (e : es) a -> Eff ff (e : es') a
raisesUnder
{-# INLINE raiseUnder #-}
raisesUnder :: forall e es es' a ff c. (Suffix es es', Free c ff) => Eff ff (e ': es) a -> Eff ff (e ': es') a
raisesUnder :: forall (e :: Effect) (es :: [Effect]) (es' :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(Suffix es es', Free c ff) =>
Eff ff (e : es) a -> Eff ff (e : es') a
raisesUnder = (Union (e : es) (Eff ff (e : es'))
~> Union (e : es') (Eff ff (e : es')))
-> Eff ff (e : es) a -> Eff ff (e : es') a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll Union (e : es) (Eff ff (e : es')) x
-> Union (e : es') (Eff ff (e : es')) x
forall (es :: [Effect]) (es' :: [Effect]) (f :: * -> *) a.
SuffixUnder es es' =>
Union es f a -> Union es' f a
Union (e : es) (Eff ff (e : es'))
~> Union (e : es') (Eff ff (e : es'))
weakensUnder
{-# INLINE raisesUnder #-}
raisesUnders :: forall es es' a ff c. (SuffixUnder es es', Free c ff) => Eff ff es a -> Eff ff es' a
raisesUnders :: forall (es :: [Effect]) (es' :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(SuffixUnder es es', Free c ff) =>
Eff ff es a -> Eff ff es' a
raisesUnders = (Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll Union es (Eff ff es') x -> Union es' (Eff ff es') x
forall (es :: [Effect]) (es' :: [Effect]) (f :: * -> *) a.
SuffixUnder es es' =>
Union es f a -> Union es' f a
Union es (Eff ff es') ~> Union es' (Eff ff es')
weakensUnder
{-# INLINE raisesUnders #-}
onlyFOEs :: forall es a ff c. (Free c ff, WeakenHOEs es) => Eff ff (RemoveHOEs es) a -> Eff ff es a
onlyFOEs :: forall (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(Free c ff, WeakenHOEs es) =>
Eff ff (RemoveHOEs es) a -> Eff ff es a
onlyFOEs = (Union (RemoveHOEs es) (Eff ff es) ~> Union es (Eff ff es))
-> Eff ff (RemoveHOEs es) a -> Eff ff es a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll Union (RemoveHOEs es) (Eff ff es) x -> Union es (Eff ff es) x
forall (es :: [Effect]) (f :: * -> *) a.
WeakenHOEs es =>
Union (RemoveHOEs es) f a -> Union es f a
Union (RemoveHOEs es) (Eff ff es) ~> Union es (Eff ff es)
weakenHOEs
{-# INLINE onlyFOEs #-}
onlyPolys :: forall es a ff c. (Free c ff, WeakenExps es) => Eff ff (RemoveExps es) a -> Eff ff es a
onlyPolys :: forall (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(Free c ff, WeakenExps es) =>
Eff ff (RemoveExps es) a -> Eff ff es a
onlyPolys = (Union (RemoveExps es) (Eff ff es) ~> Union es (Eff ff es))
-> Eff ff (RemoveExps es) a -> Eff ff es a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll Union (RemoveExps es) (Eff ff es) x -> Union es (Eff ff es) x
forall (es :: [Effect]) (f :: * -> *) a.
WeakenExps es =>
Union (RemoveExps es) f a -> Union es f a
Union (RemoveExps es) (Eff ff es) ~> Union es (Eff ff es)
weakenExps
{-# INLINE onlyPolys #-}
raisePrefix
:: forall es' es a ff c
. (KnownLength es', Free c ff)
=> Eff ff es a
-> Eff ff (es' ++ es) a
raisePrefix :: forall (es' :: [Effect]) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(KnownLength es', Free c ff) =>
Eff ff es a -> Eff ff (es' ++ es) a
raisePrefix = (Union es (Eff ff (es' ++ es))
~> Union (es' ++ es) (Eff ff (es' ++ es)))
-> Eff ff es a -> Eff ff (es' ++ es) a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll ((Union es (Eff ff (es' ++ es))
~> Union (es' ++ es) (Eff ff (es' ++ es)))
-> Eff ff es a -> Eff ff (es' ++ es) a)
-> (Union es (Eff ff (es' ++ es))
~> Union (es' ++ es) (Eff ff (es' ++ es)))
-> Eff ff es a
-> Eff ff (es' ++ es) a
forall a b. (a -> b) -> a -> b
$ (forall (e :: Effect). Membership e es -> Membership e (es' ++ es))
-> Union es (Eff ff (es' ++ es)) x
-> Union (es' ++ es) (Eff ff (es' ++ es)) x
forall (es :: [Effect]) (es' :: [Effect]) (f :: * -> *) a.
(forall (e :: Effect). Membership e es -> Membership e es')
-> Union es f a -> Union es' f a
mapUnion ((forall (e :: Effect).
Membership e es -> Membership e (es' ++ es))
-> Union es (Eff ff (es' ++ es)) x
-> Union (es' ++ es) (Eff ff (es' ++ es)) x)
-> (forall (e :: Effect).
Membership e es -> Membership e (es' ++ es))
-> Union es (Eff ff (es' ++ es)) x
-> Union (es' ++ es) (Eff ff (es' ++ es)) x
forall a b. (a -> b) -> a -> b
$ forall (es' :: [Effect]) (es :: [Effect]) (e :: Effect).
KnownLength es' =>
Membership e es -> Membership e (es' ++ es)
prefixFor @es'
{-# INLINE raisePrefix #-}
raiseSuffix
:: forall es' es a ff c
. (Free c ff)
=> Eff ff es a
-> Eff ff (es ++ es') a
raiseSuffix :: forall (es' :: [Effect]) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
Free c ff =>
Eff ff es a -> Eff ff (es ++ es') a
raiseSuffix = (Union es (Eff ff (es ++ es'))
~> Union (es ++ es') (Eff ff (es ++ es')))
-> Eff ff es a -> Eff ff (es ++ es') a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll ((Union es (Eff ff (es ++ es'))
~> Union (es ++ es') (Eff ff (es ++ es')))
-> Eff ff es a -> Eff ff (es ++ es') a)
-> (Union es (Eff ff (es ++ es'))
~> Union (es ++ es') (Eff ff (es ++ es')))
-> Eff ff es a
-> Eff ff (es ++ es') a
forall a b. (a -> b) -> a -> b
$ (forall (e :: Effect). Membership e es -> Membership e (es ++ es'))
-> Union es (Eff ff (es ++ es')) x
-> Union (es ++ es') (Eff ff (es ++ es')) x
forall (es :: [Effect]) (es' :: [Effect]) (f :: * -> *) a.
(forall (e :: Effect). Membership e es -> Membership e es')
-> Union es f a -> Union es' f a
mapUnion ((forall (e :: Effect).
Membership e es -> Membership e (es ++ es'))
-> Union es (Eff ff (es ++ es')) x
-> Union (es ++ es') (Eff ff (es ++ es')) x)
-> (forall (e :: Effect).
Membership e es -> Membership e (es ++ es'))
-> Union es (Eff ff (es ++ es')) x
-> Union (es ++ es') (Eff ff (es ++ es')) x
forall a b. (a -> b) -> a -> b
$ forall (es' :: [Effect]) (es :: [Effect]) (e :: Effect).
Membership e es -> Membership e (es ++ es')
suffixFor @es'
{-# INLINE raiseSuffix #-}
raisePrefix1
:: forall fs x es a ff c
. (KnownLength fs, Free c ff)
=> Eff ff es a
-> Eff ff (Each fs x ++ es) a
raisePrefix1 :: forall {k} (fs :: [k -> Effect]) (x :: k) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownLength fs, Free c ff) =>
Eff ff es a -> Eff ff (Each fs x ++ es) a
raisePrefix1 = (Union es (Eff ff (Each fs x ++ es))
~> Union (Each fs x ++ es) (Eff ff (Each fs x ++ es)))
-> Eff ff es a -> Eff ff (Each fs x ++ es) a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll ((Union es (Eff ff (Each fs x ++ es))
~> Union (Each fs x ++ es) (Eff ff (Each fs x ++ es)))
-> Eff ff es a -> Eff ff (Each fs x ++ es) a)
-> (Union es (Eff ff (Each fs x ++ es))
~> Union (Each fs x ++ es) (Eff ff (Each fs x ++ es)))
-> Eff ff es a
-> Eff ff (Each fs x ++ es) a
forall a b. (a -> b) -> a -> b
$ (forall (e :: Effect).
Membership e es -> Membership e (Each fs x ++ es))
-> Union es (Eff ff (Each fs x ++ es)) x
-> Union (Each fs x ++ es) (Eff ff (Each fs x ++ es)) x
forall (es :: [Effect]) (es' :: [Effect]) (f :: * -> *) a.
(forall (e :: Effect). Membership e es -> Membership e es')
-> Union es f a -> Union es' f a
mapUnion ((forall (e :: Effect).
Membership e es -> Membership e (Each fs x ++ es))
-> Union es (Eff ff (Each fs x ++ es)) x
-> Union (Each fs x ++ es) (Eff ff (Each fs x ++ es)) x)
-> (forall (e :: Effect).
Membership e es -> Membership e (Each fs x ++ es))
-> Union es (Eff ff (Each fs x ++ es)) x
-> Union (Each fs x ++ es) (Eff ff (Each fs x ++ es)) x
forall a b. (a -> b) -> a -> b
$ forall (fs :: [k -> Effect]) (x :: k) (es :: [Effect])
(e :: Effect).
KnownLength fs =>
Membership e es -> Membership e (Each fs x ++ es)
forall {k} (fs :: [k -> Effect]) (x :: k) (es :: [Effect])
(e :: Effect).
KnownLength fs =>
Membership e es -> Membership e (Each fs x ++ es)
prefixFor1 @fs @x
{-# INLINE raisePrefix1 #-}
subsume :: forall e es a ff c. (e `In` es, Free c ff) => Eff ff (e ': es) a -> Eff ff es a
subsume :: forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(In e es, Free c ff) =>
Eff ff (e : es) a -> Eff ff es a
subsume = (Union (e : es) (Eff ff es) ~> Union es (Eff ff es))
-> Eff ff (e : es) a -> Eff ff es a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll ((Union (e : es) (Eff ff es) ~> Union es (Eff ff es))
-> Eff ff (e : es) a -> Eff ff es a)
-> (Union (e : es) (Eff ff es) ~> Union es (Eff ff es))
-> Eff ff (e : es) a
-> Eff ff es a
forall a b. (a -> b) -> a -> b
$ Membership e es -> e (Eff ff es) x -> Union es (Eff ff es) x
forall (es :: [Effect]) (f :: * -> *) a.
Membership e es -> e f a -> Union es f a
forall (e :: Effect) (order :: EffectOrder) (es :: [Effect])
(f :: * -> *) a.
Elem e order =>
Membership e es -> e f a -> Union es f a
inject Membership e es
forall (e :: Effect) (es :: [Effect]).
FindBy
IdentityResolver
(IdentityDiscriminator e)
(IdentityDiscriminator (HeadOf es))
e
es =>
Membership e es
identityMembership (e (Eff ff es) x -> Union es (Eff ff es) x)
-> (Union es (Eff ff es) x -> Union es (Eff ff es) x)
-> Union (e : es) (Eff ff es) x
-> Union es (Eff ff es) x
forall (f :: * -> *) a r (es :: [Effect]).
(e f a -> r) -> (Union es f a -> r) -> Union (e : es) f a -> r
forall (e :: Effect) (order :: EffectOrder) (f :: * -> *) a r
(es :: [Effect]).
Elem e order =>
(e f a -> r) -> (Union es f a -> r) -> Union (e : es) f a -> r
!: Union es (Eff ff es) x -> Union es (Eff ff es) x
forall a. a -> a
id
{-# INLINE subsume #-}
subsumeUnder :: forall e1 e0 es a ff c. (e1 `In` es, KnownOrder e0, Free c ff) => Eff ff (e0 ': e1 ': es) a -> Eff ff (e0 ': es) a
subsumeUnder :: forall (e1 :: Effect) (e0 :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(In e1 es, KnownOrder e0, Free c ff) =>
Eff ff (e0 : e1 : es) a -> Eff ff (e0 : es) a
subsumeUnder = (Union (e0 : e1 : es) (Eff ff (e0 : es))
~> Union (e0 : es) (Eff ff (e0 : es)))
-> Eff ff (e0 : e1 : es) a -> Eff ff (e0 : es) a
forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll ((Union (e0 : e1 : es) (Eff ff (e0 : es))
~> Union (e0 : es) (Eff ff (e0 : es)))
-> Eff ff (e0 : e1 : es) a -> Eff ff (e0 : es) a)
-> (Union (e0 : e1 : es) (Eff ff (e0 : es))
~> Union (e0 : es) (Eff ff (e0 : es)))
-> Eff ff (e0 : e1 : es) a
-> Eff ff (e0 : es) a
forall a b. (a -> b) -> a -> b
$ Membership e0 (e0 : es)
-> e0 (Eff ff (e0 : es)) x -> Union (e0 : es) (Eff ff (e0 : es)) x
forall (es :: [Effect]) (f :: * -> *) a.
Membership e0 es -> e0 f a -> Union es f a
forall (e :: Effect) (order :: EffectOrder) (es :: [Effect])
(f :: * -> *) a.
Elem e order =>
Membership e es -> e f a -> Union es f a
inject Membership e0 (e0 : es)
forall (e :: Effect) (es :: [Effect]). Membership e (e : es)
Here (e0 (Eff ff (e0 : es)) x -> Union (e0 : es) (Eff ff (e0 : es)) x)
-> (Union (e1 : es) (Eff ff (e0 : es)) x
-> Union (e0 : es) (Eff ff (e0 : es)) x)
-> Union (e0 : e1 : es) (Eff ff (e0 : es)) x
-> Union (e0 : es) (Eff ff (e0 : es)) x
forall (f :: * -> *) a r (es :: [Effect]).
(e0 f a -> r) -> (Union es f a -> r) -> Union (e0 : es) f a -> r
forall (e :: Effect) (order :: EffectOrder) (f :: * -> *) a r
(es :: [Effect]).
Elem e order =>
(e f a -> r) -> (Union es f a -> r) -> Union (e : es) f a -> r
!: Membership e1 (e0 : es)
-> e1 (Eff ff (e0 : es)) x -> Union (e0 : es) (Eff ff (e0 : es)) x
forall (es :: [Effect]) (f :: * -> *) a.
Membership e1 es -> e1 f a -> Union es f a
forall (e :: Effect) (order :: EffectOrder) (es :: [Effect])
(f :: * -> *) a.
Elem e order =>
Membership e es -> e f a -> Union es f a
inject (Membership e1 es -> Membership e1 (e0 : es)
forall (e :: Effect) (es :: [Effect]) (e' :: Effect).
Membership e es -> Membership e (e' : es)
weakenFor Membership e1 es
forall (e :: Effect) (es :: [Effect]).
FindBy
IdentityResolver
(IdentityDiscriminator e)
(IdentityDiscriminator (HeadOf es))
e
es =>
Membership e es
identityMembership) (e1 (Eff ff (e0 : es)) x -> Union (e0 : es) (Eff ff (e0 : es)) x)
-> (Union es (Eff ff (e0 : es)) x
-> Union (e0 : es) (Eff ff (e0 : es)) x)
-> Union (e1 : es) (Eff ff (e0 : es)) x
-> Union (e0 : es) (Eff ff (e0 : es)) x
forall (f :: * -> *) a r (es :: [Effect]).
(e1 f a -> r) -> (Union es f a -> r) -> Union (e1 : es) f a -> r
forall (e :: Effect) (order :: EffectOrder) (f :: * -> *) a r
(es :: [Effect]).
Elem e order =>
(e f a -> r) -> (Union es f a -> r) -> Union (e : es) f a -> r
!: Union es (Eff ff (e0 : es)) x
-> Union (e0 : es) (Eff ff (e0 : es)) x
forall (es :: [Effect]) (f :: * -> *) a (e :: Effect).
Union es f a -> Union (e : es) f a
weaken
{-# INLINE subsumeUnder #-}
transform
:: forall e e' es a ff c
. (KnownOrder e, KnownOrder e', Free c ff)
=> (e (Eff ff (e' ': es)) ~> e' (Eff ff (e' ': es)))
-> Eff ff (e ': es) a
-> Eff ff (e' ': es) a
transform :: forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder e', Free c ff) =>
(e (Eff ff (e' : es)) ~> e' (Eff ff (e' : es)))
-> Eff ff (e : es) a -> Eff ff (e' : es) a
transform e (Eff ff (e' : es)) ~> e' (Eff ff (e' : es))
f = (e ~~> Eff ff (e' : es)) -> Eff ff (e : es) a -> Eff ff (e' : es) a
forall (e :: Effect) (es :: [Effect]) (es' :: [Effect])
(ff :: Effect) a (c :: (* -> *) -> Constraint).
(Suffix es es', KnownOrder e, Free c ff) =>
(e ~~> Eff ff es') -> Eff ff (e : es) a -> Eff ff es' a
reinterpret ((e ~~> Eff ff (e' : es))
-> Eff ff (e : es) a -> Eff ff (e' : es) a)
-> (e ~~> Eff ff (e' : es))
-> Eff ff (e : es) a
-> Eff ff (e' : es) a
forall a b. (a -> b) -> a -> b
$ Membership e' (e' : es)
-> e' (Eff ff (e' : es)) x -> Eff ff (e' : es) x
forall (e :: Effect) (es :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es -> e (Eff ff es) a -> Eff ff es a
sendFor Membership e' (e' : es)
forall (e :: Effect) (es :: [Effect]). Membership e (e : es)
Here (e' (Eff ff (e' : es)) x -> Eff ff (e' : es) x)
-> (e (Eff ff (e' : es)) x -> e' (Eff ff (e' : es)) x)
-> e (Eff ff (e' : es)) x
-> Eff ff (e' : es) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e (Eff ff (e' : es)) x -> e' (Eff ff (e' : es)) x
e (Eff ff (e' : es)) ~> e' (Eff ff (e' : es))
f
{-# INLINE transform #-}
translate
:: forall e e' es a ff c
. (KnownOrder e, e' :> es, Free c ff)
=> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e ': es) a
-> Eff ff es a
translate :: forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, e' :> es, Free c ff) =>
(e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e : es) a -> Eff ff es a
translate = Membership e' es
-> (forall {x}. e (Eff ff es) x -> e' (Eff ff es) x)
-> Eff ff (e : es) a
-> Eff ff es a
forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder e', Free c ff) =>
Membership e' es
-> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e : es) a
-> Eff ff es a
translateFor Membership e' es
forall (e :: Effect) (es :: [Effect]).
FindBy LabelResolver (LabelOf e) (LabelOf (HeadOf es)) e es =>
Membership e es
labelMembership
{-# INLINE translate #-}
translateOn
:: forall key e e' es a ff c
. (KnownOrder e, Has key e' es, Free c ff)
=> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e ': es) a
-> Eff ff es a
translateOn :: forall {k} (key :: k) (e :: Effect) (e' :: Effect) (es :: [Effect])
a (ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, Has key e' es, Free c ff) =>
(e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e : es) a -> Eff ff es a
translateOn e (Eff ff es) ~> e' (Eff ff es)
f = Membership (e' # key) es
-> (e (Eff ff es) ~> (#) e' key (Eff ff es))
-> Eff ff (e : es) a
-> Eff ff es a
forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder e', Free c ff) =>
Membership e' es
-> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e : es) a
-> Eff ff es a
translateFor (forall (key :: k) (e :: Effect) (es :: [Effect]).
FindBy
KeyResolver
(KeyDiscriminator key)
(KeyOf (HeadOf es))
(e # key)
es =>
Membership (e # key) es
forall {k} (key :: k) (e :: Effect) (es :: [Effect]).
FindBy
KeyResolver
(KeyDiscriminator key)
(KeyOf (HeadOf es))
(e # key)
es =>
Membership (e # key) es
keyMembership @key) (e' (Eff ff es) x -> Tagged key e' (Eff ff es) x
forall {k} (tag :: k) (e :: Effect) (f :: * -> *) a.
e f a -> Tagged tag e f a
Tag (e' (Eff ff es) x -> Tagged key e' (Eff ff es) x)
-> (e (Eff ff es) x -> e' (Eff ff es) x)
-> e (Eff ff es) x
-> Tagged key e' (Eff ff es) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e (Eff ff es) x -> e' (Eff ff es) x
e (Eff ff es) ~> e' (Eff ff es)
f)
{-# INLINE translateOn #-}
translateIn
:: forall e e' es a ff c
. (KnownOrder e, e' `In` es, Free c ff)
=> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e ': es) a
-> Eff ff es a
translateIn :: forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, In e' es, Free c ff) =>
(e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e : es) a -> Eff ff es a
translateIn = Membership e' es
-> (forall {x}. e (Eff ff es) x -> e' (Eff ff es) x)
-> Eff ff (e : es) a
-> Eff ff es a
forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder e', Free c ff) =>
Membership e' es
-> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e : es) a
-> Eff ff es a
translateFor Membership e' es
forall (e :: Effect) (es :: [Effect]).
FindBy
IdentityResolver
(IdentityDiscriminator e)
(IdentityDiscriminator (HeadOf es))
e
es =>
Membership e es
identityMembership
{-# INLINE translateIn #-}
translateFor
:: forall e e' es a ff c
. (KnownOrder e, KnownOrder e', Free c ff)
=> Membership e' es
-> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e ': es) a
-> Eff ff es a
translateFor :: forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder e', Free c ff) =>
Membership e' es
-> (e (Eff ff es) ~> e' (Eff ff es))
-> Eff ff (e : es) a
-> Eff ff es a
translateFor Membership e' es
i e (Eff ff es) ~> e' (Eff ff es)
f = (e ~~> Eff ff es) -> Eff ff (e : es) a -> Eff ff es a
forall (e :: Effect) (es :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
(e ~~> Eff ff es) -> Eff ff (e : es) a -> Eff ff es a
interpret ((e ~~> Eff ff es) -> Eff ff (e : es) a -> Eff ff es a)
-> (e ~~> Eff ff es) -> Eff ff (e : es) a -> Eff ff es a
forall a b. (a -> b) -> a -> b
$ Membership e' es -> e' (Eff ff es) x -> Eff ff es x
forall (e :: Effect) (es :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es -> e (Eff ff es) a -> Eff ff es a
sendFor Membership e' es
i (e' (Eff ff es) x -> Eff ff es x)
-> (e (Eff ff es) x -> e' (Eff ff es) x)
-> e (Eff ff es) x
-> Eff ff es x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e (Eff ff es) x -> e' (Eff ff es) x
e (Eff ff es) ~> e' (Eff ff es)
f
{-# INLINE translateFor #-}
rewrite
:: forall e es a ff c
. (e :> es, Free c ff)
=> (e (Eff ff es) ~> e (Eff ff es))
-> Eff ff es a
-> Eff ff es a
rewrite :: forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(e :> es, Free c ff) =>
(e (Eff ff es) ~> e (Eff ff es)) -> Eff ff es a -> Eff ff es a
rewrite = Membership e es
-> (forall {x}. e (Eff ff es) x -> e (Eff ff es) x)
-> Eff ff es a
-> Eff ff es a
forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es
-> (e (Eff ff es) ~> e (Eff ff es)) -> Eff ff es a -> Eff ff es a
rewriteFor Membership e es
forall (e :: Effect) (es :: [Effect]).
FindBy LabelResolver (LabelOf e) (LabelOf (HeadOf es)) e es =>
Membership e es
labelMembership
{-# INLINE rewrite #-}
rewriteOn
:: forall key e es a ff c
. (Has key e es, Free c ff)
=> (e (Eff ff es) ~> e (Eff ff es))
-> Eff ff es a
-> Eff ff es a
rewriteOn :: forall {k} (key :: k) (e :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(Has key e es, Free c ff) =>
(e (Eff ff es) ~> e (Eff ff es)) -> Eff ff es a -> Eff ff es a
rewriteOn e (Eff ff es) ~> e (Eff ff es)
f = Membership (e # key) es
-> ((#) e key (Eff ff es) ~> (#) e key (Eff ff es))
-> Eff ff es a
-> Eff ff es a
forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es
-> (e (Eff ff es) ~> e (Eff ff es)) -> Eff ff es a -> Eff ff es a
rewriteFor (forall (key :: k) (e :: Effect) (es :: [Effect]).
FindBy
KeyResolver
(KeyDiscriminator key)
(KeyOf (HeadOf es))
(e # key)
es =>
Membership (e # key) es
forall {k} (key :: k) (e :: Effect) (es :: [Effect]).
FindBy
KeyResolver
(KeyDiscriminator key)
(KeyOf (HeadOf es))
(e # key)
es =>
Membership (e # key) es
keyMembership @key) (e (Eff ff es) x -> Tagged key e (Eff ff es) x
forall {k} (tag :: k) (e :: Effect) (f :: * -> *) a.
e f a -> Tagged tag e f a
Tag (e (Eff ff es) x -> Tagged key e (Eff ff es) x)
-> (Tagged key e (Eff ff es) x -> e (Eff ff es) x)
-> Tagged key e (Eff ff es) x
-> Tagged key e (Eff ff es) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e (Eff ff es) x -> e (Eff ff es) x
e (Eff ff es) ~> e (Eff ff es)
f (e (Eff ff es) x -> e (Eff ff es) x)
-> (Tagged key e (Eff ff es) x -> e (Eff ff es) x)
-> Tagged key e (Eff ff es) x
-> e (Eff ff es) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tagged key e (Eff ff es) x -> e (Eff ff es) x
forall {k} (tag :: k) (e :: Effect) (f :: * -> *) a.
Tagged tag e f a -> e f a
unTag)
{-# INLINE rewriteOn #-}
rewriteIn
:: forall e es a ff c
. (e `In` es, Free c ff)
=> (e (Eff ff es) ~> e (Eff ff es))
-> Eff ff es a
-> Eff ff es a
rewriteIn :: forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(In e es, Free c ff) =>
(e (Eff ff es) ~> e (Eff ff es)) -> Eff ff es a -> Eff ff es a
rewriteIn = Membership e es
-> (forall {x}. e (Eff ff es) x -> e (Eff ff es) x)
-> Eff ff es a
-> Eff ff es a
forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es
-> (e (Eff ff es) ~> e (Eff ff es)) -> Eff ff es a -> Eff ff es a
rewriteFor Membership e es
forall (e :: Effect) (es :: [Effect]).
FindBy
IdentityResolver
(IdentityDiscriminator e)
(IdentityDiscriminator (HeadOf es))
e
es =>
Membership e es
identityMembership
{-# INLINE rewriteIn #-}
rewriteFor
:: forall e es a ff c
. (KnownOrder e, Free c ff)
=> Membership e es
-> (e (Eff ff es) ~> e (Eff ff es))
-> Eff ff es a
-> Eff ff es a
rewriteFor :: forall (e :: Effect) (es :: [Effect]) a (ff :: Effect)
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es
-> (e (Eff ff es) ~> e (Eff ff es)) -> Eff ff es a -> Eff ff es a
rewriteFor Membership e es
i e (Eff ff es) ~> e (Eff ff es)
f = Membership e es -> (e ~~> Eff ff es) -> Eff ff es a -> Eff ff es a
forall (e :: Effect) (es :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es -> (e ~~> Eff ff es) -> Eff ff es a -> Eff ff es a
interposeFor Membership e es
i (Membership e es -> e (Eff ff es) x -> Eff ff es x
forall (e :: Effect) (es :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
(KnownOrder e, Free c ff) =>
Membership e es -> e (Eff ff es) a -> Eff ff es a
sendFor Membership e es
i (e (Eff ff es) x -> Eff ff es x)
-> (e (Eff ff es) x -> e (Eff ff es) x)
-> e (Eff ff es) x
-> Eff ff es x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e (Eff ff es) x -> e (Eff ff es) x
e (Eff ff es) ~> e (Eff ff es)
f)
{-# INLINE rewriteFor #-}
transAll
:: forall es es' ff a c
. (Free c ff)
=> (Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a
-> Eff ff es' a
transAll :: forall (es :: [Effect]) (es' :: [Effect]) (ff :: Effect) a
(c :: (* -> *) -> Constraint).
Free c ff =>
(Union es (Eff ff es') ~> Union es' (Eff ff es'))
-> Eff ff es a -> Eff ff es' a
transAll Union es (Eff ff es') ~> Union es' (Eff ff es')
f = Eff ff es a -> Eff ff es' a
Eff ff es ~> Eff ff es'
go
where
go :: Eff ff es ~> Eff ff es'
go :: Eff ff es ~> Eff ff es'
go (Eff ff (Union es (Eff ff es)) x
a) = ff (Union es' (Eff ff es')) x -> Eff ff es' x
forall (ff :: Effect) (es :: [Effect]) a.
ff (Union es (Eff ff es)) a -> Eff ff es a
Eff (ff (Union es' (Eff ff es')) x -> Eff ff es' x)
-> ff (Union es' (Eff ff es')) x -> Eff ff es' x
forall a b. (a -> b) -> a -> b
$ (forall x. Union es (Eff ff es) x -> Union es' (Eff ff es') x)
-> ff (Union es (Eff ff es)) x -> ff (Union es' (Eff ff es')) x
forall (f :: * -> *) (g :: * -> *) a.
(forall x. f x -> g x) -> ff f a -> ff g a
forall (c :: (* -> *) -> Constraint) (ff :: Effect) (f :: * -> *)
(g :: * -> *) a.
Free c ff =>
(forall x. f x -> g x) -> ff f a -> ff g a
hoist (Union es (Eff ff es') x -> Union es' (Eff ff es') x
Union es (Eff ff es') ~> Union es' (Eff ff es')
f (Union es (Eff ff es') x -> Union es' (Eff ff es') x)
-> (Union es (Eff ff es) x -> Union es (Eff ff es') x)
-> Union es (Eff ff es) x
-> Union es' (Eff ff es') x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Eff ff es ~> Eff ff es')
-> Union es (Eff ff es) x -> Union es (Eff ff es') x
forall (f :: * -> *) (g :: * -> *) (es :: [Effect]) a.
(forall x. f x -> g x) -> Union es f a -> Union es g a
hfmapUnion Eff ff es x -> Eff ff es' x
Eff ff es ~> Eff ff es'
go) ff (Union es (Eff ff es)) x
a
{-# INLINE transAll #-}
tag
:: forall tag e es a ff c
. (KnownOrder e, KnownOrder (e # tag), Free c ff)
=> Eff ff (e ': es) a
-> Eff ff (e # tag ': es) a
tag :: forall {k} (tag :: k) (e :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder (e # tag), Free c ff) =>
Eff ff (e : es) a -> Eff ff ((e # tag) : es) a
tag = (e (Eff ff ((e # tag) : es))
~> (#) e tag (Eff ff ((e # tag) : es)))
-> Eff ff (e : es) a -> Eff ff ((e # tag) : es) a
forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder e', Free c ff) =>
(e (Eff ff (e' : es)) ~> e' (Eff ff (e' : es)))
-> Eff ff (e : es) a -> Eff ff (e' : es) a
transform e (Eff ff ((e # tag) : es)) x
-> Tagged tag e (Eff ff ((e # tag) : es)) x
e (Eff ff ((e # tag) : es)) ~> (#) e tag (Eff ff ((e # tag) : es))
forall {k} (tag :: k) (e :: Effect) (f :: * -> *) a.
e f a -> Tagged tag e f a
Tag
{-# INLINE tag #-}
untag
:: forall tag e es a ff c
. (KnownOrder e, KnownOrder (e # tag), Free c ff)
=> Eff ff (e # tag ': es) a
-> Eff ff (e ': es) a
untag :: forall {k} (tag :: k) (e :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder (e # tag), Free c ff) =>
Eff ff ((e # tag) : es) a -> Eff ff (e : es) a
untag = ((#) e tag (Eff ff (e : es)) ~> e (Eff ff (e : es)))
-> Eff ff ((e # tag) : es) a -> Eff ff (e : es) a
forall (e :: Effect) (e' :: Effect) (es :: [Effect]) a
(ff :: Effect) (c :: (* -> *) -> Constraint).
(KnownOrder e, KnownOrder e', Free c ff) =>
(e (Eff ff (e' : es)) ~> e' (Eff ff (e' : es)))
-> Eff ff (e : es) a -> Eff ff (e' : es) a
transform Tagged tag e (Eff ff (e : es)) x -> e (Eff ff (e : es)) x
(#) e tag (Eff ff (e : es)) ~> e (Eff ff (e : es))
forall {k} (tag :: k) (e :: Effect) (f :: * -> *) a.
Tagged tag e f a -> e f a
unTag
{-# INLINE untag #-}