{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Circuit.System
(
SystemT (..),
System,
system,
runSystem,
mooreSystem,
SystemEval (..),
fromEvalSystem,
toEvalSystem,
step,
monoDir,
monoIn,
parWiring,
SomePoles (..),
runSomePoles,
systemToPolesWithProbe,
systemWithSeedToPoles,
runSystemMono,
systemAsLens,
lensAsSystem,
duplicateSystem,
branchSystem,
runSystemSum,
branchSystemHet,
runSystemSumHet,
SumStep (..),
Coalgebra (..),
Step,
coalgebraToSystem,
composeCoalgebra,
systemToCoalgebraMono,
)
where
import Circuit.Body (Body (..))
import Circuit.Category ((.>))
import Circuit.Poles (HasDual (..), Poles (..))
import Circuit.Poles qualified as Poles
import Circuit.Poly
( Dir,
Eval (..),
Mono,
Morphism (..),
Netlist,
Poly (..),
Pos,
applyLens,
lens,
nestedToComp,
runMorphism,
)
import Control.Category (id, (.))
import Data.Bifunctor
import Data.Kind (Type)
import Data.Void (Void, absurd)
import Prelude hiding (id, (.))
newtype SystemT (t :: Type -> Type -> Type) (arr :: Type -> Type -> Type) s (p :: Poly)
= SystemT (Body t s arr (Dir p) (Pos p))
type System = SystemT (,)
system :: arr (s, Dir p) (s, Pos p) -> System arr s p
system :: forall (arr :: * -> * -> *) s (p :: Poly).
arr (s, Dir p) (s, Pos p) -> System arr s p
system = Body (,) s arr (Dir p) (Pos p) -> System arr s p
forall (t :: * -> * -> *) (arr :: * -> * -> *) s (p :: Poly).
Body t s arr (Dir p) (Pos p) -> SystemT t arr s p
SystemT (Body (,) s arr (Dir p) (Pos p) -> System arr s p)
-> (arr (s, Dir p) (s, Pos p) -> Body (,) s arr (Dir p) (Pos p))
-> arr (s, Dir p) (s, Pos p)
-> System arr s p
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. arr (s, Dir p) (s, Pos p) -> Body (,) s arr (Dir p) (Pos p)
forall {k} {k1} {k2} (t :: k -> k1 -> k2) (ch :: k)
(arr :: k2 -> k2 -> *) (a :: k1) (b :: k1).
arr (t ch a) (t ch b) -> Body t ch arr a b
Body
runSystem :: System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem :: forall (arr :: * -> * -> *) s (p :: Poly).
System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem (SystemT (Body arr (s, Dir p) (s, Pos p)
f)) = arr (s, Dir p) (s, Pos p)
f
mooreSystem :: (s -> a -> s) -> (s -> b) -> System (->) s (Mono a b)
mooreSystem :: forall s a b. (s -> a -> s) -> (s -> b) -> System (->) s (Mono a b)
mooreSystem s -> a -> s
st s -> b
ex =
((s, Dir (Mono a b)) -> (s, Pos (Mono a b)))
-> System (->) s (Mono a b)
forall (arr :: * -> * -> *) s (p :: Poly).
arr (s, Dir p) (s, Pos p) -> System arr s p
system (((s, Dir (Mono a b)) -> (s, Pos (Mono a b)))
-> System (->) s (Mono a b))
-> ((s, Dir (Mono a b)) -> (s, Pos (Mono a b)))
-> System (->) s (Mono a b)
forall a b. (a -> b) -> a -> b
$ \case
(s
_, Left Void
v) -> Void -> (s, (b, ()))
forall a. Void -> a
absurd Void
v
(s
s, Right a
a) ->
let s' :: s
s' = s -> a -> s
st s
s a
a
in (s
s', (s -> b
ex s
s', ()))
monoDir :: Dir (Mono i o) -> i
monoDir :: forall i o. Dir (Mono i o) -> i
monoDir (Right i
i) = i
i
monoDir (Left Void
v) = Void -> i
forall a. Void -> a
absurd Void
v
monoIn :: i -> Dir (Mono i o)
monoIn :: forall i o. i -> Dir (Mono i o)
monoIn = i -> Either Void i
i -> Dir ('Prod ('Const o) ('Exp i))
forall a b. b -> Either a b
Right
fromEvalSystem :: (SystemEval p) => (s -> Eval p s) -> System (->) s p
fromEvalSystem :: forall (p :: Poly) s.
SystemEval p =>
(s -> Eval p s) -> System (->) s p
fromEvalSystem s -> Eval p s
f = ((s, Dir p) -> (s, Pos p)) -> System (->) s p
forall (arr :: * -> * -> *) s (p :: Poly).
arr (s, Dir p) (s, Pos p) -> System arr s p
system (((s, Dir p) -> (s, Pos p)) -> System (->) s p)
-> ((s, Dir p) -> (s, Pos p)) -> System (->) s p
forall a b. (a -> b) -> a -> b
$ \(s
s, Dir p
d) ->
let (Pos p
pos, Dir p -> s
next) = Eval p s -> (Pos p, Dir p -> s)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x.
SystemEval p =>
Eval p x -> (Pos p, Dir p -> x)
evalToSystem (s -> Eval p s
f s
s)
in (Dir p -> s
next Dir p
d, Pos p
pos)
toEvalSystem :: forall p s. (SystemEval p) => System (->) s p -> s -> Eval p s
toEvalSystem :: forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s p
sys s
s = Pos p -> (Dir p -> s) -> Eval p s
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
SystemEval p =>
Pos p -> (Dir p -> x) -> Eval p x
evalFromSystem Pos p
pos (\Dir p
d -> (s, Pos p) -> s
forall a b. (a, b) -> a
fst (System (->) s p -> (s, Dir p) -> (s, Pos p)
forall (arr :: * -> * -> *) s (p :: Poly).
System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem System (->) s p
sys (s
s, Dir p
d)))
where
pos :: Pos p
pos = (s, Pos p) -> Pos p
forall a b. (a, b) -> b
snd (System (->) s p -> (s, Dir p) -> (s, Pos p)
forall (arr :: * -> * -> *) s (p :: Poly).
System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem System (->) s p
sys (s
s, forall (p :: Poly). SystemEval p => Dir p
probeDir @p))
step :: (SystemEval p) => System (->) s p -> s -> Eval p s
step :: forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
step = System (->) s p -> s -> Eval p s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem
class SystemEval (p :: Poly) where
evalToSystem :: Eval p x -> (Pos p, Dir p -> x)
evalFromSystem :: Pos p -> (Dir p -> x) -> Eval p x
probeDir :: Dir p
instance SystemEval 'Y where
evalToSystem :: forall x. Eval 'Y x -> (Pos 'Y, Dir 'Y -> x)
evalToSystem (EY x
x) = ((), \() -> x
x)
evalFromSystem :: forall x. Pos 'Y -> (Dir 'Y -> x) -> Eval 'Y x
evalFromSystem () Dir 'Y -> x
k = x -> Eval 'Y x
forall x. x -> Eval 'Y x
EY (Dir 'Y -> x
k ())
probeDir :: Dir 'Y
probeDir = ()
instance SystemEval ('Const a) where
evalToSystem :: forall x.
Eval ('Const a) x -> (Pos ('Const a), Dir ('Const a) -> x)
evalToSystem (EK c
c) = (c
Pos ('Const a)
c, Void -> x
Dir ('Const a) -> x
forall a. Void -> a
absurd)
evalFromSystem :: forall x.
Pos ('Const a) -> (Dir ('Const a) -> x) -> Eval ('Const a) x
evalFromSystem Pos ('Const a)
c Dir ('Const a) -> x
_ = a -> Eval ('Const a) x
forall c x. c -> Eval ('Const c) x
EK a
Pos ('Const a)
c
probeDir :: Dir ('Const a)
probeDir = [Char] -> Void
forall a. HasCallStack => [Char] -> a
error [Char]
"probeDir Const"
instance SystemEval ('Exp a) where
evalToSystem :: forall x. Eval ('Exp a) x -> (Pos ('Exp a), Dir ('Exp a) -> x)
evalToSystem (EE a -> x
f) = ((), a -> x
Dir ('Exp a) -> x
f)
evalFromSystem :: forall x. Pos ('Exp a) -> (Dir ('Exp a) -> x) -> Eval ('Exp a) x
evalFromSystem () = (a -> x) -> Eval ('Exp a) x
(Dir ('Exp a) -> x) -> Eval ('Exp a) x
forall a x. (a -> x) -> Eval ('Exp a) x
EE
probeDir :: Dir ('Exp a)
probeDir = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"probeDir Exp"
instance (SystemEval p, SystemEval q) => SystemEval ('Sum p q) where
evalToSystem :: forall x.
Eval ('Sum p q) x -> (Pos ('Sum p q), Dir ('Sum p q) -> x)
evalToSystem (ES (Left Eval p1 x
v)) =
let (Pos p1
i, Dir p1 -> x
f) = Eval p1 x -> (Pos p1, Dir p1 -> x)
forall x. Eval p1 x -> (Pos p1, Dir p1 -> x)
forall (p :: Poly) x.
SystemEval p =>
Eval p x -> (Pos p, Dir p -> x)
evalToSystem Eval p1 x
v
in (Pos p -> Either (Pos p) (Pos q)
forall a b. a -> Either a b
Left Pos p
Pos p1
i, (Dir p -> x) -> (Dir q -> x) -> Either (Dir p) (Dir q) -> x
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Dir p -> x
Dir p1 -> x
f (x -> Dir q -> x
forall a b. a -> b -> a
const x
forall a. a
offFibre))
evalToSystem (ES (Right Eval q x
w)) =
let (Pos q
j, Dir q -> x
g) = Eval q x -> (Pos q, Dir q -> x)
forall x. Eval q x -> (Pos q, Dir q -> x)
forall (p :: Poly) x.
SystemEval p =>
Eval p x -> (Pos p, Dir p -> x)
evalToSystem Eval q x
w
in (Pos q -> Either (Pos p) (Pos q)
forall a b. b -> Either a b
Right Pos q
Pos q
j, (Dir p -> x) -> (Dir q -> x) -> Either (Dir p) (Dir q) -> x
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (x -> Dir p -> x
forall a b. a -> b -> a
const x
forall a. a
offFibre) Dir q -> x
Dir q -> x
g)
evalFromSystem :: forall x.
Pos ('Sum p q) -> (Dir ('Sum p q) -> x) -> Eval ('Sum p q) x
evalFromSystem (Left Pos p
i) Dir ('Sum p q) -> x
k = Either (Eval p x) (Eval q x) -> Eval ('Sum p q) x
forall (p1 :: Poly) x (q :: Poly).
Either (Eval p1 x) (Eval q x) -> Eval ('Sum p1 q) x
ES (Eval p x -> Either (Eval p x) (Eval q x)
forall a b. a -> Either a b
Left (Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
SystemEval p =>
Pos p -> (Dir p -> x) -> Eval p x
evalFromSystem Pos p
i (Either (Dir p) (Dir q) -> x
Dir ('Sum p q) -> x
k (Either (Dir p) (Dir q) -> x)
-> (Dir p -> Either (Dir p) (Dir q)) -> Dir p -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Dir p -> Either (Dir p) (Dir q)
forall a b. a -> Either a b
Left)))
evalFromSystem (Right Pos q
j) Dir ('Sum p q) -> x
k = Either (Eval p x) (Eval q x) -> Eval ('Sum p q) x
forall (p1 :: Poly) x (q :: Poly).
Either (Eval p1 x) (Eval q x) -> Eval ('Sum p1 q) x
ES (Eval q x -> Either (Eval p x) (Eval q x)
forall a b. b -> Either a b
Right (Pos q -> (Dir q -> x) -> Eval q x
forall x. Pos q -> (Dir q -> x) -> Eval q x
forall (p :: Poly) x.
SystemEval p =>
Pos p -> (Dir p -> x) -> Eval p x
evalFromSystem Pos q
j (Either (Dir p) (Dir q) -> x
Dir ('Sum p q) -> x
k (Either (Dir p) (Dir q) -> x)
-> (Dir q -> Either (Dir p) (Dir q)) -> Dir q -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Dir q -> Either (Dir p) (Dir q)
forall a b. b -> Either a b
Right)))
probeDir :: Dir ('Sum p q)
probeDir :: Dir ('Sum p q)
probeDir = Dir p -> Either (Dir p) (Dir q)
forall a b. a -> Either a b
Left (forall (p :: Poly). SystemEval p => Dir p
probeDir @p)
instance (SystemEval p, SystemEval q) => SystemEval ('Prod p q) where
evalToSystem :: forall x.
Eval ('Prod p q) x -> (Pos ('Prod p q), Dir ('Prod p q) -> x)
evalToSystem (EP (Eval p1 x
u, Eval q x
v)) =
let (Pos p1
i, Dir p1 -> x
f) = Eval p1 x -> (Pos p1, Dir p1 -> x)
forall x. Eval p1 x -> (Pos p1, Dir p1 -> x)
forall (p :: Poly) x.
SystemEval p =>
Eval p x -> (Pos p, Dir p -> x)
evalToSystem Eval p1 x
u
(Pos q
j, Dir q -> x
g) = Eval q x -> (Pos q, Dir q -> x)
forall x. Eval q x -> (Pos q, Dir q -> x)
forall (p :: Poly) x.
SystemEval p =>
Eval p x -> (Pos p, Dir p -> x)
evalToSystem Eval q x
v
in ((Pos p
Pos p1
i, Pos q
Pos q
j), (Dir p -> x) -> (Dir q -> x) -> Either (Dir p) (Dir q) -> x
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Dir p -> x
Dir p1 -> x
f Dir q -> x
Dir q -> x
g)
evalFromSystem :: forall x.
Pos ('Prod p q) -> (Dir ('Prod p q) -> x) -> Eval ('Prod p q) x
evalFromSystem (Pos p
i, Pos q
j) Dir ('Prod p q) -> x
k =
(Eval p x, Eval q x) -> Eval ('Prod p q) x
forall (p1 :: Poly) x (q :: Poly).
(Eval p1 x, Eval q x) -> Eval ('Prod p1 q) x
EP (Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
SystemEval p =>
Pos p -> (Dir p -> x) -> Eval p x
evalFromSystem Pos p
i (Either (Dir p) (Dir q) -> x
Dir ('Prod p q) -> x
k (Either (Dir p) (Dir q) -> x)
-> (Dir p -> Either (Dir p) (Dir q)) -> Dir p -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Dir p -> Either (Dir p) (Dir q)
forall a b. a -> Either a b
Left), Pos q -> (Dir q -> x) -> Eval q x
forall x. Pos q -> (Dir q -> x) -> Eval q x
forall (p :: Poly) x.
SystemEval p =>
Pos p -> (Dir p -> x) -> Eval p x
evalFromSystem Pos q
j (Either (Dir p) (Dir q) -> x
Dir ('Prod p q) -> x
k (Either (Dir p) (Dir q) -> x)
-> (Dir q -> Either (Dir p) (Dir q)) -> Dir q -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Dir q -> Either (Dir p) (Dir q)
forall a b. b -> Either a b
Right))
probeDir :: Dir ('Prod p q)
probeDir :: Dir ('Prod p q)
probeDir = Dir p -> Either (Dir p) (Dir q)
forall a b. a -> Either a b
Left (forall (p :: Poly). SystemEval p => Dir p
probeDir @p)
instance (SystemEval p, SystemEval q) => SystemEval ('Tensor p q) where
evalToSystem :: forall x.
Eval ('Tensor p q) x -> (Pos ('Tensor p q), Dir ('Tensor p q) -> x)
evalToSystem (ET (Pos p1, Pos q)
pos (Dir p1, Dir q) -> x
f) = ((Pos p1, Pos q)
Pos ('Tensor p q)
pos, (Dir p1, Dir q) -> x
Dir ('Tensor p q) -> x
f)
evalFromSystem :: forall x.
Pos ('Tensor p q)
-> (Dir ('Tensor p q) -> x) -> Eval ('Tensor p q) x
evalFromSystem = (Pos p, Pos q) -> ((Dir p, Dir q) -> x) -> Eval ('Tensor p q) x
Pos ('Tensor p q)
-> (Dir ('Tensor p q) -> x) -> Eval ('Tensor p q) x
forall (p1 :: Poly) (q :: Poly) x.
(Pos p1, Pos q) -> ((Dir p1, Dir q) -> x) -> Eval ('Tensor p1 q) x
ET
probeDir :: Dir ('Tensor p q)
probeDir :: Dir ('Tensor p q)
probeDir = (forall (p :: Poly). SystemEval p => Dir p
probeDir @p, forall (p :: Poly). SystemEval p => Dir p
probeDir @q)
instance (SystemEval p, SystemEval q) => SystemEval ('Comp p q) where
evalToSystem :: forall x.
Eval ('Comp p q) x -> (Pos ('Comp p q), Dir ('Comp p q) -> x)
evalToSystem (EC (Pos p1, Dir p1 -> Pos q)
pos (Dir p1, Dir q) -> x
f) = ((Pos p1, Dir p1 -> Pos q)
Pos ('Comp p q)
pos, (Dir p1, Dir q) -> x
Dir ('Comp p q) -> x
f)
evalFromSystem :: forall x.
Pos ('Comp p q) -> (Dir ('Comp p q) -> x) -> Eval ('Comp p q) x
evalFromSystem = (Pos p, Dir p -> Pos q)
-> ((Dir p, Dir q) -> x) -> Eval ('Comp p q) x
Pos ('Comp p q) -> (Dir ('Comp p q) -> x) -> Eval ('Comp p q) x
forall (p1 :: Poly) (q :: Poly) x.
(Pos p1, Dir p1 -> Pos q)
-> ((Dir p1, Dir q) -> x) -> Eval ('Comp p1 q) x
EC
probeDir :: Dir ('Comp p q)
probeDir :: Dir ('Comp p q)
probeDir = (forall (p :: Poly). SystemEval p => Dir p
probeDir @p, forall (p :: Poly). SystemEval p => Dir p
probeDir @q)
offFibre :: a
offFibre :: forall a. a
offFibre = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"off-fibre direction"
parWiring :: System (->) s p -> System (->) t q -> System (->) (s, t) (Tensor p q)
parWiring :: forall s (p :: Poly) t (q :: Poly).
System (->) s p
-> System (->) t q -> System (->) (s, t) ('Tensor p q)
parWiring System (->) s p
sp System (->) t q
sq =
(((s, t), Dir ('Tensor p q)) -> ((s, t), Pos ('Tensor p q)))
-> System (->) (s, t) ('Tensor p q)
forall (arr :: * -> * -> *) s (p :: Poly).
arr (s, Dir p) (s, Pos p) -> System arr s p
system ((((s, t), Dir ('Tensor p q)) -> ((s, t), Pos ('Tensor p q)))
-> System (->) (s, t) ('Tensor p q))
-> (((s, t), Dir ('Tensor p q)) -> ((s, t), Pos ('Tensor p q)))
-> System (->) (s, t) ('Tensor p q)
forall a b. (a -> b) -> a -> b
$ \((s
s, t
t), (Dir p
dp, Dir q
dq)) ->
let (s
s', Pos p
posP) = System (->) s p -> (s, Dir p) -> (s, Pos p)
forall (arr :: * -> * -> *) s (p :: Poly).
System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem System (->) s p
sp (s
s, Dir p
dp)
(t
t', Pos q
posQ) = System (->) t q -> (t, Dir q) -> (t, Pos q)
forall (arr :: * -> * -> *) s (p :: Poly).
System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem System (->) t q
sq (t
t, Dir q
dq)
in ((s
s', t
t'), (Pos p
posP, Pos q
posQ))
data SomePoles t arr a b where
SomePoles :: s -> Poles (Body t s arr) a b -> SomePoles t arr a b
runSomePoles :: SomePoles (,) (->) a b -> [a] -> [b]
runSomePoles :: forall a b. SomePoles (,) (->) a b -> [a] -> [b]
runSomePoles (SomePoles s
s0 Poles (Body (,) s (->)) a b
p) [a]
xs =
let (Body (,) s (->) a ()
write, Body (,) s (->) () b
receive) = Poles (Body (,) s (->)) a b
-> (Body (,) s (->) a (), Body (,) s (->) () b)
forall (arr :: * -> * -> *) a b.
HasDual () arr =>
Poles arr a b -> (arr a (), arr () b)
Poles.splay0 Poles (Body (,) s (->)) a b
p
Body (s, a) -> (s, b)
f = Body (,) s (->) a ()
write Body (,) s (->) a () -> Body (,) s (->) () b -> Body (,) s (->) a b
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> Body (,) s (->) () b
receive
(s
_, [b]
bs) = ((s, [b]) -> a -> (s, [b])) -> (s, [b]) -> [a] -> (s, [b])
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (\(s
s, [b]
acc) a
a -> let (s
s', b
b) = (s, a) -> (s, b)
f (s
s, a
a) in (s
s', b
b b -> [b] -> [b]
forall a. a -> [a] -> [a]
: [b]
acc)) (s
s0, []) [a]
xs
in [b] -> [b]
forall a. [a] -> [a]
reverse [b]
bs
systemWriteBody :: System (->) s p -> Body (,) s (->) (Dir p) ()
systemWriteBody :: forall s (p :: Poly). System (->) s p -> Body (,) s (->) (Dir p) ()
systemWriteBody System (->) s p
sys = ((s, Dir p) -> (s, ())) -> Body (,) s (->) (Dir p) ()
forall {k} {k1} {k2} (t :: k -> k1 -> k2) (ch :: k)
(arr :: k2 -> k2 -> *) (a :: k1) (b :: k1).
arr (t ch a) (t ch b) -> Body t ch arr a b
Body (((s, Dir p) -> (s, ())) -> Body (,) s (->) (Dir p) ())
-> ((s, Dir p) -> (s, ())) -> Body (,) s (->) (Dir p) ()
forall a b. (a -> b) -> a -> b
$ \(s
s, Dir p
d) -> ((s, Pos p) -> s
forall a b. (a, b) -> a
fst (System (->) s p -> (s, Dir p) -> (s, Pos p)
forall (arr :: * -> * -> *) s (p :: Poly).
System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem System (->) s p
sys (s
s, Dir p
d)), ())
systemToPolesWithProbe :: Dir p -> System (->) s p -> Poles (Body (,) s (->)) (Dir p) (Pos p)
systemToPolesWithProbe :: forall (p :: Poly) s.
Dir p -> System (->) s p -> Poles (Body (,) s (->)) (Dir p) (Pos p)
systemToPolesWithProbe Dir p
probe System (->) s p
sys =
Body (,) s (->) (Dir p) ()
-> Body (,) s (->) () (Pos p)
-> Poles (Body (,) s (->)) (Dir p) (Pos p)
forall (arr :: * -> * -> *) a b.
HasDual () arr =>
arr a () -> arr () b -> Poles arr a b
Poles.poles0
(System (->) s p -> Body (,) s (->) (Dir p) ()
forall s (p :: Poly). System (->) s p -> Body (,) s (->) (Dir p) ()
systemWriteBody System (->) s p
sys)
(((s, ()) -> (s, Pos p)) -> Body (,) s (->) () (Pos p)
forall {k} {k1} {k2} (t :: k -> k1 -> k2) (ch :: k)
(arr :: k2 -> k2 -> *) (a :: k1) (b :: k1).
arr (t ch a) (t ch b) -> Body t ch arr a b
Body (((s, ()) -> (s, Pos p)) -> Body (,) s (->) () (Pos p))
-> ((s, ()) -> (s, Pos p)) -> Body (,) s (->) () (Pos p)
forall a b. (a -> b) -> a -> b
$ \(s
s, ()) -> System (->) s p -> (s, Dir p) -> (s, Pos p)
forall (arr :: * -> * -> *) s (p :: Poly).
System arr s p -> arr (s, Dir p) (s, Pos p)
runSystem System (->) s p
sys (s
s, Dir p
probe))
systemWithSeedToPoles :: s -> (s -> Pos p) -> System (->) s p -> SomePoles (,) (->) (Dir p) (Pos p)
systemWithSeedToPoles :: forall s (p :: Poly).
s
-> (s -> Pos p)
-> System (->) s p
-> SomePoles (,) (->) (Dir p) (Pos p)
systemWithSeedToPoles s
s0 s -> Pos p
ex System (->) s p
sys =
s
-> Poles (Body (,) s (->)) (Dir p) (Pos p)
-> SomePoles (,) (->) (Dir p) (Pos p)
forall {k1} {k2} s (t :: * -> k1 -> k2) (arr :: k2 -> k2 -> *)
(a :: k1) (b :: k1).
s -> Poles (Body t s arr) a b -> SomePoles t arr a b
SomePoles s
s0 (Poles (Body (,) s (->)) (Dir p) (Pos p)
-> SomePoles (,) (->) (Dir p) (Pos p))
-> Poles (Body (,) s (->)) (Dir p) (Pos p)
-> SomePoles (,) (->) (Dir p) (Pos p)
forall a b. (a -> b) -> a -> b
$
Body (,) s (->) (Dir p) ()
-> Body (,) s (->) () (Pos p)
-> Poles (Body (,) s (->)) (Dir p) (Pos p)
forall (arr :: * -> * -> *) a b.
HasDual () arr =>
arr a () -> arr () b -> Poles arr a b
Poles.poles0
(System (->) s p -> Body (,) s (->) (Dir p) ()
forall s (p :: Poly). System (->) s p -> Body (,) s (->) (Dir p) ()
systemWriteBody System (->) s p
sys)
(((s, ()) -> (s, Pos p)) -> Body (,) s (->) () (Pos p)
forall {k} {k1} {k2} (t :: k -> k1 -> k2) (ch :: k)
(arr :: k2 -> k2 -> *) (a :: k1) (b :: k1).
arr (t ch a) (t ch b) -> Body t ch arr a b
Body (((s, ()) -> (s, Pos p)) -> Body (,) s (->) () (Pos p))
-> ((s, ()) -> (s, Pos p)) -> Body (,) s (->) () (Pos p)
forall a b. (a -> b) -> a -> b
$ \(s
s, ()) -> (s
s, s -> Pos p
ex s
s))
runSystemMono :: System (->) s (Mono i o) -> s -> (o, i -> s)
runSystemMono :: forall s i o. System (->) s (Mono i o) -> s -> (o, i -> s)
runSystemMono System (->) s (Mono i o)
sys s
s = case System (->) s (Mono i o) -> s -> Eval (Mono i o) s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s (Mono i o)
sys s
s of EP (EK c
o, EE a -> s
f) -> (o
c
o, i -> s
a -> s
f)
systemAsLens :: System (->) s (Mono i o) -> Morphism (Mono s s) (Mono i o)
systemAsLens :: forall s i o.
System (->) s (Mono i o) -> Morphism (Mono s s) (Mono i o)
systemAsLens System (->) s (Mono i o)
sys = (s -> o) -> (s -> i -> s) -> Morphism (Mono s s) (Mono i o)
forall a b db da.
(a -> b) -> (a -> db -> da) -> Morphism (Mono da a) (Mono db b)
lens s -> o
get s -> i -> s
put
where
get :: s -> o
get s
s = (o, i -> s) -> o
forall a b. (a, b) -> a
fst (System (->) s (Mono i o) -> s -> (o, i -> s)
forall s i o. System (->) s (Mono i o) -> s -> (o, i -> s)
runSystemMono System (->) s (Mono i o)
sys s
s)
put :: s -> i -> s
put s
s = (o, i -> s) -> i -> s
forall a b. (a, b) -> b
snd (System (->) s (Mono i o) -> s -> (o, i -> s)
forall s i o. System (->) s (Mono i o) -> s -> (o, i -> s)
runSystemMono System (->) s (Mono i o)
sys s
s)
lensAsSystem :: Morphism (Mono s s) (Mono i o) -> System (->) s (Mono i o)
lensAsSystem :: forall s i o.
Morphism (Mono s s) (Mono i o) -> System (->) s (Mono i o)
lensAsSystem Morphism (Mono s s) (Mono i o)
m = (s -> Eval (Mono i o) s) -> System (->) s (Mono i o)
forall (p :: Poly) s.
SystemEval p =>
(s -> Eval p s) -> System (->) s p
fromEvalSystem ((s -> Eval (Mono i o) s) -> System (->) s (Mono i o))
-> (s -> Eval (Mono i o) s) -> System (->) s (Mono i o)
forall a b. (a -> b) -> a -> b
$ \s
s ->
case Morphism (Mono s s) (Mono i o) -> s -> (o, i -> s)
forall da a db b.
Morphism (Mono da a) (Mono db b) -> a -> (b, db -> da)
applyLens Morphism (Mono s s) (Mono i o)
m s
s of
(o
o, i -> s
put) -> (Eval ('Const o) s, Eval ('Exp i) s) -> Eval (Mono i o) s
forall (p1 :: Poly) x (q :: Poly).
(Eval p1 x, Eval q x) -> Eval ('Prod p1 q) x
EP (o -> Eval ('Const o) s
forall c x. c -> Eval ('Const c) x
EK o
o, (i -> s) -> Eval ('Exp i) s
forall a x. (a -> x) -> Eval ('Exp a) x
EE i -> s
put)
duplicateSystem :: System (->) s (Mono o s) -> System (->) s ('Comp (Mono o s) (Mono o s))
duplicateSystem :: forall s o.
System (->) s (Mono o s)
-> System (->) s ('Comp (Mono o s) (Mono o s))
duplicateSystem System (->) s (Mono o s)
sys =
(s -> Eval ('Comp (Mono o s) (Mono o s)) s)
-> System (->) s ('Comp (Mono o s) (Mono o s))
forall (p :: Poly) s.
SystemEval p =>
(s -> Eval p s) -> System (->) s p
fromEvalSystem ((s -> Eval ('Comp (Mono o s) (Mono o s)) s)
-> System (->) s ('Comp (Mono o s) (Mono o s)))
-> (s -> Eval ('Comp (Mono o s) (Mono o s)) s)
-> System (->) s ('Comp (Mono o s) (Mono o s))
forall a b. (a -> b) -> a -> b
$ \s
s ->
let (s
s0, o -> s
nextStep) = System (->) s (Mono o s) -> s -> (s, o -> s)
forall s i o. System (->) s (Mono i o) -> s -> (o, i -> s)
runSystemMono System (->) s (Mono o s)
sys s
s
nextEval :: o -> Eval (Mono o s) s
nextEval o
o =
let (s
s1, o -> s
step1) = System (->) s (Mono o s) -> s -> (s, o -> s)
forall s i o. System (->) s (Mono i o) -> s -> (o, i -> s)
runSystemMono System (->) s (Mono o s)
sys (o -> s
nextStep o
o)
in (Eval ('Const s) s, Eval ('Exp o) s) -> Eval (Mono o s) s
forall (p1 :: Poly) x (q :: Poly).
(Eval p1 x, Eval q x) -> Eval ('Prod p1 q) x
EP (s -> Eval ('Const s) s
forall c x. c -> Eval ('Const c) x
EK s
s1, (o -> s) -> Eval ('Exp o) s
forall a x. (a -> x) -> Eval ('Exp a) x
EE o -> s
step1)
in Eval (Mono o s) (Eval (Mono o s) s)
-> Eval ('Comp (Mono o s) (Mono o s)) s
forall (p :: Poly) (q :: Poly) x.
(Netlist p, Netlist q) =>
Eval p (Eval q x) -> Eval ('Comp p q) x
nestedToComp ((Eval ('Const s) (Eval (Mono o s) s),
Eval ('Exp o) (Eval (Mono o s) s))
-> Eval (Mono o s) (Eval (Mono o s) s)
forall (p1 :: Poly) x (q :: Poly).
(Eval p1 x, Eval q x) -> Eval ('Prod p1 q) x
EP (s -> Eval ('Const s) (Eval (Mono o s) s)
forall c x. c -> Eval ('Const c) x
EK s
s0, (o -> Eval (Mono o s) s) -> Eval ('Exp o) (Eval (Mono o s) s)
forall a x. (a -> x) -> Eval ('Exp a) x
EE o -> Eval (Mono o s) s
nextEval))
branchSystem ::
(s -> Bool) ->
System (->) s (Mono i o) ->
System (->) s (Mono i o) ->
System (->) s ('Sum (Mono i o) (Mono i o))
branchSystem :: forall s i o.
(s -> Bool)
-> System (->) s (Mono i o)
-> System (->) s (Mono i o)
-> System (->) s ('Sum (Mono i o) (Mono i o))
branchSystem s -> Bool
cond System (->) s (Mono i o)
sysL System (->) s (Mono i o)
sysR =
(s -> Eval ('Sum (Mono i o) (Mono i o)) s)
-> System (->) s ('Sum (Mono i o) (Mono i o))
forall (p :: Poly) s.
SystemEval p =>
(s -> Eval p s) -> System (->) s p
fromEvalSystem ((s -> Eval ('Sum (Mono i o) (Mono i o)) s)
-> System (->) s ('Sum (Mono i o) (Mono i o)))
-> (s -> Eval ('Sum (Mono i o) (Mono i o)) s)
-> System (->) s ('Sum (Mono i o) (Mono i o))
forall a b. (a -> b) -> a -> b
$ \s
s ->
if s -> Bool
cond s
s
then Either (Eval (Mono i o) s) (Eval (Mono i o) s)
-> Eval ('Sum (Mono i o) (Mono i o)) s
forall (p1 :: Poly) x (q :: Poly).
Either (Eval p1 x) (Eval q x) -> Eval ('Sum p1 q) x
ES (Eval (Mono i o) s -> Either (Eval (Mono i o) s) (Eval (Mono i o) s)
forall a b. a -> Either a b
Left (System (->) s (Mono i o) -> s -> Eval (Mono i o) s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s (Mono i o)
sysL s
s))
else Either (Eval (Mono i o) s) (Eval (Mono i o) s)
-> Eval ('Sum (Mono i o) (Mono i o)) s
forall (p1 :: Poly) x (q :: Poly).
Either (Eval p1 x) (Eval q x) -> Eval ('Sum p1 q) x
ES (Eval (Mono i o) s -> Either (Eval (Mono i o) s) (Eval (Mono i o) s)
forall a b. b -> Either a b
Right (System (->) s (Mono i o) -> s -> Eval (Mono i o) s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s (Mono i o)
sysR s
s))
runSystemSum ::
System (->) s ('Sum (Mono i o) (Mono i o)) ->
s ->
(Either o o, i -> s)
runSystemSum :: forall s i o.
System (->) s ('Sum (Mono i o) (Mono i o))
-> s -> (Either o o, i -> s)
runSystemSum System (->) s ('Sum (Mono i o) (Mono i o))
sys s
s = case System (->) s ('Sum (Mono i o) (Mono i o))
-> s -> Eval ('Sum (Mono i o) (Mono i o)) s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s ('Sum (Mono i o) (Mono i o))
sys s
s of
ES (Left (EP (EK c
o, EE a -> s
f))) -> (o -> Either o o
forall a b. a -> Either a b
Left o
c
o, i -> s
a -> s
f)
ES (Right (EP (EK c
o, EE a -> s
f))) -> (o -> Either o o
forall a b. b -> Either a b
Right o
c
o, i -> s
a -> s
f)
data SumStep s o1 i1 o2 i2 where
SumStepL :: o1 -> (i1 -> s) -> SumStep s o1 i1 o2 i2
SumStepR :: o2 -> (i2 -> s) -> SumStep s o1 i1 o2 i2
branchSystemHet ::
(s -> Bool) ->
System (->) s (Mono i1 o1) ->
System (->) s (Mono i2 o2) ->
System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
branchSystemHet :: forall s i1 o1 i2 o2.
(s -> Bool)
-> System (->) s (Mono i1 o1)
-> System (->) s (Mono i2 o2)
-> System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
branchSystemHet s -> Bool
cond System (->) s (Mono i1 o1)
sysL System (->) s (Mono i2 o2)
sysR =
(s -> Eval ('Sum (Mono i1 o1) (Mono i2 o2)) s)
-> System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
forall (p :: Poly) s.
SystemEval p =>
(s -> Eval p s) -> System (->) s p
fromEvalSystem ((s -> Eval ('Sum (Mono i1 o1) (Mono i2 o2)) s)
-> System (->) s ('Sum (Mono i1 o1) (Mono i2 o2)))
-> (s -> Eval ('Sum (Mono i1 o1) (Mono i2 o2)) s)
-> System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
forall a b. (a -> b) -> a -> b
$ \s
s ->
if s -> Bool
cond s
s
then Either (Eval (Mono i1 o1) s) (Eval (Mono i2 o2) s)
-> Eval ('Sum (Mono i1 o1) (Mono i2 o2)) s
forall (p1 :: Poly) x (q :: Poly).
Either (Eval p1 x) (Eval q x) -> Eval ('Sum p1 q) x
ES (Eval (Mono i1 o1) s
-> Either (Eval (Mono i1 o1) s) (Eval (Mono i2 o2) s)
forall a b. a -> Either a b
Left (System (->) s (Mono i1 o1) -> s -> Eval (Mono i1 o1) s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s (Mono i1 o1)
sysL s
s))
else Either (Eval (Mono i1 o1) s) (Eval (Mono i2 o2) s)
-> Eval ('Sum (Mono i1 o1) (Mono i2 o2)) s
forall (p1 :: Poly) x (q :: Poly).
Either (Eval p1 x) (Eval q x) -> Eval ('Sum p1 q) x
ES (Eval (Mono i2 o2) s
-> Either (Eval (Mono i1 o1) s) (Eval (Mono i2 o2) s)
forall a b. b -> Either a b
Right (System (->) s (Mono i2 o2) -> s -> Eval (Mono i2 o2) s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s (Mono i2 o2)
sysR s
s))
runSystemSumHet ::
System (->) s ('Sum (Mono i1 o1) (Mono i2 o2)) ->
s ->
SumStep s o1 i1 o2 i2
runSystemSumHet :: forall s i1 o1 i2 o2.
System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
-> s -> SumStep s o1 i1 o2 i2
runSystemSumHet System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
sys s
s = case System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
-> s -> Eval ('Sum (Mono i1 o1) (Mono i2 o2)) s
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s ('Sum (Mono i1 o1) (Mono i2 o2))
sys s
s of
ES (Left (EP (EK c
o, EE a -> s
f))) -> o1 -> (i1 -> s) -> SumStep s o1 i1 o2 i2
forall o1 i1 s o2 i2. o1 -> (i1 -> s) -> SumStep s o1 i1 o2 i2
SumStepL o1
c
o i1 -> s
a -> s
f
ES (Right (EP (EK c
o, EE a -> s
f))) -> o2 -> (i2 -> s) -> SumStep s o1 i1 o2 i2
forall o2 i2 s o1 i1. o2 -> (i2 -> s) -> SumStep s o1 i1 o2 i2
SumStepR o2
c
o i2 -> s
a -> s
f
type Step s q = Eval q s
data Coalgebra s p q = Coalgebra
{ forall s (p :: Poly) (q :: Poly).
Coalgebra s p q -> s -> Morphism p q
act :: s -> Morphism p q,
forall s (p :: Poly) (q :: Poly).
Coalgebra s p q -> s -> Eval p s -> Step s q
upd :: s -> Eval p s -> Step s q
}
coalgebraToSystem :: (SystemEval q) => Coalgebra s 'Y q -> System (->) s q
coalgebraToSystem :: forall (q :: Poly) s.
SystemEval q =>
Coalgebra s 'Y q -> System (->) s q
coalgebraToSystem Coalgebra s 'Y q
coal = (s -> Eval q s) -> System (->) s q
forall (p :: Poly) s.
SystemEval p =>
(s -> Eval p s) -> System (->) s p
fromEvalSystem ((s -> Eval q s) -> System (->) s q)
-> (s -> Eval q s) -> System (->) s q
forall a b. (a -> b) -> a -> b
$ \s
s -> Coalgebra s 'Y q -> s -> Eval 'Y s -> Eval q s
forall s (p :: Poly) (q :: Poly).
Coalgebra s p q -> s -> Eval p s -> Step s q
upd Coalgebra s 'Y q
coal s
s (s -> Eval 'Y s
forall x. x -> Eval 'Y x
EY s
s)
systemToCoalgebraMono :: System (->) s (Mono i o) -> Coalgebra s 'Y (Mono i o)
systemToCoalgebraMono :: forall s i o. System (->) s (Mono i o) -> Coalgebra s 'Y (Mono i o)
systemToCoalgebraMono System (->) s ('Prod ('Const o) ('Exp i))
sys =
Coalgebra
{ act :: s -> Morphism 'Y ('Prod ('Const o) ('Exp i))
act = \s
s -> let (o
o, i -> s
_) = System (->) s ('Prod ('Const o) ('Exp i)) -> s -> (o, i -> s)
forall s i o. System (->) s (Mono i o) -> s -> (o, i -> s)
runSystemMono System (->) s ('Prod ('Const o) ('Exp i))
sys s
s in Eval ('Prod ('Const o) ('Exp i)) ()
-> Morphism 'Y ('Prod ('Const o) ('Exp i))
forall (q :: Poly). Eval q () -> Morphism 'Y q
Point ((Eval ('Const o) (), Eval ('Exp i) ())
-> Eval ('Prod ('Const o) ('Exp i)) ()
forall (p1 :: Poly) x (q :: Poly).
(Eval p1 x, Eval q x) -> Eval ('Prod p1 q) x
EP (o -> Eval ('Const o) ()
forall c x. c -> Eval ('Const c) x
EK o
o, (i -> ()) -> Eval ('Exp i) ()
forall a x. (a -> x) -> Eval ('Exp a) x
EE (() -> i -> ()
forall a b. a -> b -> a
const ()))),
upd :: s -> Eval 'Y s -> Step s ('Prod ('Const o) ('Exp i))
upd = \s
s Eval 'Y s
_ -> System (->) s ('Prod ('Const o) ('Exp i))
-> s -> Step s ('Prod ('Const o) ('Exp i))
forall (p :: Poly) s.
SystemEval p =>
System (->) s p -> s -> Eval p s
toEvalSystem System (->) s ('Prod ('Const o) ('Exp i))
sys s
s
}
composeCoalgebra ::
(Netlist p, Netlist q) =>
Coalgebra s 'Y p ->
Coalgebra t 'Y q ->
Coalgebra (s, t) 'Y (Comp p q)
composeCoalgebra :: forall (p :: Poly) (q :: Poly) s t.
(Netlist p, Netlist q) =>
Coalgebra s 'Y p
-> Coalgebra t 'Y q -> Coalgebra (s, t) 'Y ('Comp p q)
composeCoalgebra Coalgebra s 'Y p
coalP Coalgebra t 'Y q
coalQ =
Coalgebra
{ act :: (s, t) -> Morphism 'Y ('Comp p q)
act = \(s
s, t
t) ->
let pPoint :: Eval p ()
pPoint = Morphism 'Y p -> forall x. Eval 'Y x -> Eval p x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism (Coalgebra s 'Y p -> s -> Morphism 'Y p
forall s (p :: Poly) (q :: Poly).
Coalgebra s p q -> s -> Morphism p q
act Coalgebra s 'Y p
coalP s
s) (() -> Eval 'Y ()
forall x. x -> Eval 'Y x
EY ())
qPoint :: Eval q ()
qPoint = Morphism 'Y q -> forall x. Eval 'Y x -> Eval q x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism (Coalgebra t 'Y q -> t -> Morphism 'Y q
forall s (p :: Poly) (q :: Poly).
Coalgebra s p q -> s -> Morphism p q
act Coalgebra t 'Y q
coalQ t
t) (() -> Eval 'Y ()
forall x. x -> Eval 'Y x
EY ())
in Eval ('Comp p q) () -> Morphism 'Y ('Comp p q)
forall (q :: Poly). Eval q () -> Morphism 'Y q
Point (Eval p (Eval q ()) -> Eval ('Comp p q) ()
forall (p :: Poly) (q :: Poly) x.
(Netlist p, Netlist q) =>
Eval p (Eval q x) -> Eval ('Comp p q) x
nestedToComp ((() -> Eval q ()) -> Eval p () -> Eval p (Eval q ())
forall a b. (a -> b) -> Eval p a -> Eval p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Eval q () -> () -> Eval q ()
forall a b. a -> b -> a
const Eval q ()
qPoint) Eval p ()
pPoint)),
upd :: (s, t) -> Eval 'Y (s, t) -> Step (s, t) ('Comp p q)
upd = \(s
s, t
t) Eval 'Y (s, t)
_ ->
let pVal :: Step s p
pVal = Coalgebra s 'Y p -> s -> Eval 'Y s -> Step s p
forall s (p :: Poly) (q :: Poly).
Coalgebra s p q -> s -> Eval p s -> Step s q
upd Coalgebra s 'Y p
coalP s
s (s -> Eval 'Y s
forall x. x -> Eval 'Y x
EY s
s)
qVal :: Step t q
qVal = Coalgebra t 'Y q -> t -> Eval 'Y t -> Step t q
forall s (p :: Poly) (q :: Poly).
Coalgebra s p q -> s -> Eval p s -> Step s q
upd Coalgebra t 'Y q
coalQ t
t (t -> Eval 'Y t
forall x. x -> Eval 'Y x
EY t
t)
in Eval p (Eval q (s, t)) -> Step (s, t) ('Comp p q)
forall (p :: Poly) (q :: Poly) x.
(Netlist p, Netlist q) =>
Eval p (Eval q x) -> Eval ('Comp p q) x
nestedToComp ((s -> Eval q (s, t)) -> Step s p -> Eval p (Eval q (s, t))
forall a b. (a -> b) -> Eval p a -> Eval p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\s
s' -> (t -> (s, t)) -> Step t q -> Eval q (s, t)
forall a b. (a -> b) -> Eval q a -> Eval q b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (s
s',) Step t q
qVal) Step s p
pVal)
}