{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Circuit.Poly
(
Poly (..),
Eval (..),
Pos,
Dir,
Netlist (..),
netRoundTrip,
tensorUnitorL,
tensorUnitorL',
tensorUnitorR,
tensorUnitorR',
morphAt,
parT,
nestedToComp,
compToNested,
compUnitorL,
compUnitorL',
compUnitorR,
compUnitorR',
compAssocL,
compAssocR,
tensorEval,
Morphism (..),
runMorphism,
Mono,
lens,
dagger,
applyLens,
prism,
prismMatch,
)
where
import Circuit.Category (Category (..), (.>))
import Data.Bifunctor
import Data.Kind (Type)
import Data.Void (Void, absurd)
import Prelude hiding (id, (.))
data Poly
= Y
| Const Type
| Exp Type
| Sum Poly Poly
| Prod Poly Poly
| Tensor Poly Poly
| Comp Poly Poly
type family Pos (p :: Poly) :: Type where
Pos 'Y = ()
Pos ('Const a) = a
Pos ('Exp a) = ()
Pos ('Sum p q) = Either (Pos p) (Pos q)
Pos ('Prod p q) = (Pos p, Pos q)
Pos ('Tensor p q) = (Pos p, Pos q)
Pos ('Comp p q) = (Pos p, Dir p -> Pos q)
type family Dir (p :: Poly) :: Type where
Dir 'Y = ()
Dir ('Const a) = Void
Dir ('Exp a) = a
Dir ('Sum p q) = Either (Dir p) (Dir q)
Dir ('Prod p q) = Either (Dir p) (Dir q)
Dir ('Tensor p q) = (Dir p, Dir q)
Dir ('Comp p q) = (Dir p, Dir q)
data Eval (p :: Poly) (x :: Type) where
EY :: x -> Eval 'Y x
EK :: c -> Eval ('Const c) x
EE :: (a -> x) -> Eval ('Exp a) x
ES :: Either (Eval p x) (Eval q x) -> Eval ('Sum p q) x
EP :: (Eval p x, Eval q x) -> Eval ('Prod p q) x
ET :: (Pos p, Pos q) -> ((Dir p, Dir q) -> x) -> Eval ('Tensor p q) x
EC ::
(Pos p, Dir p -> Pos q) ->
((Dir p, Dir q) -> x) ->
Eval ('Comp p q) x
instance Functor (Eval p) where
fmap :: forall a b. (a -> b) -> Eval p a -> Eval p b
fmap a -> b
f = \case
EY a
x -> b -> Eval 'Y b
forall x. x -> Eval 'Y x
EY (a -> b
f a
x)
EK c
c -> c -> Eval ('Const c) b
forall p x. p -> Eval ('Const p) x
EK c
c
EE a -> a
g -> (a -> b) -> Eval ('Exp a) b
forall p x. (p -> x) -> Eval ('Exp p) x
EE (a -> b
f (a -> b) -> (a -> a) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. a -> a
g)
ES Either (Eval p a) (Eval q a)
e -> Either (Eval p b) (Eval q b) -> Eval ('Sum p q) b
forall (p :: Poly) x (b :: Poly).
Either (Eval p x) (Eval b x) -> Eval ('Sum p b) x
ES ((Eval p a -> Eval p b)
-> (Eval q a -> Eval q b)
-> Either (Eval p a) (Eval q a)
-> Either (Eval p b) (Eval q b)
forall a b c d. (a -> b) -> (c -> d) -> Either a c -> Either b d
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap ((a -> b) -> Eval p a -> Eval p b
forall a b. (a -> b) -> Eval p a -> Eval p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) ((a -> b) -> Eval q a -> Eval q b
forall a b. (a -> b) -> Eval q a -> Eval q b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) Either (Eval p a) (Eval q a)
e)
EP (Eval p a
a, Eval q a
b) -> (Eval p b, Eval q b) -> Eval ('Prod p q) b
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP ((a -> b) -> Eval p a -> Eval p b
forall a b. (a -> b) -> Eval p a -> Eval p b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Eval p a
a, (a -> b) -> Eval q a -> Eval q b
forall a b. (a -> b) -> Eval q a -> Eval q b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Eval q a
b)
ET (Pos p, Pos q)
pos (Dir p, Dir q) -> a
g -> (Pos p, Pos q) -> ((Dir p, Dir q) -> b) -> Eval ('Tensor p q) b
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET (Pos p, Pos q)
pos (a -> b
f (a -> b) -> ((Dir p, Dir q) -> a) -> (Dir p, Dir q) -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (Dir p, Dir q) -> a
g)
EC (Pos p, Dir p -> Pos q)
pos (Dir p, Dir q) -> a
g -> (Pos p, Dir p -> Pos q)
-> ((Dir p, Dir q) -> b) -> Eval ('Comp p q) b
forall (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC (Pos p, Dir p -> Pos q)
pos (a -> b
f (a -> b) -> ((Dir p, Dir q) -> a) -> (Dir p, Dir q) -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (Dir p, Dir q) -> a
g)
class Netlist (p :: Poly) where
toNet :: Eval p x -> (Pos p, Dir p -> x)
fromNet :: Pos p -> (Dir p -> x) -> Eval p x
instance Netlist 'Y where
toNet :: forall x. Eval 'Y x -> (Pos 'Y, Dir 'Y -> x)
toNet (EY x
x) = ((), \() -> x
x)
fromNet :: forall x. Pos 'Y -> (Dir 'Y -> x) -> Eval 'Y x
fromNet () Dir 'Y -> x
k = x -> Eval 'Y x
forall x. x -> Eval 'Y x
EY (Dir 'Y -> x
k ())
instance Netlist ('Const a) where
toNet :: forall x.
Eval ('Const a) x -> (Pos ('Const a), Dir ('Const a) -> x)
toNet (EK c
c) = (c
Pos ('Const a)
c, Void -> x
Dir ('Const a) -> x
forall a. Void -> a
absurd)
fromNet :: forall x.
Pos ('Const a) -> (Dir ('Const a) -> x) -> Eval ('Const a) x
fromNet Pos ('Const a)
c Dir ('Const a) -> x
_ = a -> Eval ('Const a) x
forall p x. p -> Eval ('Const p) x
EK a
Pos ('Const a)
c
instance Netlist ('Exp a) where
toNet :: forall x. Eval ('Exp a) x -> (Pos ('Exp a), Dir ('Exp a) -> x)
toNet (EE a -> x
f) = ((), a -> x
Dir ('Exp a) -> x
f)
fromNet :: forall x. Pos ('Exp a) -> (Dir ('Exp a) -> x) -> Eval ('Exp a) x
fromNet () = (a -> x) -> Eval ('Exp a) x
(Dir ('Exp a) -> x) -> Eval ('Exp a) x
forall p x. (p -> x) -> Eval ('Exp p) x
EE
instance (Netlist p, Netlist q) => Netlist ('Prod p q) where
toNet :: forall x.
Eval ('Prod p q) x -> (Pos ('Prod p q), Dir ('Prod p q) -> x)
toNet (EP (Eval p x
u, Eval q x
v)) =
let (Pos p
i, Dir p -> x
f) = Eval p x -> (Pos p, Dir p -> x)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p 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. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval q x
v
in ((Pos p
Pos p
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 p -> x
f Dir q -> x
Dir q -> x
g)
fromNet :: forall x.
Pos ('Prod p q) -> (Dir ('Prod p q) -> x) -> Eval ('Prod p q) x
fromNet (Pos p
i, Pos q
j) Dir ('Prod p q) -> x
k = (Eval p x, Eval q x) -> Eval ('Prod p q) x
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP (Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet 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 (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr 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.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet 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 (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Dir q -> Either (Dir p) (Dir q)
forall a b. b -> Either a b
Right))
instance Netlist ('Tensor p q) where
toNet :: forall x.
Eval ('Tensor p q) x -> (Pos ('Tensor p q), Dir ('Tensor p q) -> x)
toNet (ET (Pos p, Pos q)
ij (Dir p, Dir q) -> x
f) = ((Pos p, Pos q)
Pos ('Tensor p q)
ij, (Dir p, Dir q) -> x
Dir ('Tensor p q) -> x
f)
fromNet :: forall x.
Pos ('Tensor p q)
-> (Dir ('Tensor p q) -> x) -> Eval ('Tensor p q) x
fromNet = (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 (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET
instance Netlist ('Comp p q) where
toNet :: forall x.
Eval ('Comp p q) x -> (Pos ('Comp p q), Dir ('Comp p q) -> x)
toNet (EC (Pos p, Dir p -> Pos q)
i (Dir p, Dir q) -> x
k) = ((Pos p, Dir p -> Pos q)
Pos ('Comp p q)
i, (Dir p, Dir q) -> x
Dir ('Comp p q) -> x
k)
fromNet :: forall x.
Pos ('Comp p q) -> (Dir ('Comp p q) -> x) -> Eval ('Comp p q) x
fromNet = (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 (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC
netRoundTrip :: (Netlist p) => Eval p x -> Eval p x
netRoundTrip :: forall (p :: Poly) x. Netlist p => Eval p x -> Eval p x
netRoundTrip Eval p x
v = (Pos p -> (Dir p -> x) -> Eval p x)
-> (Pos p, Dir p -> x) -> Eval p x
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet (Eval p x -> (Pos p, Dir p -> x)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p x
v)
tensorUnitorL :: (Netlist p) => Eval ('Tensor 'Y p) x -> Eval p x
tensorUnitorL :: forall (p :: Poly) x.
Netlist p =>
Eval ('Tensor 'Y p) x -> Eval p x
tensorUnitorL (ET ((), Pos q
i) (Dir p, Dir q) -> x
f) = Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet Pos p
Pos q
i (\Dir p
dp -> (Dir p, Dir q) -> x
f ((), Dir p
Dir q
dp))
tensorUnitorL' :: (Netlist p) => Eval p x -> Eval ('Tensor 'Y p) x
tensorUnitorL' :: forall (p :: Poly) x.
Netlist p =>
Eval p x -> Eval ('Tensor 'Y p) x
tensorUnitorL' Eval p x
v =
let (Pos p
i, Dir p -> x
k) = Eval p x -> (Pos p, Dir p -> x)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p x
v
in (Pos 'Y, Pos p) -> ((Dir 'Y, Dir p) -> x) -> Eval ('Tensor 'Y p) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET ((), Pos p
i) (\((), Dir p
dp) -> Dir p -> x
k Dir p
dp)
tensorUnitorR :: (Netlist p) => Eval ('Tensor p 'Y) x -> Eval p x
tensorUnitorR :: forall (p :: Poly) x.
Netlist p =>
Eval ('Tensor p 'Y) x -> Eval p x
tensorUnitorR (ET (Pos p
i, ()) (Dir p, Dir q) -> x
f) = Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet Pos p
Pos p
i (\Dir p
dp -> (Dir p, Dir q) -> x
f (Dir p
Dir p
dp, ()))
tensorUnitorR' :: (Netlist p) => Eval p x -> Eval ('Tensor p 'Y) x
tensorUnitorR' :: forall (p :: Poly) x.
Netlist p =>
Eval p x -> Eval ('Tensor p 'Y) x
tensorUnitorR' Eval p x
v =
let (Pos p
i, Dir p -> x
k) = Eval p x -> (Pos p, Dir p -> x)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p x
v
in (Pos p, Pos 'Y) -> ((Dir p, Dir 'Y) -> x) -> Eval ('Tensor p 'Y) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET (Pos p
i, ()) (\(Dir p
dp, ()) -> Dir p -> x
k Dir p
dp)
morphAt :: (Netlist p, Netlist p') => Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
morphAt :: forall (p :: Poly) (p' :: Poly).
(Netlist p, Netlist p') =>
Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
morphAt Morphism p p'
m Pos p
i =
let (Pos p'
i', Dir p' -> Dir p
k) = Eval p' (Dir p) -> (Pos p', Dir p' -> Dir p)
forall x. Eval p' x -> (Pos p', Dir p' -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet (Morphism p p' -> forall x. Eval p x -> Eval p' x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism p p'
m (Pos p -> (Dir p -> Dir p) -> Eval p (Dir p)
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet Pos p
i Dir p -> Dir p
forall a. a -> a
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id))
in (Pos p'
i', Dir p' -> Dir p
k)
parT ::
(Netlist p, Netlist q, Netlist p', Netlist q') =>
Morphism p p' ->
Morphism q q' ->
Eval ('Tensor p q) x ->
Eval ('Tensor p' q') x
parT :: forall (p :: Poly) (q :: Poly) (p' :: Poly) (q' :: Poly) x.
(Netlist p, Netlist q, Netlist p', Netlist q') =>
Morphism p p'
-> Morphism q q' -> Eval ('Tensor p q) x -> Eval ('Tensor p' q') x
parT Morphism p p'
m Morphism q q'
n (ET (Pos p
i, Pos q
j) (Dir p, Dir q) -> x
f) =
let (Pos p'
i', Dir p' -> Dir p
pullM) = Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
forall (p :: Poly) (p' :: Poly).
(Netlist p, Netlist p') =>
Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
morphAt Morphism p p'
m Pos p
Pos p
i
(Pos q'
j', Dir q' -> Dir q
pullN) = Morphism q q' -> Pos q -> (Pos q', Dir q' -> Dir q)
forall (p :: Poly) (p' :: Poly).
(Netlist p, Netlist p') =>
Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
morphAt Morphism q q'
n Pos q
Pos q
j
in (Pos p', Pos q')
-> ((Dir p', Dir q') -> x) -> Eval ('Tensor p' q') x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET (Pos p'
i', Pos q'
j') ((Dir p, Dir q) -> x
(Dir p, Dir q) -> x
f ((Dir p, Dir q) -> x)
-> ((Dir p', Dir q') -> (Dir p, Dir q)) -> (Dir p', Dir q') -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (Dir p' -> Dir p)
-> (Dir q' -> Dir q) -> (Dir p', Dir q') -> (Dir p, Dir q)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap Dir p' -> Dir p
pullM Dir q' -> Dir q
pullN)
nestedToComp :: (Netlist p, Netlist q) => Eval p (Eval q x) -> Eval ('Comp p q) x
nestedToComp :: forall (p :: Poly) (q :: Poly) x.
(Netlist p, Netlist q) =>
Eval p (Eval q x) -> Eval ('Comp p q) x
nestedToComp Eval p (Eval q x)
v =
let (Pos p
i, Dir p -> Eval q x
g) = Eval p (Eval q x) -> (Pos p, Dir p -> Eval q x)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p (Eval q x)
v
in (Pos p, Dir p -> Pos q)
-> ((Dir p, Dir q) -> x) -> Eval ('Comp p q) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC (Pos p
i, (Pos q, Dir q -> x) -> Pos q
forall a b. (a, b) -> a
fst ((Pos q, Dir q -> x) -> Pos q)
-> (Eval q x -> (Pos q, Dir q -> x)) -> Eval q x -> Pos q
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Eval q x -> (Pos q, Dir q -> x)
forall x. Eval q x -> (Pos q, Dir q -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet (Eval q x -> Pos q) -> (Dir p -> Eval q x) -> Dir p -> Pos q
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Dir p -> Eval q x
g) (\(Dir p
dp, Dir q
dq) -> (Pos q, Dir q -> x) -> Dir q -> x
forall a b. (a, b) -> b
snd (Eval q x -> (Pos q, Dir q -> x)
forall x. Eval q x -> (Pos q, Dir q -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet (Dir p -> Eval q x
g Dir p
dp)) Dir q
dq)
compToNested :: (Netlist p, Netlist q) => Eval ('Comp p q) x -> Eval p (Eval q x)
compToNested :: forall (p :: Poly) (q :: Poly) x.
(Netlist p, Netlist q) =>
Eval ('Comp p q) x -> Eval p (Eval q x)
compToNested (EC (Pos p
i, Dir p -> Pos q
hang) (Dir p, Dir q) -> x
k) =
Pos p -> (Dir p -> Eval q x) -> Eval p (Eval q x)
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet Pos p
Pos p
i (\Dir p
dp -> Pos q -> (Dir q -> x) -> Eval q x
forall x. Pos q -> (Dir q -> x) -> Eval q x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet (Dir p -> Pos q
hang Dir p
Dir p
dp) (\Dir q
dq -> (Dir p, Dir q) -> x
k (Dir p
Dir p
dp, Dir q
Dir q
dq)))
compUnitorL :: (Netlist p) => Eval ('Comp 'Y p) x -> Eval p x
compUnitorL :: forall (p :: Poly) x. Netlist p => Eval ('Comp 'Y p) x -> Eval p x
compUnitorL (EC ((), Dir p -> Pos q
hang) (Dir p, Dir q) -> x
k) =
Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet (Dir p -> Pos q
hang ()) (\Dir p
dp -> (Dir p, Dir q) -> x
k ((), Dir p
Dir q
dp))
compUnitorL' :: (Netlist p) => Eval p x -> Eval ('Comp 'Y p) x
compUnitorL' :: forall (p :: Poly) x. Netlist p => Eval p x -> Eval ('Comp 'Y p) x
compUnitorL' Eval p x
v =
let (Pos p
i, Dir p -> x
k) = Eval p x -> (Pos p, Dir p -> x)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p x
v
in (Pos 'Y, Dir 'Y -> Pos p)
-> ((Dir 'Y, Dir p) -> x) -> Eval ('Comp 'Y p) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC ((), Pos p -> () -> Pos p
forall a b. a -> b -> a
const Pos p
i) (\((), Dir p
dp) -> Dir p -> x
k Dir p
dp)
compUnitorR :: (Netlist p) => Eval ('Comp p 'Y) x -> Eval p x
compUnitorR :: forall (p :: Poly) x. Netlist p => Eval ('Comp p 'Y) x -> Eval p x
compUnitorR (EC (Pos p
i, Dir p -> Pos q
_) (Dir p, Dir q) -> x
k) =
Pos p -> (Dir p -> x) -> Eval p x
forall x. Pos p -> (Dir p -> x) -> Eval p x
forall (p :: Poly) x.
Netlist p =>
Pos p -> (Dir p -> x) -> Eval p x
fromNet Pos p
Pos p
i (\Dir p
dp -> (Dir p, Dir q) -> x
k (Dir p
Dir p
dp, ()))
compUnitorR' :: (Netlist p) => Eval p x -> Eval ('Comp p 'Y) x
compUnitorR' :: forall (p :: Poly) x. Netlist p => Eval p x -> Eval ('Comp p 'Y) x
compUnitorR' Eval p x
v =
let (Pos p
i, Dir p -> x
k) = Eval p x -> (Pos p, Dir p -> x)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p x
v
in (Pos p, Dir p -> Pos 'Y)
-> ((Dir p, Dir 'Y) -> x) -> Eval ('Comp p 'Y) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC (Pos p
i, () -> Dir p -> ()
forall a b. a -> b -> a
const ()) (\(Dir p
dp, ()) -> Dir p -> x
k Dir p
dp)
compAssocL :: Eval ('Comp ('Comp p q) r) x -> Eval ('Comp p ('Comp q r)) x
compAssocL :: forall (p :: Poly) (q :: Poly) (r :: Poly) x.
Eval ('Comp ('Comp p q) r) x -> Eval ('Comp p ('Comp q r)) x
compAssocL (EC ((Pos p
i, Dir p -> Pos q
f), Dir p -> Pos q
g) (Dir p, Dir q) -> x
k) =
(Pos p, Dir p -> Pos ('Comp q r))
-> ((Dir p, Dir ('Comp q r)) -> x) -> Eval ('Comp p ('Comp q r)) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC
( Pos p
i,
\Dir p
dp ->
let j :: Pos q
j = Dir p -> Pos q
f Dir p
dp
h :: Dir q -> Pos q
h Dir q
dq = Dir p -> Pos q
g (Dir p
dp, Dir q
dq)
in (Pos q
j, Dir q -> Pos r
Dir q -> Pos q
h)
)
(\(Dir p
dp, (Dir q
dq, Dir r
dr)) -> (Dir p, Dir q) -> x
k ((Dir p
dp, Dir q
dq), Dir r
Dir q
dr))
compAssocR :: Eval ('Comp p ('Comp q r)) x -> Eval ('Comp ('Comp p q) r) x
compAssocR :: forall (p :: Poly) (q :: Poly) (r :: Poly) x.
Eval ('Comp p ('Comp q r)) x -> Eval ('Comp ('Comp p q) r) x
compAssocR (EC (Pos p
i, Dir p -> Pos q
h) (Dir p, Dir q) -> x
k) =
let f :: Dir p -> Pos q
f = (Pos q, Dir q -> Pos r) -> Pos q
forall a b. (a, b) -> a
fst ((Pos q, Dir q -> Pos r) -> Pos q)
-> (Dir p -> (Pos q, Dir q -> Pos r)) -> Dir p -> Pos q
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Dir p -> (Pos q, Dir q -> Pos r)
Dir p -> Pos q
h
g :: (Dir p, Dir q) -> Pos r
g (Dir p
dp, Dir q
dq) = (Pos q, Dir q -> Pos r) -> Dir q -> Pos r
forall a b. (a, b) -> b
snd (Dir p -> Pos q
h Dir p
Dir p
dp) Dir q
dq
in (Pos ('Comp p q), Dir ('Comp p q) -> Pos r)
-> ((Dir ('Comp p q), Dir r) -> x) -> Eval ('Comp ('Comp p q) r) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC ((Pos p
Pos p
i, Dir p -> Pos q
f), (Dir p, Dir q) -> Pos r
Dir ('Comp p q) -> Pos r
g) (\((Dir p
dp, Dir q
dq), Dir r
dr) -> (Dir p, Dir q) -> x
k (Dir p
Dir p
dp, (Dir q
dq, Dir r
dr)))
compT ::
Morphism (Mono da a) (Mono db b) ->
Morphism (Mono dc c) (Mono dd d) ->
Eval ('Comp (Mono da a) (Mono dc c)) x ->
Eval ('Comp (Mono db b) (Mono dd d)) x
compT :: forall da a db b dc c dd d x.
Morphism (Mono da a) (Mono db b)
-> Morphism (Mono dc c) (Mono dd d)
-> Eval ('Comp (Mono da a) (Mono dc c)) x
-> Eval ('Comp (Mono db b) (Mono dd d)) x
compT Morphism (Mono da a) (Mono db b)
f Morphism (Mono dc c) (Mono dd d)
g (EC (Pos p
aPos, Dir p -> Pos q
hang) (Dir p, Dir q) -> x
k) =
let ((b
bPos, ()), Dir (Mono db b) -> Dir (Mono da a)
fBw) = Morphism (Mono da a) (Mono db b)
-> Pos (Mono da a)
-> (Pos (Mono db b), Dir (Mono db b) -> Dir (Mono da a))
forall (p :: Poly) (p' :: Poly).
(Netlist p, Netlist p') =>
Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
morphAt Morphism (Mono da a) (Mono db b)
f Pos p
Pos (Mono da a)
aPos
newHang :: Either Void db -> Pos (Mono dd d)
newHang Either Void db
db =
let da :: Dir (Mono da a)
da = Dir (Mono db b) -> Dir (Mono da a)
fBw Either Void db
Dir (Mono db b)
db
cPos :: Pos q
cPos = Dir p -> Pos q
hang Dir p
Dir (Mono da a)
da
(Pos (Mono dd d)
dPos, Dir (Mono dd d) -> Dir (Mono dc c)
_) = Morphism (Mono dc c) (Mono dd d)
-> Pos (Mono dc c)
-> (Pos (Mono dd d), Dir (Mono dd d) -> Dir (Mono dc c))
forall (p :: Poly) (p' :: Poly).
(Netlist p, Netlist p') =>
Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
morphAt Morphism (Mono dc c) (Mono dd d)
g Pos q
Pos (Mono dc c)
cPos
in Pos (Mono dd d)
dPos
newK :: (Either Void db, Either Void dd) -> x
newK (Either Void db
db, Either Void dd
dd) =
let da :: Dir (Mono da a)
da = Dir (Mono db b) -> Dir (Mono da a)
fBw Either Void db
Dir (Mono db b)
db
cPos :: Pos q
cPos = Dir p -> Pos q
hang Dir p
Dir (Mono da a)
da
(Pos (Mono dd d)
_, Dir (Mono dd d) -> Dir (Mono dc c)
gBw) = Morphism (Mono dc c) (Mono dd d)
-> Pos (Mono dc c)
-> (Pos (Mono dd d), Dir (Mono dd d) -> Dir (Mono dc c))
forall (p :: Poly) (p' :: Poly).
(Netlist p, Netlist p') =>
Morphism p p' -> Pos p -> (Pos p', Dir p' -> Dir p)
morphAt Morphism (Mono dc c) (Mono dd d)
g Pos q
Pos (Mono dc c)
cPos
dc :: Dir (Mono dc c)
dc = Dir (Mono dd d) -> Dir (Mono dc c)
gBw Either Void dd
Dir (Mono dd d)
dd
in (Dir p, Dir q) -> x
k (Dir p
Dir (Mono da a)
da, Dir q
Dir (Mono dc c)
dc)
in (Pos (Mono db b), Dir (Mono db b) -> Pos (Mono dd d))
-> ((Dir (Mono db b), Dir (Mono dd d)) -> x)
-> Eval ('Comp (Mono db b) (Mono dd d)) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Dir p -> Pos b)
-> ((Dir p, Dir b) -> x) -> Eval ('Comp p b) x
EC ((b
bPos, ()), Either Void db -> Pos (Mono dd d)
Dir (Mono db b) -> Pos (Mono dd d)
newHang) (Either Void db, Either Void dd) -> x
(Dir (Mono db b), Dir (Mono dd d)) -> x
newK
tensorEval :: (Netlist p, Netlist q) => Eval p a -> Eval q b -> Eval (Tensor p q) (a, b)
tensorEval :: forall (p :: Poly) (q :: Poly) a b.
(Netlist p, Netlist q) =>
Eval p a -> Eval q b -> Eval ('Tensor p q) (a, b)
tensorEval Eval p a
v Eval q b
w =
let (Pos p
i, Dir p -> a
fv) = Eval p a -> (Pos p, Dir p -> a)
forall x. Eval p x -> (Pos p, Dir p -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval p a
v
(Pos q
j, Dir q -> b
fw) = Eval q b -> (Pos q, Dir q -> b)
forall x. Eval q x -> (Pos q, Dir q -> x)
forall (p :: Poly) x. Netlist p => Eval p x -> (Pos p, Dir p -> x)
toNet Eval q b
w
in (Pos p, Pos q)
-> ((Dir p, Dir q) -> (a, b)) -> Eval ('Tensor p q) (a, b)
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET (Pos p
i, Pos q
j) ((Dir p -> a) -> (Dir q -> b) -> (Dir p, Dir q) -> (a, b)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap Dir p -> a
fv Dir q -> b
fw)
data Morphism (p :: Poly) (q :: Poly) where
Id :: Morphism p p
Point :: Eval q () -> Morphism 'Y q
ConstMap :: (a -> b) -> Morphism ('Const a) ('Const b)
ExpMap :: (a -> b) -> Morphism ('Exp b) ('Exp a)
Compose :: Morphism q r -> Morphism p q -> Morphism p r
Par :: Morphism p p' -> Morphism q q' -> Morphism ('Prod p q) ('Prod p' q')
Inl :: Morphism p ('Sum p q)
Inr :: Morphism q ('Sum p q)
Case :: Morphism p r -> Morphism q r -> Morphism ('Sum p q) r
Fst :: Morphism ('Prod p q) p
Snd :: Morphism ('Prod p q) q
Pair :: Morphism r p -> Morphism r q -> Morphism r ('Prod p q)
Konst :: b -> Morphism p ('Const b)
Depend :: (a -> Morphism p q) -> Morphism ('Prod ('Const a) p) q
TensorAssocL :: Morphism ('Tensor ('Tensor p q) r) ('Tensor p ('Tensor q r))
TensorAssocR :: Morphism ('Tensor p ('Tensor q r)) ('Tensor ('Tensor p q) r)
TensorBraid :: Morphism ('Tensor p q) ('Tensor q p)
ParT ::
Morphism (Mono da a) (Mono db b) ->
Morphism (Mono dc c) (Mono dd d) ->
Morphism ('Tensor (Mono da a) (Mono dc c)) ('Tensor (Mono db b) (Mono dd d))
CompUnitL :: (Netlist p) => Morphism ('Comp 'Y p) p
CompUnitL' :: (Netlist p) => Morphism p ('Comp 'Y p)
CompUnitR :: (Netlist p) => Morphism ('Comp p 'Y) p
CompUnitR' :: (Netlist p) => Morphism p ('Comp p 'Y)
CompAssocL :: Morphism ('Comp ('Comp p q) r) ('Comp p ('Comp q r))
CompAssocR :: Morphism ('Comp p ('Comp q r)) ('Comp ('Comp p q) r)
CompT ::
Morphism (Mono da a) (Mono db b) ->
Morphism (Mono dc c) (Mono dd d) ->
Morphism ('Comp (Mono da a) (Mono dc c)) ('Comp (Mono db b) (Mono dd d))
Prism ::
(s -> Either a s) ->
(a -> s) ->
Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
instance Category Morphism where
id :: forall (a :: Poly). Morphism a a
id = Morphism a a
forall (a :: Poly). Morphism a a
Id
. :: forall (b :: Poly) (c :: Poly) (a :: Poly).
Morphism b c -> Morphism a b -> Morphism a c
(.) = Morphism b c -> Morphism a b -> Morphism a c
forall (b :: Poly) (c :: Poly) (a :: Poly).
Morphism b c -> Morphism a b -> Morphism a c
Compose
runMorphism :: Morphism p q -> (forall x. Eval p x -> Eval q x)
runMorphism :: forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism = \case
Morphism p q
Id -> Eval p x -> Eval p x
Eval p x -> Eval q x
forall a. a -> a
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id
Point Eval q ()
u -> \(EY x
v) -> (() -> x) -> Eval q () -> Eval q x
forall a b. (a -> b) -> Eval q a -> Eval q b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (x -> () -> x
forall a b. a -> b -> a
const x
v) Eval q ()
u
ConstMap a -> b
f -> \(EK c
a) -> b -> Eval ('Const b) x
forall p x. p -> Eval ('Const p) x
EK (a -> b
f a
c
a)
ExpMap a -> b
f -> \(EE a -> x
g) -> (a -> x) -> Eval ('Exp a) x
forall p x. (p -> x) -> Eval ('Exp p) x
EE (b -> x
a -> x
g (b -> x) -> (a -> b) -> a -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. a -> b
f)
Compose Morphism q q
g Morphism p q
f -> Morphism q q -> forall x. Eval q x -> Eval q x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism q q
g (Eval q x -> Eval q x)
-> (Eval p x -> Eval q x) -> Eval p x -> Eval q x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Morphism p q -> forall x. Eval p x -> Eval q x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism p q
f
Par Morphism p p'
f Morphism q q'
g -> \(EP (Eval p x
a, Eval q x
b)) -> (Eval p' x, Eval q' x) -> Eval ('Prod p' q') x
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP (Morphism p p' -> forall x. Eval p x -> Eval p' x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism p p'
f Eval p x
Eval p x
a, Morphism q q' -> forall x. Eval q x -> Eval q' x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism q q'
g Eval q x
Eval q x
b)
Morphism p q
Inl -> Either (Eval p x) (Eval q x) -> Eval ('Sum p q) x
forall (p :: Poly) x (b :: Poly).
Either (Eval p x) (Eval b x) -> Eval ('Sum p b) x
ES (Either (Eval p x) (Eval q x) -> Eval ('Sum p q) x)
-> (Eval p x -> Either (Eval p x) (Eval q x))
-> Eval p x
-> Eval ('Sum p q) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Eval p x -> Either (Eval p x) (Eval q x)
forall a b. a -> Either a b
Left
Morphism p q
Inr -> Either (Eval p x) (Eval p x) -> Eval ('Sum p p) x
forall (p :: Poly) x (b :: Poly).
Either (Eval p x) (Eval b x) -> Eval ('Sum p b) x
ES (Either (Eval p x) (Eval p x) -> Eval ('Sum p p) x)
-> (Eval p x -> Either (Eval p x) (Eval p x))
-> Eval p x
-> Eval ('Sum p p) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. Eval p x -> Either (Eval p x) (Eval p x)
forall a b. b -> Either a b
Right
Case Morphism p q
f Morphism q q
g -> \case
ES (Left Eval p x
a) -> Morphism p q -> forall x. Eval p x -> Eval q x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism p q
f Eval p x
Eval p x
a
ES (Right Eval q x
b) -> Morphism q q -> forall x. Eval q x -> Eval q x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism q q
g Eval q x
Eval q x
b
Morphism p q
Fst -> \(EP (Eval p x
a, Eval q x
_)) -> Eval q x
Eval p x
a
Morphism p q
Snd -> \(EP (Eval p x
_, Eval q x
b)) -> Eval q x
Eval q x
b
Pair Morphism p p
f Morphism p q
g -> \Eval p x
r -> (Eval p x, Eval q x) -> Eval ('Prod p q) x
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP (Morphism p p -> forall x. Eval p x -> Eval p x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism p p
f Eval p x
r, Morphism p q -> forall x. Eval p x -> Eval q x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism p q
g Eval p x
r)
Konst b
b -> \Eval p x
_ -> b -> Eval ('Const b) x
forall p x. p -> Eval ('Const p) x
EK b
b
Depend a -> Morphism p q
k -> \(EP (EK c
a, Eval q x
p)) -> Morphism p q -> forall x. Eval p x -> Eval q x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism (a -> Morphism p q
k a
c
a) Eval p x
Eval q x
p
Morphism p q
TensorAssocL -> \(ET ((Pos p
pp, Pos q
pq), Pos q
pr) (Dir p, Dir q) -> x
f) ->
(Pos p, Pos ('Tensor q r))
-> ((Dir p, Dir ('Tensor q r)) -> x)
-> Eval ('Tensor p ('Tensor q r)) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET (Pos p
pp, (Pos q
pq, Pos r
Pos q
pr)) (((Dir p, Dir q), Dir r) -> x
(Dir p, Dir q) -> x
f (((Dir p, Dir q), Dir r) -> x)
-> ((Dir p, (Dir q, Dir r)) -> ((Dir p, Dir q), Dir r))
-> (Dir p, (Dir q, Dir r))
-> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (\(Dir p
dp, (Dir q
dq, Dir r
dr)) -> ((Dir p
dp, Dir q
dq), Dir r
dr)))
Morphism p q
TensorAssocR -> \(ET (Pos p
pp, (Pos q
pq, Pos r
pr)) (Dir p, Dir q) -> x
f) ->
(Pos ('Tensor p q), Pos r)
-> ((Dir ('Tensor p q), Dir r) -> x)
-> Eval ('Tensor ('Tensor p q) r) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET ((Pos p
Pos p
pp, Pos q
pq), Pos r
pr) ((Dir p, (Dir q, Dir r)) -> x
(Dir p, Dir q) -> x
f ((Dir p, (Dir q, Dir r)) -> x)
-> (((Dir p, Dir q), Dir r) -> (Dir p, (Dir q, Dir r)))
-> ((Dir p, Dir q), Dir r)
-> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (\((Dir p
dp, Dir q
dq), Dir r
dr) -> (Dir p
dp, (Dir q
dq, Dir r
dr))))
Morphism p q
TensorBraid -> \(ET (Pos p
pp, Pos q
pq) (Dir p, Dir q) -> x
f) ->
(Pos q, Pos p) -> ((Dir q, Dir p) -> x) -> Eval ('Tensor q p) x
forall (p :: Poly) (b :: Poly) x.
(Pos p, Pos b) -> ((Dir p, Dir b) -> x) -> Eval ('Tensor p b) x
ET (Pos q
Pos q
pq, Pos p
Pos p
pp) ((Dir p, Dir q) -> x
(Dir p, Dir q) -> x
f ((Dir p, Dir q) -> x)
-> ((Dir q, Dir p) -> (Dir p, Dir q)) -> (Dir q, Dir p) -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. (\(Dir q
dq, Dir p
dp) -> (Dir p
dp, Dir q
dq)))
ParT Morphism (Mono da a) (Mono db b)
m Morphism (Mono dc c) (Mono dd d)
n -> Morphism (Mono da a) (Mono db b)
-> Morphism (Mono dc c) (Mono dd d)
-> Eval ('Tensor (Mono da a) (Mono dc c)) x
-> Eval ('Tensor (Mono db b) (Mono dd d)) x
forall (p :: Poly) (q :: Poly) (p' :: Poly) (q' :: Poly) x.
(Netlist p, Netlist q, Netlist p', Netlist q') =>
Morphism p p'
-> Morphism q q' -> Eval ('Tensor p q) x -> Eval ('Tensor p' q') x
parT Morphism (Mono da a) (Mono db b)
m Morphism (Mono dc c) (Mono dd d)
n
Morphism p q
CompUnitL -> Eval p x -> Eval q x
Eval ('Comp 'Y q) x -> Eval q x
forall (p :: Poly) x. Netlist p => Eval ('Comp 'Y p) x -> Eval p x
compUnitorL
Morphism p q
CompUnitL' -> Eval p x -> Eval q x
Eval p x -> Eval ('Comp 'Y p) x
forall (p :: Poly) x. Netlist p => Eval p x -> Eval ('Comp 'Y p) x
compUnitorL'
Morphism p q
CompUnitR -> Eval p x -> Eval q x
Eval ('Comp q 'Y) x -> Eval q x
forall (p :: Poly) x. Netlist p => Eval ('Comp p 'Y) x -> Eval p x
compUnitorR
Morphism p q
CompUnitR' -> Eval p x -> Eval q x
Eval p x -> Eval ('Comp p 'Y) x
forall (p :: Poly) x. Netlist p => Eval p x -> Eval ('Comp p 'Y) x
compUnitorR'
Morphism p q
CompAssocL -> Eval p x -> Eval q x
Eval ('Comp ('Comp p q) r) x -> Eval ('Comp p ('Comp q r)) x
forall (p :: Poly) (q :: Poly) (r :: Poly) x.
Eval ('Comp ('Comp p q) r) x -> Eval ('Comp p ('Comp q r)) x
compAssocL
Morphism p q
CompAssocR -> Eval p x -> Eval q x
Eval ('Comp p ('Comp q r)) x -> Eval ('Comp ('Comp p q) r) x
forall (p :: Poly) (q :: Poly) (r :: Poly) x.
Eval ('Comp p ('Comp q r)) x -> Eval ('Comp ('Comp p q) r) x
compAssocR
CompT Morphism (Mono da a) (Mono db b)
m Morphism (Mono dc c) (Mono dd d)
n -> Morphism (Mono da a) (Mono db b)
-> Morphism (Mono dc c) (Mono dd d)
-> Eval ('Comp (Mono da a) (Mono dc c)) x
-> Eval ('Comp (Mono db b) (Mono dd d)) x
forall da a db b dc c dd d x.
Morphism (Mono da a) (Mono db b)
-> Morphism (Mono dc c) (Mono dd d)
-> Eval ('Comp (Mono da a) (Mono dc c)) x
-> Eval ('Comp (Mono db b) (Mono dd d)) x
compT Morphism (Mono da a) (Mono db b)
m Morphism (Mono dc c) (Mono dd d)
n
Prism s -> Either a s
match a -> s
build -> \case
EP (EK c
s, EE a -> x
k) -> case s -> Either a s
match s
c
s of
Left a
a -> Either (Eval (Mono a a) x) (Eval ('Prod ('Const s) ('Exp s)) x)
-> Eval ('Sum (Mono a a) ('Prod ('Const s) ('Exp s))) x
forall (p :: Poly) x (b :: Poly).
Either (Eval p x) (Eval b x) -> Eval ('Sum p b) x
ES (Eval (Mono a a) x
-> Either (Eval (Mono a a) x) (Eval ('Prod ('Const s) ('Exp s)) x)
forall a b. a -> Either a b
Left ((Eval ('Const a) x, Eval ('Exp a) x) -> Eval (Mono a a) x
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP (a -> Eval ('Const a) x
forall p x. p -> Eval ('Const p) x
EK a
a, (a -> x) -> Eval ('Exp a) x
forall p x. (p -> x) -> Eval ('Exp p) x
EE (s -> x
a -> x
k (s -> x) -> (a -> s) -> a -> x
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. a -> s
build))))
Right s
s' -> Either (Eval (Mono a a) x) (Eval ('Prod ('Const s) ('Exp a)) x)
-> Eval ('Sum (Mono a a) ('Prod ('Const s) ('Exp a))) x
forall (p :: Poly) x (b :: Poly).
Either (Eval p x) (Eval b x) -> Eval ('Sum p b) x
ES (Eval ('Prod ('Const s) ('Exp a)) x
-> Either (Eval (Mono a a) x) (Eval ('Prod ('Const s) ('Exp a)) x)
forall a b. b -> Either a b
Right ((Eval ('Const s) x, Eval ('Exp a) x)
-> Eval ('Prod ('Const s) ('Exp a)) x
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP (s -> Eval ('Const s) x
forall p x. p -> Eval ('Const p) x
EK s
s', (a -> x) -> Eval ('Exp a) x
forall p x. (p -> x) -> Eval ('Exp p) x
EE a -> x
k)))
type Mono i o = 'Prod ('Const o) ('Exp i)
lens :: (a -> b) -> (a -> db -> da) -> Morphism (Mono da a) (Mono db b)
lens :: forall a b db da.
(a -> b) -> (a -> db -> da) -> Morphism (Mono da a) (Mono db b)
lens a -> b
f a -> db -> da
g = (a -> Morphism ('Exp da) (Mono db b))
-> Morphism ('Prod ('Const a) ('Exp da)) (Mono db b)
forall p (b :: Poly) (q :: Poly).
(p -> Morphism b q) -> Morphism ('Prod ('Const p) b) q
Depend (\a
a -> Morphism ('Exp da) ('Const b)
-> Morphism ('Exp da) ('Exp db) -> Morphism ('Exp da) (Mono db b)
forall (r :: Poly) (p :: Poly) (b :: Poly).
Morphism r p -> Morphism r b -> Morphism r ('Prod p b)
Pair (b -> Morphism ('Exp da) ('Const b)
forall p (p :: Poly). p -> Morphism p ('Const p)
Konst (a -> b
f a
a)) ((db -> da) -> Morphism ('Exp da) ('Exp db)
forall p b. (p -> b) -> Morphism ('Exp b) ('Exp p)
ExpMap (a -> db -> da
g a
a)))
dagger :: (a -> b) -> (db -> da) -> Morphism (Mono da a) (Mono db b)
dagger :: forall a b db da.
(a -> b) -> (db -> da) -> Morphism (Mono da a) (Mono db b)
dagger a -> b
f db -> da
g = Morphism (Mono da a) ('Const b)
-> Morphism (Mono da a) ('Exp db)
-> Morphism (Mono da a) ('Prod ('Const b) ('Exp db))
forall (r :: Poly) (p :: Poly) (b :: Poly).
Morphism r p -> Morphism r b -> Morphism r ('Prod p b)
Pair (Morphism ('Const a) ('Const b)
-> Morphism (Mono da a) ('Const a)
-> Morphism (Mono da a) ('Const b)
forall (b :: Poly) (c :: Poly) (a :: Poly).
Morphism b c -> Morphism a b -> Morphism a c
Compose ((a -> b) -> Morphism ('Const a) ('Const b)
forall p b. (p -> b) -> Morphism ('Const p) ('Const b)
ConstMap a -> b
f) Morphism (Mono da a) ('Const a)
forall (p :: Poly) (p :: Poly). Morphism ('Prod p p) p
Fst) (Morphism ('Exp da) ('Exp db)
-> Morphism (Mono da a) ('Exp da) -> Morphism (Mono da a) ('Exp db)
forall (b :: Poly) (c :: Poly) (a :: Poly).
Morphism b c -> Morphism a b -> Morphism a c
Compose ((db -> da) -> Morphism ('Exp da) ('Exp db)
forall p b. (p -> b) -> Morphism ('Exp b) ('Exp p)
ExpMap db -> da
g) Morphism (Mono da a) ('Exp da)
forall (p :: Poly) (q :: Poly). Morphism ('Prod p q) q
Snd)
applyLens :: Morphism (Mono da a) (Mono db b) -> a -> (b, db -> da)
applyLens :: forall da a db b.
Morphism (Mono da a) (Mono db b) -> a -> (b, db -> da)
applyLens Morphism (Mono da a) (Mono db b)
m a
a = case Morphism (Mono da a) (Mono db b)
-> forall x. Eval (Mono da a) x -> Eval (Mono db b) x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism (Mono da a) (Mono db b)
m ((Eval ('Const a) da, Eval ('Exp da) da) -> Eval (Mono da a) da
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP (a -> Eval ('Const a) da
forall p x. p -> Eval ('Const p) x
EK a
a, (da -> da) -> Eval ('Exp da) da
forall p x. (p -> x) -> Eval ('Exp p) x
EE da -> da
forall a. a -> a
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id)) of
EP (EK c
b, EE a -> da
g) -> (b
c
b, db -> da
a -> da
g)
prism ::
(s -> Either a s) ->
(a -> s) ->
Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
prism :: forall s a.
(s -> Either a s)
-> (a -> s) -> Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
prism = (s -> Either a s)
-> (a -> s) -> Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
forall s a.
(s -> Either a s)
-> (a -> s) -> Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
Prism
prismMatch ::
Morphism (Mono s s) ('Sum (Mono a a) (Mono s s)) ->
s ->
Either a s
prismMatch :: forall s a.
Morphism (Mono s s) ('Sum (Mono a a) (Mono s s)) -> s -> Either a s
prismMatch Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
p s
s = case Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
-> forall x.
Eval (Mono s s) x -> Eval ('Sum (Mono a a) (Mono s s)) x
forall (p :: Poly) (q :: Poly).
Morphism p q -> forall x. Eval p x -> Eval q x
runMorphism Morphism (Mono s s) ('Sum (Mono a a) (Mono s s))
p ((Eval ('Const s) s, Eval ('Exp s) s) -> Eval (Mono s s) s
forall (p :: Poly) x (b :: Poly).
(Eval p x, Eval b x) -> Eval ('Prod p b) x
EP (s -> Eval ('Const s) s
forall p x. p -> Eval ('Const p) x
EK s
s, (s -> s) -> Eval ('Exp s) s
forall p x. (p -> x) -> Eval ('Exp p) x
EE s -> s
forall a. a -> a
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id)) of
ES (Left (EP (EK c
a, Eval q s
_))) -> a -> Either a s
forall a b. a -> Either a b
Left a
c
a
ES (Right (EP (EK c
s', Eval q s
_))) -> s -> Either a s
forall a b. b -> Either a b
Right s
c
s'