0 | module Data.Profunctor.Yoneda
2 | import Data.Profunctor
3 | import Data.Profunctor.Costrong
4 | import Data.Profunctor.Traversing
5 | import Data.Profunctor.Mapping
6 | import Data.Profunctor.Sieve
18 | record Yoneda p a b where
19 | constructor MkYoneda
20 | runYoneda : forall x, y. (x -> a) -> (b -> y) -> p x y
23 | Profunctor (Yoneda p) where
24 | lmap f (MkYoneda p) = MkYoneda $
\l,r => p (f . l) r
25 | rmap f (MkYoneda p) = MkYoneda $
\l,r => p l (r . f)
26 | dimap f g (MkYoneda p) = MkYoneda $
\l,r => p (f . l) (r . g)
29 | ProfunctorFunctor Yoneda where
30 | promap f (MkYoneda p) = MkYoneda $
f .: p
33 | ProfunctorMonad Yoneda where
34 | propure p = MkYoneda $
\l,r => dimap l r p
35 | projoin (MkYoneda p) = p id id
38 | ProfunctorComonad Yoneda where
39 | proextract (MkYoneda p) = p id id
40 | produplicate p = MkYoneda $
\l,r => dimap l r p
44 | yonedaEqv : Profunctor p => p a b <=> Yoneda p a b
45 | yonedaEqv = MkEquivalence propure proextract
48 | yonedaIso : (Profunctor q, Profunctor r) => forall p. Profunctor p =>
49 | p (q a b) (r a' b') -> p (Yoneda q a b) (Yoneda r a' b')
50 | yonedaIso = dimap proextract propure
53 | Functor (Yoneda p a) where
57 | GenStrong ten p => GenStrong ten (Yoneda p) where
58 | strongl = propure . strongl {ten,p} . proextract
59 | strongr = propure . strongr {ten,p} . proextract
62 | GenCostrong ten p => GenCostrong ten (Yoneda p) where
63 | costrongl = propure . costrongl {ten,p} . proextract
64 | costrongr = propure . costrongr {ten,p} . proextract
67 | Closed p => Closed (Yoneda p) where
68 | closed = propure . closed . proextract
71 | Traversing p => Traversing (Yoneda p) where
72 | traverse' = propure . traverse' . proextract
73 | wander f = propure . wander f . proextract
76 | Mapping p => Mapping (Yoneda p) where
77 | map' = propure . map' . proextract
78 | roam f = propure . roam f . proextract
81 | Sieve p f => Sieve (Yoneda p) f where
82 | sieve = sieve . proextract
85 | Cosieve p f => Cosieve (Yoneda p) f where
86 | cosieve = cosieve . proextract
96 | data Coyoneda : (p : Type -> Type -> Type) -> Type -> Type -> Type where
97 | MkCoyoneda : (a -> x) -> (y -> b) -> p x y -> Coyoneda p a b
101 | Profunctor (Coyoneda p) where
102 | lmap f (MkCoyoneda l r p) = MkCoyoneda (l . f) r p
103 | rmap f (MkCoyoneda l r p) = MkCoyoneda l (f . r) p
104 | dimap f g (MkCoyoneda l r p) = MkCoyoneda (l . f) (g . r) p
107 | ProfunctorFunctor Coyoneda where
108 | promap f (MkCoyoneda l r p) = MkCoyoneda l r (f p)
111 | ProfunctorMonad Coyoneda where
112 | propure = MkCoyoneda id id
113 | projoin (MkCoyoneda l r p) = dimap l r p
116 | ProfunctorComonad Coyoneda where
117 | proextract (MkCoyoneda l r p) = dimap l r p
118 | produplicate = MkCoyoneda id id
122 | coyonedaEqv : Profunctor p => p a b <=> Coyoneda p a b
123 | coyonedaEqv = MkEquivalence propure proextract
126 | coyonedaIso : (Profunctor q, Profunctor r) => forall p. Profunctor p =>
127 | p (q a b) (r a' b') -> p (Coyoneda q a b) (Coyoneda r a' b')
128 | coyonedaIso = dimap proextract propure
131 | Functor (Coyoneda p a) where
135 | GenStrong ten p => GenStrong ten (Coyoneda p) where
136 | strongl = propure . strongl {ten,p} . proextract
137 | strongr = propure . strongr {ten,p} . proextract
140 | GenCostrong ten p => GenCostrong ten (Coyoneda p) where
141 | costrongl = propure . costrongl {ten,p} . proextract
142 | costrongr = propure . costrongr {ten,p} . proextract
145 | Closed p => Closed (Coyoneda p) where
146 | closed = propure . closed . proextract
149 | Traversing p => Traversing (Coyoneda p) where
150 | traverse' = propure . traverse' . proextract
151 | wander f = propure . wander f . proextract
154 | Mapping p => Mapping (Coyoneda p) where
155 | map' = propure . map' . proextract
156 | roam f = propure . roam f . proextract
159 | Sieve p f => Sieve (Coyoneda p) f where
160 | sieve = sieve . proextract
163 | Cosieve p f => Cosieve (Coyoneda p) f where
164 | cosieve = cosieve . proextract