{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
module Circuit.Poly.StringDiagram
(
Wire,
Diagram,
wire,
box,
boxLabelled,
beside,
thenD,
bend,
bend',
turn,
unitL,
unitL',
unitR,
unitR',
assoc,
assoc',
swap,
prismBox,
traceD,
runDiagram,
SDiagram (..),
skeleton,
sCopy,
sMerge,
sDelete,
sCreate,
)
where
import Circuit.Category qualified as Cat
import Circuit.Channel (Traced (..))
import Circuit.Diagram (SDiagram (..), sCopy, sCreate, sDelete, sMerge)
import Circuit.Poly (Mono, Morphism, applyLens)
import Circuit.Poly.Int (IN, IntMorph (..))
import Circuit.Poly.Int qualified as Int
import Circuit.Syntax (eval)
import Circuit.Tensor qualified as M
import Circuit.Trace (Trace, base)
import Prelude hiding (id, (.))
type Wire a da = IN a da
data Diagram_ a da b db where
Wire_ :: Diagram_ a da a da
Box_ :: String -> Morphism (Mono da a) (Mono db b) -> Diagram_ a da b db
PrismBox_ ::
(s -> Either a s) ->
(a -> s) ->
Diagram_ s s (Either a s) (Either a s)
Beside_ ::
Diagram_ ap am bp bm ->
Diagram_ cp cm dp dm ->
Diagram_ (ap, cp) (am, cm) (bp, dp) (bm, dm)
ThenD_ ::
Diagram_ ap am bp bm ->
Diagram_ bp bm cp cm ->
Diagram_ ap am cp cm
Bend_ :: Diagram_ (da, a) (a, da) () ()
Bend'_ :: Diagram_ () () (a, da) (da, a)
Turn_ :: Diagram_ a da b db -> Diagram_ db b da a
UnitL_ :: Diagram_ ((), a) ((), da) a da
UnitL'_ :: Diagram_ a da ((), a) ((), da)
UnitR_ :: Diagram_ (a, ()) (da, ()) a da
UnitR'_ :: Diagram_ a da (a, ()) (da, ())
Assoc_ ::
Diagram_ (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
Assoc'_ ::
Diagram_ ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
Swap_ ::
Diagram_ (a, b) (da, db) (b, a) (db, da)
Trace_ ::
Diagram_ (s, a) (s, da) (s, b) (s, db) ->
Diagram_ a da b db
newtype Diagram a da b db = Diagram (Diagram_ a da b db)
skeleton :: Diagram a da b db -> SDiagram
skeleton :: forall a da b db. Diagram a da b db -> SDiagram
skeleton (Diagram Diagram_ a da b db
d) = Diagram_ a da b db -> SDiagram
forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ a da b db
d
where
go :: Diagram_ a' da' b' db' -> SDiagram
go :: forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ a' da' b' db'
Wire_ = SDiagram
SWire
go (Box_ String
lbl Morphism (Mono da' a') (Mono db' b')
_) = String -> Int -> Int -> SDiagram
SBox String
lbl Int
1 Int
1
go (PrismBox_ a' -> Either a a'
_ a -> a'
_) = SDiagram
SPrismBox
go (Beside_ Diagram_ ap am bp bm
f Diagram_ cp cm dp dm
g) = SDiagram -> SDiagram -> SDiagram
SBeside (Diagram_ ap am bp bm -> SDiagram
forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ ap am bp bm
f) (Diagram_ cp cm dp dm -> SDiagram
forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ cp cm dp dm
g)
go (ThenD_ Diagram_ a' da' bp bm
f Diagram_ bp bm b' db'
g) = SDiagram -> SDiagram -> SDiagram
SThenD (Diagram_ a' da' bp bm -> SDiagram
forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ a' da' bp bm
f) (Diagram_ bp bm b' db' -> SDiagram
forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ bp bm b' db'
g)
go Diagram_ a' da' b' db'
Bend_ = SDiagram
SBend
go Diagram_ a' da' b' db'
Bend'_ = SDiagram
SBend'
go (Turn_ Diagram_ db' b' da' a'
f) = SDiagram -> SDiagram
STurn (Diagram_ db' b' da' a' -> SDiagram
forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ db' b' da' a'
f)
go Diagram_ a' da' b' db'
UnitL_ = SDiagram
SUnitL
go Diagram_ a' da' b' db'
UnitL'_ = SDiagram
SUnitL'
go Diagram_ a' da' b' db'
UnitR_ = SDiagram
SUnitR
go Diagram_ a' da' b' db'
UnitR'_ = SDiagram
SUnitR'
go Diagram_ a' da' b' db'
Assoc_ = SDiagram
SAssoc
go Diagram_ a' da' b' db'
Assoc'_ = SDiagram
SAssoc'
go Diagram_ a' da' b' db'
Swap_ = SDiagram
SSwap
go (Trace_ Diagram_ (s, a') (s, da') (s, b') (s, db')
f) = SDiagram -> SDiagram
STrace (Diagram_ (s, a') (s, da') (s, b') (s, db') -> SDiagram
forall a' da' b' db'. Diagram_ a' da' b' db' -> SDiagram
go Diagram_ (s, a') (s, da') (s, b') (s, db')
f)
toIntMorph :: Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph :: forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph (Diagram Diagram_ a da b db
d) = case Diagram_ a da b db
d of
Diagram_ a da b db
Wire_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (a, db) -> (da, b)
(b, da) -> (da, b)
forall a b. (a, b) -> (b, a)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k).
Action t arr =>
arr (t a b) (t b a)
M.braid)
Box_ String
_ Morphism (Mono da a) (Mono db b)
m -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (\(a
a, db
db) -> let (b
b, db -> da
put) = Morphism (Mono da a) (Mono db b) -> a -> (b, db -> da)
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 in (db -> da
put db
db, b
b)))
PrismBox_ a -> Either a a
match a -> a
build ->
Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph
( ((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base
( \(a
s, Either a a
e) -> case Either a a
e of
Left a
a -> (a -> a
build a
a, a -> Either a a
match a
s)
Right a
s' -> (a
s', a -> Either a a
match a
s)
)
)
Beside_ Diagram_ ap am bp bm
f Diagram_ cp cm dp dm
g -> IntMorph (,) (Trace (,) (->)) ap am bp bm
-> IntMorph (,) (Trace (,) (->)) cp cm dp dm
-> IntMorph
(,) (Trace (,) (->)) (ap, cp) (am, cm) (bp, dp) (bm, dm)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm cp cm dp
dm.
(Action t arr, Channel t arr) =>
IntMorph t arr ap am bp bm
-> IntMorph t arr cp cm dp dm
-> IntMorph t arr (t ap cp) (t am cm) (t bp dp) (t bm dm)
Int.intTensor (Diagram ap am bp bm -> IntMorph (,) (Trace (,) (->)) ap am bp bm
forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph (Diagram_ ap am bp bm -> Diagram ap am bp bm
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ ap am bp bm
f)) (Diagram cp cm dp dm -> IntMorph (,) (Trace (,) (->)) cp cm dp dm
forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph (Diagram_ cp cm dp dm -> Diagram cp cm dp dm
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ cp cm dp dm
g))
ThenD_ Diagram_ a da bp bm
f Diagram_ bp bm b db
g -> IntMorph (,) (Trace (,) (->)) bp bm b db
-> IntMorph (,) (Trace (,) (->)) a da bp bm
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm cp cm.
(Action t arr, Traced t arr) =>
IntMorph t arr bp bm cp cm
-> IntMorph t arr ap am bp bm -> IntMorph t arr ap am cp cm
Int.comp (Diagram bp bm b db -> IntMorph (,) (Trace (,) (->)) bp bm b db
forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph (Diagram_ bp bm b db -> Diagram bp bm b db
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ bp bm b db
g)) (Diagram a da bp bm -> IntMorph (,) (Trace (,) (->)) a da bp bm
forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph (Diagram_ a da bp bm -> Diagram a da bp bm
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ a da bp bm
f))
Diagram_ a da b db
Bend_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (\((da
da, a
a), ()) -> ((a
a, da
da), ())))
Diagram_ a da b db
Bend'_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (\((), (da
da, a
a)) -> ((), (a
a, da
da))))
Turn_ Diagram_ db b da a
f -> IntMorph (,) (Trace (,) (->)) db b da a
-> IntMorph (,) (Trace (,) (->)) a da b db
forall a da b db.
IntMorph (,) (Trace (,) (->)) a da b db
-> IntMorph (,) (Trace (,) (->)) db b da a
turnInt (Diagram db b da a -> IntMorph (,) (Trace (,) (->)) db b da a
forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph (Diagram_ db b da a -> Diagram db b da a
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ db b da a
f))
Diagram_ a da b db
UnitL_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (IntMorph (,) (->) a da b db -> (a, db) -> (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph IntMorph (,) (->) a da b db
IntMorph (,) (->) ((), b) ((), db) b db
forall a b. IntMorph (,) (->) ((), a) ((), b) a b
Int.unitL))
Diagram_ a da b db
UnitL'_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (IntMorph (,) (->) a da b db -> (a, db) -> (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph IntMorph (,) (->) a da b db
IntMorph (,) (->) a da ((), a) ((), da)
forall a b. IntMorph (,) (->) a b ((), a) ((), b)
Int.unitL'))
Diagram_ a da b db
UnitR_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (IntMorph (,) (->) a da b db -> (a, db) -> (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph IntMorph (,) (->) a da b db
IntMorph (,) (->) (b, ()) (db, ()) b db
forall a b. IntMorph (,) (->) (a, ()) (b, ()) a b
Int.unitR))
Diagram_ a da b db
UnitR'_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (IntMorph (,) (->) a da b db -> (a, db) -> (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph IntMorph (,) (->) a da b db
IntMorph (,) (->) a da (a, ()) (da, ())
forall a b. IntMorph (,) (->) a b (a, ()) (b, ())
Int.unitR'))
Diagram_ a da b db
Assoc_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (IntMorph (,) (->) a da b db -> (a, db) -> (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph IntMorph (,) (->) a da b db
IntMorph
(,) (->) (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
forall a b c da db dc.
IntMorph
(,) (->) (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
Int.tensorAssoc))
Diagram_ a da b db
Assoc'_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (IntMorph (,) (->) a da b db -> (a, db) -> (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph IntMorph (,) (->) a da b db
IntMorph
(,) (->) ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
forall a b c da db dc.
IntMorph
(,) (->) ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
Int.tensorAssoc'))
Diagram_ a da b db
Swap_ -> Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((a, db) -> (da, b)) -> Trace (,) (->) (a, db) (da, b)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (IntMorph (,) (->) a da b db -> (a, db) -> (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph IntMorph (,) (->) a da b db
IntMorph (,) (->) (a, b) (da, db) (b, a) (db, da)
forall a b da db. IntMorph (,) (->) (a, b) (da, db) (b, a) (db, da)
Int.intBraid))
Trace_ Diagram_ (s, a) (s, da) (s, b) (s, db)
f -> IntMorph (,) (Trace (,) (->)) (s, a) (s, da) (s, b) (s, db)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall s a da b db.
IntMorph (,) (Trace (,) (->)) (s, a) (s, da) (s, b) (s, db)
-> IntMorph (,) (Trace (,) (->)) a da b db
traceIntMorph (Diagram (s, a) (s, da) (s, b) (s, db)
-> IntMorph (,) (Trace (,) (->)) (s, a) (s, da) (s, b) (s, db)
forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph (Diagram_ (s, a) (s, da) (s, b) (s, db)
-> Diagram (s, a) (s, da) (s, b) (s, db)
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ (s, a) (s, da) (s, b) (s, db)
f))
where
traceIntMorph ::
IntMorph (,) (Trace (,) (->)) (s, a) (s, da) (s, b) (s, db) ->
IntMorph (,) (Trace (,) (->)) a da b db
traceIntMorph :: forall s a da b db.
IntMorph (,) (Trace (,) (->)) (s, a) (s, da) (s, b) (s, db)
-> IntMorph (,) (Trace (,) (->)) a da b db
traceIntMorph (IntMorph Trace (,) (->) ((s, a), (s, db)) ((s, da), (s, b))
body) =
Trace (,) (->) (a, db) (da, b)
-> IntMorph (,) (Trace (,) (->)) a da b db
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph
( Trace (,) (->) ((s, s), (a, db)) ((s, s), (da, b))
-> Trace (,) (->) (a, db) (da, b)
forall a b c. Trace (,) (->) (a, b) (a, c) -> Trace (,) (->) b c
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Traced t arr =>
arr (t a b) (t a c) -> arr b c
trace
( (((s, da), (s, b)) -> ((s, s), (da, b)))
-> Trace (,) (->) ((s, da), (s, b)) ((s, s), (da, b))
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (\((s
s1, da
s2), (s
da, b
b)) -> ((s
s1, s
da), (da
s2, b
b)))
Trace (,) (->) ((s, da), (s, b)) ((s, s), (da, b))
-> Trace (,) (->) ((s, a), (s, db)) ((s, da), (s, b))
-> Trace (,) (->) ((s, a), (s, db)) ((s, s), (da, b))
forall b c a.
Trace (,) (->) b c -> Trace (,) (->) a b -> Trace (,) (->) a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
Cat.. Trace (,) (->) ((s, a), (s, db)) ((s, da), (s, b))
body
Trace (,) (->) ((s, a), (s, db)) ((s, s), (da, b))
-> Trace (,) (->) ((s, s), (a, db)) ((s, a), (s, db))
-> Trace (,) (->) ((s, s), (a, db)) ((s, s), (da, b))
forall b c a.
Trace (,) (->) b c -> Trace (,) (->) a b -> Trace (,) (->) a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
Cat.. (((s, s), (a, db)) -> ((s, a), (s, db)))
-> Trace (,) (->) ((s, s), (a, db)) ((s, a), (s, db))
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (\((s
s1, s
s2), (a
a, db
db)) -> ((s
s1, a
a), (s
s2, db
db)))
)
)
wire :: Diagram a da a da
wire :: forall a da. Diagram a da a da
wire = Diagram_ a da a da -> Diagram a da a da
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ a da a da
forall a da. Diagram_ a da a da
Wire_
box :: Morphism (Mono da a) (Mono db b) -> Diagram a da b db
box :: forall da a db b.
Morphism (Mono da a) (Mono db b) -> Diagram a da b db
box = String -> Morphism (Mono da a) (Mono db b) -> Diagram a da b db
forall da a db b.
String -> Morphism (Mono da a) (Mono db b) -> Diagram a da b db
boxLabelled String
"box"
boxLabelled :: String -> Morphism (Mono da a) (Mono db b) -> Diagram a da b db
boxLabelled :: forall da a db b.
String -> Morphism (Mono da a) (Mono db b) -> Diagram a da b db
boxLabelled String
lbl Morphism (Mono da a) (Mono db b)
m = Diagram_ a da b db -> Diagram a da b db
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram (String -> Morphism (Mono da a) (Mono db b) -> Diagram_ a da b db
forall da a db b.
String -> Morphism (Mono da a) (Mono db b) -> Diagram_ a da b db
Box_ String
lbl Morphism (Mono da a) (Mono db b)
m)
prismBox ::
(s -> Either a s) ->
(a -> s) ->
Diagram s s (Either a s) (Either a s)
prismBox :: forall s a.
(s -> Either a s)
-> (a -> s) -> Diagram s s (Either a s) (Either a s)
prismBox s -> Either a s
match a -> s
build = Diagram_ s s (Either a s) (Either a s)
-> Diagram s s (Either a s) (Either a s)
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram ((s -> Either a s)
-> (a -> s) -> Diagram_ s s (Either a s) (Either a s)
forall s a.
(s -> Either a s)
-> (a -> s) -> Diagram_ s s (Either a s) (Either a s)
PrismBox_ s -> Either a s
match a -> s
build)
beside ::
Diagram ap am bp bm ->
Diagram cp cm dp dm ->
Diagram (ap, cp) (am, cm) (bp, dp) (bm, dm)
beside :: forall ap am bp bm cp cm dp dm.
Diagram ap am bp bm
-> Diagram cp cm dp dm
-> Diagram (ap, cp) (am, cm) (bp, dp) (bm, dm)
beside (Diagram Diagram_ ap am bp bm
f) (Diagram Diagram_ cp cm dp dm
g) = Diagram_ (ap, cp) (am, cm) (bp, dp) (bm, dm)
-> Diagram (ap, cp) (am, cm) (bp, dp) (bm, dm)
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram (Diagram_ ap am bp bm
-> Diagram_ cp cm dp dm
-> Diagram_ (ap, cp) (am, cm) (bp, dp) (bm, dm)
forall a b da db db dc dp dm.
Diagram_ a b da db
-> Diagram_ db dc dp dm
-> Diagram_ (a, db) (b, dc) (da, dp) (db, dm)
Beside_ Diagram_ ap am bp bm
f Diagram_ cp cm dp dm
g)
thenD ::
Diagram ap am bp bm ->
Diagram bp bm cp cm ->
Diagram ap am cp cm
thenD :: forall ap am bp bm cp cm.
Diagram ap am bp bm -> Diagram bp bm cp cm -> Diagram ap am cp cm
thenD (Diagram Diagram_ ap am bp bm
f) (Diagram Diagram_ bp bm cp cm
g) = Diagram_ ap am cp cm -> Diagram ap am cp cm
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram (Diagram_ ap am bp bm
-> Diagram_ bp bm cp cm -> Diagram_ ap am cp cm
forall ap am a b cp cm.
Diagram_ ap am a b -> Diagram_ a b cp cm -> Diagram_ ap am cp cm
ThenD_ Diagram_ ap am bp bm
f Diagram_ bp bm cp cm
g)
traceD ::
Diagram (s, a) (s, da) (s, b) (s, db) ->
Diagram a da b db
traceD :: forall s a da b db.
Diagram (s, a) (s, da) (s, b) (s, db) -> Diagram a da b db
traceD (Diagram Diagram_ (s, a) (s, da) (s, b) (s, db)
f) = Diagram_ a da b db -> Diagram a da b db
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram (Diagram_ (s, a) (s, da) (s, b) (s, db) -> Diagram_ a da b db
forall a a da b db.
Diagram_ (a, a) (a, da) (a, b) (a, db) -> Diagram_ a da b db
Trace_ Diagram_ (s, a) (s, da) (s, b) (s, db)
f)
bend' :: Diagram () () (a, da) (da, a)
bend' :: forall a da. Diagram () () (a, da) (da, a)
bend' = Diagram_ () () (a, da) (da, a) -> Diagram () () (a, da) (da, a)
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ () () (a, da) (da, a)
forall a b. Diagram_ () () (a, b) (b, a)
Bend'_
bend :: Diagram (da, a) (a, da) () ()
bend :: forall da a. Diagram (da, a) (a, da) () ()
bend = Diagram_ (da, a) (a, da) () () -> Diagram (da, a) (a, da) () ()
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ (da, a) (a, da) () ()
forall a b. Diagram_ (a, b) (b, a) () ()
Bend_
turn :: Diagram a da b db -> Diagram db b da a
turn :: forall a da b db. Diagram a da b db -> Diagram db b da a
turn (Diagram Diagram_ a da b db
f) = Diagram_ db b da a -> Diagram db b da a
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram (Diagram_ a da b db -> Diagram_ db b da a
forall a da b db. Diagram_ a da b db -> Diagram_ db b da a
Turn_ Diagram_ a da b db
f)
unitL :: Diagram ((), a) ((), da) a da
unitL :: forall a da. Diagram ((), a) ((), da) a da
unitL = Diagram_ ((), a) ((), da) a da -> Diagram ((), a) ((), da) a da
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ ((), a) ((), da) a da
forall a da. Diagram_ ((), a) ((), da) a da
UnitL_
unitL' :: Diagram a da ((), a) ((), da)
unitL' :: forall a da. Diagram a da ((), a) ((), da)
unitL' = Diagram_ a da ((), a) ((), da) -> Diagram a da ((), a) ((), da)
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ a da ((), a) ((), da)
forall a da. Diagram_ a da ((), a) ((), da)
UnitL'_
unitR :: Diagram (a, ()) (da, ()) a da
unitR :: forall a da. Diagram (a, ()) (da, ()) a da
unitR = Diagram_ (a, ()) (da, ()) a da -> Diagram (a, ()) (da, ()) a da
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ (a, ()) (da, ()) a da
forall a da. Diagram_ (a, ()) (da, ()) a da
UnitR_
unitR' :: Diagram a da (a, ()) (da, ())
unitR' :: forall a da. Diagram a da (a, ()) (da, ())
unitR' = Diagram_ a da (a, ()) (da, ()) -> Diagram a da (a, ()) (da, ())
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ a da (a, ()) (da, ())
forall a da. Diagram_ a da (a, ()) (da, ())
UnitR'_
assoc ::
Diagram (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
assoc :: forall a b c da db dc.
Diagram (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
assoc = Diagram_ (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
-> Diagram (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ (a, (b, c)) (da, (db, dc)) ((a, b), c) ((da, db), dc)
forall a b da db db dc.
Diagram_ (a, (b, da)) (db, (db, dc)) ((a, b), da) ((db, db), dc)
Assoc_
assoc' ::
Diagram ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
assoc' :: forall a b c da db dc.
Diagram ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
assoc' = Diagram_ ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
-> Diagram ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ ((a, b), c) ((da, db), dc) (a, (b, c)) (da, (db, dc))
forall a b da db db dc.
Diagram_ ((a, b), da) ((db, db), dc) (a, (b, da)) (db, (db, dc))
Assoc'_
swap ::
Diagram (a, b) (da, db) (b, a) (db, da)
swap :: forall a b da db. Diagram (a, b) (da, db) (b, a) (db, da)
swap = Diagram_ (a, b) (da, db) (b, a) (db, da)
-> Diagram (a, b) (da, db) (b, a) (db, da)
forall a da b db. Diagram_ a da b db -> Diagram a da b db
Diagram Diagram_ (a, b) (da, db) (b, a) (db, da)
forall a b da db. Diagram_ (a, b) (da, db) (b, a) (db, da)
Swap_
runDiagram :: Diagram a da b db -> (a, db) -> (da, b)
runDiagram :: forall a da b db. Diagram a da b db -> (a, db) -> (da, b)
runDiagram Diagram a da b db
d = Syntax (SigCompose :+: SigYank (,)) (->) (a, db) (da, b)
-> (a, db) -> (da, b)
forall (arr :: * -> * -> *) (sig :: Sig) a b.
(Category arr, Algebra sig arr arr, Ctx sig arr arr) =>
Syntax sig arr a b -> arr a b
eval (IntMorph (,) (Trace (,) (->)) a da b db
-> Syntax (SigCompose :+: SigYank (,)) (->) (a, db) (da, b)
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
IntMorph t arr ap am bp bm -> arr (t ap bm) (t am bp)
runIntMorph (Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
forall a da b db.
Diagram a da b db -> IntMorph (,) (Trace (,) (->)) a da b db
toIntMorph Diagram a da b db
d))
turnInt ::
IntMorph (,) (Trace (,) (->)) a da b db ->
IntMorph (,) (Trace (,) (->)) db b da a
turnInt :: forall a da b db.
IntMorph (,) (Trace (,) (->)) a da b db
-> IntMorph (,) (Trace (,) (->)) db b da a
turnInt (IntMorph Trace (,) (->) (a, db) (da, b)
f) = Trace (,) (->) (db, a) (b, da)
-> IntMorph (,) (Trace (,) (->)) db b da a
forall (t :: * -> * -> *) (arr :: * -> * -> *) ap am bp bm.
arr (t ap bm) (t am bp) -> IntMorph t arr ap am bp bm
IntMorph (((da, b) -> (b, da)) -> Trace (,) (->) (da, b) (b, da)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (da, b) -> (b, da)
forall a b. (a, b) -> (b, a)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k).
Action t arr =>
arr (t a b) (t b a)
M.braid Trace (,) (->) (da, b) (b, da)
-> Trace (,) (->) (a, db) (da, b) -> Trace (,) (->) (a, db) (b, da)
forall b c a.
Trace (,) (->) b c -> Trace (,) (->) a b -> Trace (,) (->) a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
Cat.. Trace (,) (->) (a, db) (da, b)
f Trace (,) (->) (a, db) (b, da)
-> Trace (,) (->) (db, a) (a, db) -> Trace (,) (->) (db, a) (b, da)
forall b c a.
Trace (,) (->) b c -> Trace (,) (->) a b -> Trace (,) (->) a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
Cat.. ((db, a) -> (a, db)) -> Trace (,) (->) (db, a) (a, db)
forall (arr :: * -> * -> *) a b (t :: * -> * -> *).
arr a b -> Trace t arr a b
base (db, a) -> (a, db)
forall a b. (a, b) -> (b, a)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k).
Action t arr =>
arr (t a b) (t b a)
M.braid)