{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Polysemy.Methodology.Composite (
runMethodologyRmap
, runCoRecMethodologyAsCases
, runCoRecMethodologyAsCases'
, diffractMethodology
, diffractMethodology'
, runInputCase'
, pickCoRecConstructor
, separateRecInitial
, separateRecInitial'
, stripRecInitial
, endRecInitial
, runRecInitialAsInputCompose
, runRecInitialAsInputCompose'
, separateRecTerminal
, separateRecTerminal'
, stripRecTerminal
, endRecTerminal
, fmapCMethodology
, fmapCMethodology'
) where
import Control.Arrow
import Composite.CoRecord
import Data.Vinyl
import Data.Vinyl.Functor
import Polysemy
import Polysemy.Extra
import Polysemy.Input
import Polysemy.Methodology
runMethodologyRmap :: forall f g xs r a. RMap xs =>
(forall y. f y -> g y)
-> Sem (Methodology (Rec f xs) (Rec g xs) ': r) a
-> Sem r a
runMethodologyRmap :: (forall (y :: u). f y -> g y)
-> Sem (Methodology (Rec f xs) (Rec g xs) : r) a -> Sem r a
runMethodologyRmap forall (y :: u). f y -> g y
f = (Rec f xs -> Rec g xs)
-> Sem (Methodology (Rec f xs) (Rec g xs) : r) a -> Sem r a
forall b c (r :: [(* -> *) -> * -> *]) a.
(b -> c) -> Sem (Methodology b c : r) a -> Sem r a
runMethodologyPure ((forall (y :: u). f y -> g y) -> Rec f xs -> Rec g xs
forall u (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall (y :: u). f y -> g y
f)
{-# INLINE runMethodologyRmap #-}
runCoRecMethodologyAsCases :: forall f zs c x xs r a.
(zs ~ (x ': xs), RecApplicative zs, Members '[Input (Cases' f zs c)] r)
=> Sem (Methodology (CoRec f zs) c ': r) a
-> Sem r a
runCoRecMethodologyAsCases :: Sem (Methodology (CoRec f zs) c : r) a -> Sem r a
runCoRecMethodologyAsCases = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology (CoRec f zs) c (Sem rInitial) x -> Sem r x)
-> Sem (Methodology (CoRec f zs) c : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Process b -> do
Cases' f zs c
x <- forall (r :: [(* -> *) -> * -> *]).
MemberWithError (Input (Cases' f zs c)) r =>
Sem r (Cases' f zs c)
forall i (r :: [(* -> *) -> * -> *]).
MemberWithError (Input i) r =>
Sem r i
input @(Cases' f zs c)
c -> Sem r c
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> Sem r c) -> c -> Sem r c
forall a b. (a -> b) -> a -> b
$ Cases' f (x : xs) c -> CoRec f (x : xs) -> c
forall a (r :: a) (rs :: [a]) (f :: a -> *) b.
RecApplicative (r : rs) =>
Cases' f (r : rs) b -> CoRec f (r : rs) -> b
foldCoRec Cases' f zs c
Cases' f (x : xs) c
x CoRec f (x : xs)
b
{-# INLINE runCoRecMethodologyAsCases #-}
runCoRecMethodologyAsCases' :: forall f zs c x xs r a.
(zs ~ (x ': xs), RecApplicative zs)
=> Sem (Methodology (CoRec f zs) c ': r) a
-> Sem (Input (Cases' f zs c) ': r) a
runCoRecMethodologyAsCases' :: Sem (Methodology (CoRec f zs) c : r) a
-> Sem (Input (Cases' f zs c) : r) a
runCoRecMethodologyAsCases' = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology (CoRec f zs) c (Sem rInitial) x
-> Sem (Input (Cases' f zs c) : r) x)
-> Sem (Methodology (CoRec f zs) c : r) a
-> Sem (Input (Cases' f zs c) : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
reinterpret \case
Process b -> do
Cases' f zs c
x <- forall (r :: [(* -> *) -> * -> *]).
MemberWithError (Input (Cases' f zs c)) r =>
Sem r (Cases' f zs c)
forall i (r :: [(* -> *) -> * -> *]).
MemberWithError (Input i) r =>
Sem r i
input @(Cases' f zs c)
c -> Sem (Input (Cases' f zs c) : r) c
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> Sem (Input (Cases' f zs c) : r) c)
-> c -> Sem (Input (Cases' f zs c) : r) c
forall a b. (a -> b) -> a -> b
$ Cases' f (x : xs) c -> CoRec f (x : xs) -> c
forall a (r :: a) (rs :: [a]) (f :: a -> *) b.
RecApplicative (r : rs) =>
Cases' f (r : rs) b -> CoRec f (r : rs) -> b
foldCoRec Cases' f zs c
Cases' f (x : xs) c
x CoRec f (x : xs)
b
{-# INLINE runCoRecMethodologyAsCases' #-}
diffractMethodology :: forall b f zs d x xs r a.
(Monoid d, zs ~ (x ': xs)
, RecApplicative zs
, Members '[ Methodology b [CoRec f zs]
, Input (Cases' f zs d)] r)
=> Sem (Methodology b d ': r) a
-> Sem r a
diffractMethodology :: Sem (Methodology b d : r) a -> Sem r a
diffractMethodology = forall (r :: [(* -> *) -> * -> *]) a.
Sem (Methodology b d : r) a
-> Sem
(Methodology b [CoRec f zs] : Methodology [CoRec f zs] d : r) a
forall b c d (r :: [(* -> *) -> * -> *]) a.
Sem (Methodology b d : r) a
-> Sem (Methodology b c : Methodology c d : r) a
cutMethodology' @b @[CoRec f zs] @d
(Sem (Methodology b d : r) a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a)
-> (Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem r a)
-> Sem (Methodology b d : r) a
-> Sem r a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology [CoRec f (x : xs)] d : m) x
-> Sem (Methodology (CoRec f (x : xs)) d : m) x)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(e3 :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
(forall (m :: [(* -> *) -> * -> *]) x.
Sem (e2 : m) x -> Sem (e3 : m) x)
-> Sem (e1 : e2 : r) a -> Sem (e1 : e3 : r) a
reinterpretUnder forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology [CoRec f (x : xs)] d : m) x
-> Sem (Methodology (CoRec f (x : xs)) d : m) x
forall (f :: * -> *) b c (r :: [(* -> *) -> * -> *]) a.
(Monoid c, Traversable f) =>
Sem (Methodology (f b) c : r) a -> Sem (Methodology b c : r) a
mconcatMethodology'
(Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a)
-> (Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
-> Sem r a)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem r a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology (CoRec f (x : xs)) d : m) x
-> Sem (Input (Cases' f (x : xs) d) : m) x)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(e3 :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
(forall (m :: [(* -> *) -> * -> *]) x.
Sem (e2 : m) x -> Sem (e3 : m) x)
-> Sem (e1 : e2 : r) a -> Sem (e1 : e3 : r) a
reinterpretUnder forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology (CoRec f (x : xs)) d : m) x
-> Sem (Input (Cases' f (x : xs) d) : m) x
forall u (f :: u -> *) (zs :: [u]) c (x :: u) (xs :: [u])
(r :: [(* -> *) -> * -> *]) a.
(zs ~ (x : xs), RecApplicative zs) =>
Sem (Methodology (CoRec f zs) c : r) a
-> Sem (Input (Cases' f zs c) : r) a
runCoRecMethodologyAsCases'
(Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a)
-> (Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
-> Sem r a)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
-> Sem r a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
-> Sem (Input (Cases' f (x : xs) d) : r) a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Member e r =>
Sem (e : r) a -> Sem r a
subsume (Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
-> Sem (Input (Cases' f (x : xs) d) : r) a)
-> (Sem (Input (Cases' f (x : xs) d) : r) a -> Sem r a)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
-> Sem r a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Sem (Input (Cases' f (x : xs) d) : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Member e r =>
Sem (e : r) a -> Sem r a
subsume
{-# INLINE diffractMethodology #-}
diffractMethodology' :: forall b f zs d x xs r a.
(Monoid d, zs ~ (x ': xs), RecApplicative zs)
=> Sem (Methodology b d ': r) a
-> Sem (Methodology b [CoRec f zs] ': Input (Cases' f zs d) ': r) a
diffractMethodology' :: Sem (Methodology b d : r) a
-> Sem (Methodology b [CoRec f zs] : Input (Cases' f zs d) : r) a
diffractMethodology' = forall (r :: [(* -> *) -> * -> *]) a.
Sem (Methodology b d : r) a
-> Sem
(Methodology b [CoRec f zs] : Methodology [CoRec f zs] d : r) a
forall b c d (r :: [(* -> *) -> * -> *]) a.
Sem (Methodology b d : r) a
-> Sem (Methodology b c : Methodology c d : r) a
cutMethodology' @b @[CoRec f zs] @d
(Sem (Methodology b d : r) a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a)
-> (Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a)
-> Sem (Methodology b d : r) a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology [CoRec f (x : xs)] d : m) x
-> Sem (Methodology (CoRec f (x : xs)) d : m) x)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(e3 :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
(forall (m :: [(* -> *) -> * -> *]) x.
Sem (e2 : m) x -> Sem (e3 : m) x)
-> Sem (e1 : e2 : r) a -> Sem (e1 : e3 : r) a
reinterpretUnder forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology [CoRec f (x : xs)] d : m) x
-> Sem (Methodology (CoRec f (x : xs)) d : m) x
forall (f :: * -> *) b c (r :: [(* -> *) -> * -> *]) a.
(Monoid c, Traversable f) =>
Sem (Methodology (f b) c : r) a -> Sem (Methodology b c : r) a
mconcatMethodology'
(Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a)
-> (Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology [CoRec f (x : xs)] d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology (CoRec f (x : xs)) d : m) x
-> Sem (Input (Cases' f (x : xs) d) : m) x)
-> Sem
(Methodology b [CoRec f (x : xs)]
: Methodology (CoRec f (x : xs)) d : r)
a
-> Sem
(Methodology b [CoRec f (x : xs)]
: Input (Cases' f (x : xs) d) : r)
a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(e3 :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
(forall (m :: [(* -> *) -> * -> *]) x.
Sem (e2 : m) x -> Sem (e3 : m) x)
-> Sem (e1 : e2 : r) a -> Sem (e1 : e3 : r) a
reinterpretUnder forall (m :: [(* -> *) -> * -> *]) x.
Sem (Methodology (CoRec f (x : xs)) d : m) x
-> Sem (Input (Cases' f (x : xs) d) : m) x
forall u (f :: u -> *) (zs :: [u]) c (x :: u) (xs :: [u])
(r :: [(* -> *) -> * -> *]) a.
(zs ~ (x : xs), RecApplicative zs) =>
Sem (Methodology (CoRec f zs) c : r) a
-> Sem (Input (Cases' f zs c) : r) a
runCoRecMethodologyAsCases'
{-# INLINE diffractMethodology' #-}
runInputCase' :: forall b f t r a.
(f b -> t)
-> Sem (Input (Case' f t b) ': r) a
-> Sem r a
runInputCase' :: (f b -> t) -> Sem (Input (Case' f t b) : r) a -> Sem r a
runInputCase' f b -> t
f = Case' f t b -> Sem (Input (Case' f t b) : r) a -> Sem r a
forall i (r :: [(* -> *) -> * -> *]) a.
i -> Sem (Input i : r) a -> Sem r a
runInputConst ((f b -> t) -> Case' f t b
forall k (f :: k -> *) b (a :: k). (f a -> b) -> Case' f b a
Case' f b -> t
f)
{-# INLINE runInputCase' #-}
pickCoRecConstructor :: forall x f b xs r a. x ∈ xs =>
Sem (Methodology b (CoRec f xs) ': r) a
-> Sem (Methodology b (f x) ': r) a
pickCoRecConstructor :: Sem (Methodology b (CoRec f xs) : r) a
-> Sem (Methodology b (f x) : r) a
pickCoRecConstructor = Sem (Methodology b (CoRec f xs) : r) a
-> Sem (Methodology b (f x) : Methodology (f x) (CoRec f xs) : r) a
forall b c d (r :: [(* -> *) -> * -> *]) a.
Sem (Methodology b d : r) a
-> Sem (Methodology b c : Methodology c d : r) a
cutMethodology'
(Sem (Methodology b (CoRec f xs) : r) a
-> Sem
(Methodology b (f x) : Methodology (f x) (CoRec f xs) : r) a)
-> (Sem
(Methodology b (f x) : Methodology (f x) (CoRec f xs) : r) a
-> Sem (Methodology b (f x) : r) a)
-> Sem (Methodology b (CoRec f xs) : r) a
-> Sem (Methodology b (f x) : r) a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Sem (Methodology b (f x) : Methodology (f x) (CoRec f xs) : r) a
-> Sem (Methodology (f x) (CoRec f xs) : Methodology b (f x) : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
Sem (e1 : e2 : r) a -> Sem (e2 : e1 : r) a
rotateEffects2
(Sem (Methodology b (f x) : Methodology (f x) (CoRec f xs) : r) a
-> Sem
(Methodology (f x) (CoRec f xs) : Methodology b (f x) : r) a)
-> (Sem
(Methodology (f x) (CoRec f xs) : Methodology b (f x) : r) a
-> Sem (Methodology b (f x) : r) a)
-> Sem (Methodology b (f x) : Methodology (f x) (CoRec f xs) : r) a
-> Sem (Methodology b (f x) : r) a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (f x -> CoRec f xs)
-> Sem (Methodology (f x) (CoRec f xs) : Methodology b (f x) : r) a
-> Sem (Methodology b (f x) : r) a
forall b c (r :: [(* -> *) -> * -> *]) a.
(b -> c) -> Sem (Methodology b c : r) a -> Sem r a
runMethodologyPure f x -> CoRec f xs
forall u (r :: u) (b :: [u]) (a :: u -> *).
(r ∈ b) =>
a r -> CoRec a b
CoVal
{-# INLINE pickCoRecConstructor #-}
separateRecInitial :: forall b f x xs r a.
Members '[Methodology b (f x), Methodology b (Rec f xs)] r
=> Sem (Methodology b (Rec f (x ': xs)) ': r) a
-> Sem r a
separateRecInitial :: Sem (Methodology b (Rec f (x : xs)) : r) a -> Sem r a
separateRecInitial = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology b (Rec f (x : xs)) (Sem rInitial) x -> Sem r x)
-> Sem (Methodology b (Rec f (x : xs)) : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Process b -> do
f x
k <- b -> Sem r (f x)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @b @(f x) b
b
Rec f xs
k' <- b -> Sem r (Rec f xs)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @b @(Rec f xs) b
b
Rec f (x : xs) -> Sem r (Rec f (x : xs))
forall (m :: * -> *) a. Monad m => a -> m a
return (Rec f (x : xs) -> Sem r (Rec f (x : xs)))
-> Rec f (x : xs) -> Sem r (Rec f (x : xs))
forall a b. (a -> b) -> a -> b
$ f x
k f x -> Rec f xs -> Rec f (x : xs)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec f xs
k'
{-# INLINE separateRecInitial #-}
separateRecInitial' :: forall b f x xs r a.
Sem (Methodology b (Rec f (x ': xs)) ': r) a
-> Sem (Methodology b (f x) ': Methodology b (Rec f xs)': r) a
separateRecInitial' :: Sem (Methodology b (Rec f (x : xs)) : r) a
-> Sem (Methodology b (f x) : Methodology b (Rec f xs) : r) a
separateRecInitial' = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology b (Rec f (x : xs)) (Sem rInitial) x
-> Sem (Methodology b (f x) : Methodology b (Rec f xs) : r) x)
-> Sem (Methodology b (Rec f (x : xs)) : r) a
-> Sem (Methodology b (f x) : Methodology b (Rec f xs) : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(e3 :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret2" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : e3 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : e3 : r) a
reinterpret2 \case
Process b -> do
f x
k <- b -> Sem (Methodology b (f x) : Methodology b (Rec f xs) : r) (f x)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @b @(f x) b
b
Rec f xs
k' <- Sem (Methodology b (Rec f xs) : r) (Rec f xs)
-> Sem
(Methodology b (f x) : Methodology b (Rec f xs) : r) (Rec f xs)
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
raise (Sem (Methodology b (Rec f xs) : r) (Rec f xs)
-> Sem
(Methodology b (f x) : Methodology b (Rec f xs) : r) (Rec f xs))
-> Sem (Methodology b (Rec f xs) : r) (Rec f xs)
-> Sem
(Methodology b (f x) : Methodology b (Rec f xs) : r) (Rec f xs)
forall a b. (a -> b) -> a -> b
$ b -> Sem (Methodology b (Rec f xs) : r) (Rec f xs)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @b @(Rec f xs) b
b
Rec f (x : xs)
-> Sem
(Methodology b (f x) : Methodology b (Rec f xs) : r)
(Rec f (x : xs))
forall (m :: * -> *) a. Monad m => a -> m a
return (Rec f (x : xs)
-> Sem
(Methodology b (f x) : Methodology b (Rec f xs) : r)
(Rec f (x : xs)))
-> Rec f (x : xs)
-> Sem
(Methodology b (f x) : Methodology b (Rec f xs) : r)
(Rec f (x : xs))
forall a b. (a -> b) -> a -> b
$ f x
k f x -> Rec f xs -> Rec f (x : xs)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec f xs
k'
{-# INLINE separateRecInitial' #-}
stripRecInitial :: forall b f x xs r a.
Members '[Methodology b (f x)] (Methodology b (Rec f xs) ': r)
=> Sem (Methodology b (Rec f (x ': xs)) ': r) a
-> Sem (Methodology b (Rec f xs)': r) a
stripRecInitial :: Sem (Methodology b (Rec f (x : xs)) : r) a
-> Sem (Methodology b (Rec f xs) : r) a
stripRecInitial = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology b (Rec f (x : xs)) (Sem rInitial) x
-> Sem (Methodology b (Rec f xs) : r) x)
-> Sem (Methodology b (Rec f (x : xs)) : r) a
-> Sem (Methodology b (Rec f xs) : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
reinterpret \case
Process b -> do
f x
k <- b -> Sem (Methodology b (Rec f xs) : r) (f x)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @b @(f x) b
b
Rec f xs
k' <- b -> Sem (Methodology b (Rec f xs) : r) (Rec f xs)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @b @(Rec f xs) b
b
Rec f (x : xs)
-> Sem (Methodology b (Rec f xs) : r) (Rec f (x : xs))
forall (m :: * -> *) a. Monad m => a -> m a
return (Rec f (x : xs)
-> Sem (Methodology b (Rec f xs) : r) (Rec f (x : xs)))
-> Rec f (x : xs)
-> Sem (Methodology b (Rec f xs) : r) (Rec f (x : xs))
forall a b. (a -> b) -> a -> b
$ f x
k f x -> Rec f xs -> Rec f (x : xs)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
:& Rec f xs
k'
{-# INLINE stripRecInitial #-}
endRecInitial :: Sem (Methodology b (Rec f '[]) ': r) a -> Sem r a
endRecInitial :: Sem (Methodology b (Rec f '[]) : r) a -> Sem r a
endRecInitial = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology b (Rec f '[]) (Sem rInitial) x -> Sem r x)
-> Sem (Methodology b (Rec f '[]) : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Process _ -> Rec f '[] -> Sem r (Rec f '[])
forall (m :: * -> *) a. Monad m => a -> m a
return Rec f '[]
forall u (a :: u -> *). Rec a '[]
RNil
{-# INLINE endRecInitial #-}
runRecInitialAsInputCompose :: forall b f xs r a. (RMap xs,
Members '[ Input (Rec (Compose ((->) b) f) xs)] r)
=> Sem (Methodology b (Rec f xs) ': r) a
-> Sem r a
runRecInitialAsInputCompose :: Sem (Methodology b (Rec f xs) : r) a -> Sem r a
runRecInitialAsInputCompose = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology b (Rec f xs) (Sem rInitial) x -> Sem r x)
-> Sem (Methodology b (Rec f xs) : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Process b -> do
Rec (Compose ((->) b) f) xs
z <- forall (r :: [(* -> *) -> * -> *]).
MemberWithError (Input (Rec (Compose ((->) b) f) xs)) r =>
Sem r (Rec (Compose ((->) b) f) xs)
forall i (r :: [(* -> *) -> * -> *]).
MemberWithError (Input i) r =>
Sem r i
input @(Rec (Compose ((->) b) f) xs)
Rec f xs -> Sem r (Rec f xs)
forall (m :: * -> *) a. Monad m => a -> m a
return (Rec f xs -> Sem r (Rec f xs)) -> Rec f xs -> Sem r (Rec f xs)
forall a b. (a -> b) -> a -> b
$ (forall (x :: u). Compose ((->) b) f x -> f x)
-> Rec (Compose ((->) b) f) xs -> Rec f xs
forall u (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap (((b -> f x) -> b -> f x
forall a b. (a -> b) -> a -> b
$ b
b) ((b -> f x) -> f x)
-> (Compose ((->) b) f x -> b -> f x)
-> Compose ((->) b) f x
-> f x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compose ((->) b) f x -> b -> f x
forall l (f :: l -> *) k (g :: k -> l) (x :: k).
Compose f g x -> f (g x)
getCompose) Rec (Compose ((->) b) f) xs
z
{-# INLINE runRecInitialAsInputCompose #-}
runRecInitialAsInputCompose' :: forall b f xs r a. (RMap xs)
=> Sem (Methodology b (Rec f xs) ': r) a
-> Sem (Input (Rec (Compose ((->) b) f) xs) ': r) a
runRecInitialAsInputCompose' :: Sem (Methodology b (Rec f xs) : r) a
-> Sem (Input (Rec (Compose ((->) b) f) xs) : r) a
runRecInitialAsInputCompose' = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology b (Rec f xs) (Sem rInitial) x
-> Sem (Input (Rec (Compose ((->) b) f) xs) : r) x)
-> Sem (Methodology b (Rec f xs) : r) a
-> Sem (Input (Rec (Compose ((->) b) f) xs) : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
reinterpret \case
Process b -> do
Rec (Compose ((->) b) f) xs
z <- forall (r :: [(* -> *) -> * -> *]).
MemberWithError (Input (Rec (Compose ((->) b) f) xs)) r =>
Sem r (Rec (Compose ((->) b) f) xs)
forall i (r :: [(* -> *) -> * -> *]).
MemberWithError (Input i) r =>
Sem r i
input @(Rec (Compose ((->) b) f) xs)
Rec f xs
-> Sem (Input (Rec (Compose ((->) b) f) xs) : r) (Rec f xs)
forall (m :: * -> *) a. Monad m => a -> m a
return (Rec f xs
-> Sem (Input (Rec (Compose ((->) b) f) xs) : r) (Rec f xs))
-> Rec f xs
-> Sem (Input (Rec (Compose ((->) b) f) xs) : r) (Rec f xs)
forall a b. (a -> b) -> a -> b
$ (forall (x :: u). Compose ((->) b) f x -> f x)
-> Rec (Compose ((->) b) f) xs -> Rec f xs
forall u (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap (((b -> f x) -> b -> f x
forall a b. (a -> b) -> a -> b
$ b
b) ((b -> f x) -> f x)
-> (Compose ((->) b) f x -> b -> f x)
-> Compose ((->) b) f x
-> f x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compose ((->) b) f x -> b -> f x
forall l (f :: l -> *) k (g :: k -> l) (x :: k).
Compose f g x -> f (g x)
getCompose) Rec (Compose ((->) b) f) xs
z
{-# INLINE runRecInitialAsInputCompose' #-}
separateRecTerminal :: forall x c f xs r a. (Monoid c,
Members '[Methodology (f x) c, Methodology (Rec f xs) c] r)
=> Sem (Methodology (Rec f (x ': xs)) c ': r) a
-> Sem r a
separateRecTerminal :: Sem (Methodology (Rec f (x : xs)) c : r) a -> Sem r a
separateRecTerminal = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology (Rec f (x : xs)) c (Sem rInitial) x -> Sem r x)
-> Sem (Methodology (Rec f (x : xs)) c : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Process (b :& bs) -> do
c
k <- f x -> Sem r c
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(f x) f x
f r
b
c
k' <- Rec f xs -> Sem r c
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(Rec f xs) @c Rec f xs
Rec f rs
bs
c -> Sem r c
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> Sem r c) -> c -> Sem r c
forall a b. (a -> b) -> a -> b
$ c
k c -> c -> c
forall a. Semigroup a => a -> a -> a
<> c
k'
{-# INLINE separateRecTerminal #-}
separateRecTerminal' :: forall x c f xs r a. Monoid c
=> Sem (Methodology (Rec f (x ': xs)) c ': r) a
-> Sem (Methodology (f x) c ': Methodology (Rec f xs) c ': r) a
separateRecTerminal' :: Sem (Methodology (Rec f (x : xs)) c : r) a
-> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) a
separateRecTerminal' = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology (Rec f (x : xs)) c (Sem rInitial) x
-> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) x)
-> Sem (Methodology (Rec f (x : xs)) c : r) a
-> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(e3 :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret2" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : e3 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : e3 : r) a
reinterpret2 \case
Process (b :& bs) -> do
c
k <- f x -> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) c
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(f x) f x
f r
b
c
k' <- Sem (Methodology (Rec f xs) c : r) c
-> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) c
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
raise (Sem (Methodology (Rec f xs) c : r) c
-> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) c)
-> Sem (Methodology (Rec f xs) c : r) c
-> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) c
forall a b. (a -> b) -> a -> b
$ Rec f xs -> Sem (Methodology (Rec f xs) c : r) c
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(Rec f xs) @c Rec f xs
Rec f rs
bs
c -> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) c
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) c)
-> c -> Sem (Methodology (f x) c : Methodology (Rec f xs) c : r) c
forall a b. (a -> b) -> a -> b
$ c
k c -> c -> c
forall a. Semigroup a => a -> a -> a
<> c
k'
{-# INLINE separateRecTerminal' #-}
stripRecTerminal :: forall x c f xs r a. (Monoid c,
Members '[Methodology (f x) c] (Methodology (Rec f xs) c ': r))
=> Sem (Methodology (Rec f (x ': xs)) c ': r) a
-> Sem (Methodology (Rec f xs) c ': r) a
stripRecTerminal :: Sem (Methodology (Rec f (x : xs)) c : r) a
-> Sem (Methodology (Rec f xs) c : r) a
stripRecTerminal = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology (Rec f (x : xs)) c (Sem rInitial) x
-> Sem (Methodology (Rec f xs) c : r) x)
-> Sem (Methodology (Rec f (x : xs)) c : r) a
-> Sem (Methodology (Rec f xs) c : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
reinterpret \case
Process (b :& bs) -> do
c
k <- f x -> Sem (Methodology (Rec f xs) c : r) c
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(f x) f x
f r
b
c
k' <- Rec f xs -> Sem (Methodology (Rec f xs) c : r) c
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(Rec f xs) @c Rec f xs
Rec f rs
bs
c -> Sem (Methodology (Rec f xs) c : r) c
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> Sem (Methodology (Rec f xs) c : r) c)
-> c -> Sem (Methodology (Rec f xs) c : r) c
forall a b. (a -> b) -> a -> b
$ c
k c -> c -> c
forall a. Semigroup a => a -> a -> a
<> c
k'
{-# INLINE stripRecTerminal #-}
endRecTerminal :: Monoid b => Sem (Methodology (Rec f '[]) b ': r) a -> Sem r a
endRecTerminal :: Sem (Methodology (Rec f '[]) b : r) a -> Sem r a
endRecTerminal = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology (Rec f '[]) b (Sem rInitial) x -> Sem r x)
-> Sem (Methodology (Rec f '[]) b : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Process _ -> x -> Sem r x
forall (m :: * -> *) a. Monad m => a -> m a
return x
forall a. Monoid a => a
mempty
{-# INLINE endRecTerminal #-}
fmapCMethodology :: forall f g h b c r a. Traversable f =>
Sem (Methodology ((f :. g) b) ((f :. h) c) ': r) a
-> Sem (Methodology (g b) (h c) ': r) a
fmapCMethodology :: Sem (Methodology ((:.) f g b) ((:.) f h c) : r) a
-> Sem (Methodology (g b) (h c) : r) a
fmapCMethodology = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology ((:.) f g b) ((:.) f h c) (Sem rInitial) x
-> Sem (Methodology (g b) (h c) : r) x)
-> Sem (Methodology ((:.) f g b) ((:.) f h c) : r) a
-> Sem (Methodology (g b) (h c) : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
reinterpret \case
Process b -> f (h c) -> (:.) f h c
forall l k (f :: l -> *) (g :: k -> l) (x :: k).
f (g x) -> Compose f g x
Compose (f (h c) -> (:.) f h c)
-> Sem (Methodology (g b) (h c) : r) (f (h c))
-> Sem (Methodology (g b) (h c) : r) ((:.) f h c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (g b -> Sem (Methodology (g b) (h c) : r) (h c))
-> f (g b) -> Sem (Methodology (g b) (h c) : r) (f (h c))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology (g b) (h c)) r =>
g b -> Sem r (h c)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(g b) @(h c)) ((:.) f g b -> f (g b)
forall l (f :: l -> *) k (g :: k -> l) (x :: k).
Compose f g x -> f (g x)
getCompose (:.) f g b
b)
{-# INLINE fmapCMethodology #-}
fmapCMethodology' :: forall f g h b c r a. Traversable f =>
Sem (Methodology ((f :. g) b) ((f :. h) c) ': r) a
-> Sem (Methodology (g b) (h c) ': r) a
fmapCMethodology' :: Sem (Methodology ((:.) f g b) ((:.) f h c) : r) a
-> Sem (Methodology (g b) (h c) : r) a
fmapCMethodology' = (forall (rInitial :: [(* -> *) -> * -> *]) x.
Methodology ((:.) f g b) ((:.) f h c) (Sem rInitial) x
-> Sem (Methodology (g b) (h c) : r) x)
-> Sem (Methodology ((:.) f g b) ((:.) f h c) : r) a
-> Sem (Methodology (g b) (h c) : r) a
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e1 (Sem rInitial) x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
reinterpret \case
Process b -> f (h c) -> (:.) f h c
forall l k (f :: l -> *) (g :: k -> l) (x :: k).
f (g x) -> Compose f g x
Compose (f (h c) -> (:.) f h c)
-> Sem (Methodology (g b) (h c) : r) (f (h c))
-> Sem (Methodology (g b) (h c) : r) ((:.) f h c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (g b -> Sem (Methodology (g b) (h c) : r) (h c))
-> f (g b) -> Sem (Methodology (g b) (h c) : r) (f (h c))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology (g b) (h c)) r =>
g b -> Sem r (h c)
forall b c (r :: [(* -> *) -> * -> *]).
MemberWithError (Methodology b c) r =>
b -> Sem r c
process @(g b) @(h c)) ((:.) f g b -> f (g b)
forall l (f :: l -> *) k (g :: k -> l) (x :: k).
Compose f g x -> f (g x)
getCompose (:.) f g b
b)
{-# INLINE fmapCMethodology' #-}