3 | module Control.Category.Instances.Type
5 | import Control.Category
6 | import Control.Category.Records
10 | import Data.List.Quantifiers
16 | data Typ : (a,b : Type0) -> Type where
17 | MkTyp : (a.runW0 -> b.runW0) -> Typ a b
19 | public export %inline %tcinline
20 | runTyp : Typ a b -> a.runW0 -> b.runW0
21 | runTyp (MkTyp f) = f
23 | public export %inline %tcinline
24 | (.runTyp) : Typ a b -> a.runW0 -> b.runW0
27 | public export %inline
28 | Typ_ : (0 a,b : Type) -> Type
29 | Typ_ a b = Typ (W0 a) (W0 b)
33 | Pair : Type0 -> Type0 -> Type0
37 | Either : Type0 -> Type0 -> Type0
38 | Either = liftW2 Either
41 | TypHom : Type0 -> Type0 -> Type0
42 | TypHom a b = W0 (Typ a b)
52 | MkTyp f . MkTyp g = MkTyp (f . g)
55 | SemigroupoidTyp : Semigroupoid Typ
56 | SemigroupoidTyp = FromCategory
62 | namespace CatFunctor
64 | [FromFunctor] Functor f => CatFunctor Typ Typ (liftW f) where
65 | map {a=W0 _,b=W0 _} (MkTyp f) = MkTyp (map f)
69 | FromMonad : Monad m => CatMonad Typ (liftW m)
70 | FromMonad = MkCatMonad @{FromFunctor} (MkTyp Prelude.join) (MkTyp pure)
72 | namespace CatBifunctor
74 | [FromBifunctor] Bifunctor f => CatBifunctor Typ Typ Typ (liftW2 f) where
75 | bimap {a=W0 _,a'=W0 _,b=W0 _,b'=W0 _} (MkTyp f) (MkTyp g) = MkTyp (bimap f g)
78 | CatBifunctor Typ Typ Typ Pair where
79 | bimap {a=W0 _,a'=W0 _,b=W0 _,b'=W0 _} (MkTyp f) (MkTyp g) = MkTyp (bimap f g)
82 | CatBifunctor Typ Typ Typ Either where
83 | bimap {a=W0 _,a'=W0 _,b=W0 _,b'=W0 _} (MkTyp f) (MkTyp g) = MkTyp (bimap f g)
87 | FromTensor : {ten,i : _} -> Tensor ten i => Monoidal Typ (liftW2 ten) (W0 i)
88 | FromTensor = MkMonoidal @{%search} @{FromBifunctor}
91 | (MkTyp unitl.leftToRight)
92 | (MkTyp unitl.rightToLeft)
93 | (MkTyp unitr.leftToRight)
94 | (MkTyp unitr.rightToLeft)
97 | Monoidal Typ Pair (W0 ()) where
98 | assoc = MkTyp (\((x,y),z) => (x,(y,z)))
99 | assoc' = MkTyp (\(x,(y,z)) => ((x,y),z))
101 | unitl' = MkTyp ((),)
103 | unitr' = MkTyp (,())
106 | Monoidal Typ Either (W0 Void) where
107 | assoc = MkTyp $
either (either Left (Right . Left)) (Right . Right)
108 | assoc' = MkTyp $
either (Left . Left) (either (Left . Right) Right)
109 | unitl = MkTyp $
either absurd id
110 | unitl' = MkTyp Right
111 | unitr = MkTyp $
either id absurd
112 | unitr' = MkTyp Left
114 | namespace StrongFunctor
116 | FromFunctor : Functor f => StrongFunctor Typ Pair (liftW f)
117 | FromFunctor = MkStrongFunctor @{FromFunctor}
118 | (MkTyp $
\(x,y) => map (x,) y)
119 | (MkTyp $
\(x,y) => map (,y) x)
122 | FromApplicative : Applicative f => Bitraversable ten => StrongFunctor Typ (liftW2 ten) (liftW f)
123 | FromApplicative = MkStrongFunctor @{FromFunctor}
124 | (MkTyp $
bitraverse pure id)
125 | (MkTyp $
bitraverse id pure)
127 | namespace StrongMonad
129 | FromMonad : Monad m => Bitraversable ten => StrongMonad Typ (liftW2 ten) (liftW m)
130 | FromMonad = (FromMonad, FromApplicative)
134 | FromTensor : {ten,i : _} -> (Tensor ten i, Symmetric ten) => Braided Typ (liftW2 ten) (W0 i)
135 | FromTensor = MkBraided @{FromTensor} (MkTyp swap') (MkTyp swap')
138 | Braided Typ Pair (W0 ()) where
142 | Braided Typ Either (W0 Void) where
143 | braid = MkTyp mirror
145 | namespace MonSymmetric
147 | FromTensor : {ten,i : _} -> (Tensor ten i, Symmetric ten) => MonSymmetric Typ (liftW2 ten) (W0 i)
148 | FromTensor = MkMonSymmetric @{FromTensor} (permuteDefault @{FromTensor})
151 | MonSymmetric Typ Pair (W0 ()) where
152 | permute {xs=[]} [] = id
153 | permute {xs=[_]} [_] = id
154 | permute p = MkTyp $
\xs => fromHList $
permuteHList p $
toHList xs
156 | toHList : {ts : _} -> (TenSeq Pair (W0 ()) ts).runW0 -> All Wrap0.runW0 ts
157 | toHList {ts=[]} () = []
158 | toHList {ts=[_]} x = [x]
159 | toHList {ts=_::_::_} (x,y) = x :: toHList y
161 | fromHList : All Wrap0.runW0 ts -> (TenSeq Pair (W0 ()) ts).runW0
164 | fromHList (x :: xs@(_ :: _)) = (x, fromHList xs)
167 | Cartesian Typ Pair (W0 ()) where
170 | prod (MkTyp f) (MkTyp g) = MkTyp $
\x => (f x, g x)
172 | elim = MkTyp $
const ()
175 | Cocartesian Typ Either (W0 Void) where
178 | coprod (MkTyp f) (MkTyp g) = MkTyp $
either f g
179 | merge = MkTyp fromEither
180 | intro = MkTyp absurd
182 | public export %hint
183 | SymmetricTypEither : MonSymmetric Typ Either (W0 Void)
184 | SymmetricTypEither = FromCocartesian
187 | Closed Typ Pair TypHom (W0 ()) where
188 | curry (MkTyp f) = MkTyp $
\x => MkTyp (curry f x)
189 | uncurry (MkTyp f) = MkTyp $
uncurry $
\x => (f x).runTyp
192 | Bimonoidal Typ Either Pair (W0 Void) (W0 ()) where
193 | distribl = MkTyp $
\(x,y) => bimap (x,) (x,) y
194 | distribl' = MkTyp $
either (mapSnd Left) (mapSnd Right)
195 | distribr = MkTyp $
\(x,y) => bimap (,y) (,y) x
196 | distribr' = MkTyp $
either (mapFst Left) (mapFst Right)
197 | absorbl = MkTyp snd
198 | absorbl' = MkTyp absurd
199 | absorbr = MkTyp fst
200 | absorbr' = MkTyp absurd
207 | namespace SemigroupoidR
209 | Typ : SemigroupoidR
210 | Typ = MkSemigroupoidR Typ
212 | namespace CategoryR
215 | Typ = MkCategoryR Typ
217 | namespace CatBifunctor
219 | Pair : BifunctorR Typ Typ Typ
220 | Pair = MkBifunctorR Pair
223 | Either : BifunctorR Typ Typ Typ
224 | Either = MkBifunctorR Either
226 | namespace MonoidalR
228 | TypPair : MonoidalR
229 | TypPair = MkMonoidalR Typ Pair (W0 ())
232 | TypEither : MonoidalR
233 | TypEither = MkMonoidalR Typ Either (W0 Void)
238 | TypPair = MkBraidedR Typ Pair (W0 ())
241 | TypEither : BraidedR
242 | TypEither = MkBraidedR Typ Either (W0 Void)
244 | namespace SymmetricR
246 | TypPair : SymmetricR
247 | TypPair = MkSymmetricR Typ Pair (W0 ())
250 | TypEither : SymmetricR
251 | TypEither = MkSymmetricR Typ Either (W0 Void)
253 | namespace CartesianR
256 | Typ = MkCartesianR Typ Pair (W0 ())
258 | namespace CocartesianR
261 | Typ = MkCocartesianR Typ Either (W0 Void)
266 | Typ = MkClosedR Typ Pair TypHom (W0 ())
268 | namespace BimonoidalR
271 | Typ = MkBimonoidalR Typ Either Pair (W0 Void) (W0 ())
273 | namespace RigCategoryR
276 | Typ = MkRigCategoryR Typ Either Pair (W0 Void) (W0 ())
278 | namespace SymRigCategoryR
280 | Typ : SymRigCategoryR
281 | Typ = MkSymRigCategoryR Typ Either Pair (W0 Void) (W0 ())
283 | namespace DistributiveR
285 | Typ : DistributiveR
286 | Typ = MkDistributiveR Typ Either Pair (W0 Void) (W0 ())