0 | module Control.Category.Records.Traced
2 | import Control.Category
3 | import Control.Category.Records.Category
4 | import Control.Category.Records.Functor
5 | import Control.Category.Records.Monoidal
6 | import Data.Morphisms
9 | %prefix_record_projections off
18 | record TracedR where
19 | constructor MkTracedR
21 | tensor : obj -> obj -> obj
23 | {auto impl : Traced hom tensor unit}
28 | PreTracedR = TracedR
32 | public export %inline
33 | (.categoryR) : (rec : TracedR) -> CategoryR
34 | (.categoryR) (MkTracedR {} {hom}) = MkCategoryR hom
37 | public export %inline
38 | (.id) : (rec : TracedR) -> {a : _} -> rec.hom a a
39 | (.id) rec@(MkTracedR {}) = rec.categoryR.id
42 | public export %inline
43 | (.comp) : (rec : TracedR) -> {a,b,c : _} ->
44 | rec.hom b c -> rec.hom a b -> rec.hom a c
45 | (.comp) rec@(MkTracedR {}) = rec.categoryR.comp
49 | public export %inline
50 | (.tensorR) : (rec : TracedR) -> EndoBifunctorR rec.categoryR
51 | (.tensorR) (MkTracedR {} {tensor}) = MkBifunctorR tensor
55 | public export %inline
56 | (.monoidalR) : (rec : TracedR) -> MonoidalR
57 | (.monoidalR) (MkTracedR {} {hom,tensor,unit}) = MkMonoidalR hom tensor unit
60 | public export %inline
61 | (.assoc) : (rec : TracedR) -> {a,b,c : _} ->
62 | rec.hom (rec.tensor (rec.tensor a b) c) (rec.tensor a (rec.tensor b c))
63 | (.assoc) rec@(MkTracedR {}) = rec.monoidalR.assoc
66 | public export %inline
67 | (.assoc') : (rec : TracedR) -> {a,b,c : _} ->
68 | rec.hom (rec.tensor a (rec.tensor b c)) (rec.tensor (rec.tensor a b) c)
69 | (.assoc') rec@(MkTracedR {}) = rec.monoidalR.assoc'
72 | public export %inline
73 | (.unitl) : (rec : TracedR) -> {a : _} ->
74 | rec.hom (rec.tensor rec.unit a) a
75 | (.unitl) rec@(MkTracedR {}) = rec.monoidalR.unitl
78 | public export %inline
79 | (.unitl') : (rec : TracedR) -> {a : _} ->
80 | rec.hom a (rec.tensor rec.unit a)
81 | (.unitl') rec@(MkTracedR {}) = rec.monoidalR.unitl'
84 | public export %inline
85 | (.unitr) : (rec : TracedR) -> {a : _} ->
86 | rec.hom (rec.tensor a rec.unit) a
87 | (.unitr) rec@(MkTracedR {}) = rec.monoidalR.unitr
90 | public export %inline
91 | (.unitr') : (rec : TracedR) -> {a : _} ->
92 | rec.hom a (rec.tensor a rec.unit)
93 | (.unitr') rec@(MkTracedR {}) = rec.monoidalR.unitr'
97 | public export %inline
98 | (.tracedR) : (rec : TracedR) -> TracedR
102 | public export %inline
103 | (.tracel) : (rec : TracedR) -> {a,b,c : _} ->
104 | rec.hom (rec.tensor a b) (rec.tensor a c) -> rec.hom b c
105 | (.tracel) rec = tracel @{rec.impl}
108 | public export %inline
109 | (.tracer) : (rec : TracedR) -> {a,b,c : _} ->
110 | rec.hom (rec.tensor a c) (rec.tensor b c) -> rec.hom a b
111 | (.tracer) rec = tracer @{rec.impl}
120 | public export %inline
121 | (.trace) : (rec : TracedR) -> {a : _} ->
122 | rec.hom a a -> rec.hom rec.unit rec.unit
123 | (.trace) rec = trace @{rec.impl}