2 | module Data.Profunctor.Types
4 | import Data.Contravariant
5 | import Data.Morphisms
28 | interface Profunctor p where
32 | dimap : (a -> b) -> (c -> d) -> p b c -> p a d
33 | dimap f g = lmap f . rmap g
36 | lmap : (a -> b) -> p b c -> p a c
40 | rmap : (b -> c) -> p a b -> p a c
52 | 0 (:->) : (p, q : k -> k' -> Type) -> Type
53 | p :-> q = forall a, b. p a b -> q a b
62 | Profunctor Morphism where
63 | dimap f g (Mor h) = Mor (g . h . f)
64 | lmap f (Mor g) = Mor (g . f)
67 | namespace Profunctor
71 | [Function] Profunctor (\a,b => a -> b) where
72 | dimap f g h = g . h . f
77 | Functor f => Profunctor (Kleislimorphism f) where
78 | dimap f g (Kleisli h) = Kleisli (map g . h . f)
79 | lmap f (Kleisli g) = Kleisli (g . f)
93 | record Star {0 k : Type} (f : k -> Type) a (b : k) where
95 | applyStar : a -> f b
98 | Functor f => Functor (Star f a) where
99 | map f (MkStar g) = MkStar (map f . g)
102 | Applicative f => Applicative (Star f a) where
103 | pure = MkStar . const . pure
104 | MkStar f <*> MkStar g = MkStar (\x => f x <*> g x)
107 | Monad f => Monad (Star f a) where
108 | MkStar f >>= g = MkStar $
\x => do
113 | Contravariant f => Contravariant (Star f a) where
114 | contramap f (MkStar g) = MkStar (contramap f . g)
118 | Functor f => Profunctor (Star f) where
119 | dimap f g (MkStar h) = MkStar (map g . h . f)
120 | lmap f (MkStar g) = MkStar (g . f)
121 | rmap f (MkStar g) = MkStar (map f . g)
126 | record Costar {0 k : Type} (f : k -> Type) (a : k) b where
127 | constructor MkCostar
128 | applyCostar : f a -> b
131 | Functor (Costar f a) where
132 | map f (MkCostar g) = MkCostar (f . g)
135 | Applicative (Costar f a) where
136 | pure = MkCostar . const
137 | MkCostar f <*> MkCostar g = MkCostar (\x => f x (g x))
140 | Monad (Costar f a) where
141 | MkCostar f >>= g = MkCostar (\x => applyCostar (g (f x)) x)
144 | Functor f => Profunctor (Costar f) where
145 | dimap f g (MkCostar h) = MkCostar (g . h . map f)
146 | lmap f (MkCostar g) = MkCostar (g . map f)
147 | rmap f (MkCostar g) = MkCostar (f . g)
153 | record Tagged {0 k : Type} (a : k) b where
159 | retag : Tagged a c -> Tagged b c
160 | retag (Tag x) = Tag x
163 | Functor (Tagged a) where
164 | map f (Tag x) = Tag (f x)
167 | Applicative (Tagged a) where
169 | Tag f <*> Tag x = Tag (f x)
172 | Monad (Tagged a) where
177 | Foldable (Tagged a) where
178 | foldr f x (Tag y) = f y x
179 | foldl f x (Tag y) = f x y
181 | foldlM f x (Tag y) = f x y
182 | toList (Tag x) = [x]
183 | foldMap f (Tag x) = f x
186 | Traversable (Tagged a) where
187 | traverse f (Tag x) = map Tag (f x)
190 | Profunctor Tagged where
191 | dimap _ f (Tag x) = Tag (f x)
193 | rmap f (Tag x) = Tag (f x)
198 | record Forget {0 k : Type} r a (b : k) where
199 | constructor MkForget
203 | reforget : Forget r a b -> Forget r a c
204 | reforget (MkForget k) = MkForget k
207 | Functor (Forget r a) where
211 | Contravariant (Forget {k=Type} r a) where
212 | contramap _ = reforget
215 | Monoid r => Applicative (Forget r a) where
216 | pure _ = MkForget (const neutral)
217 | MkForget f <*> MkForget g = MkForget (f <+> g)
220 | Monoid r => Monad (Forget {k=Type} r a) where
222 | (>>=) = reforget .: const
225 | Foldable (Forget r a) where
229 | foldlM _ x _ = pure x
231 | foldMap _ _ = neutral
234 | Traversable (Forget r a) where
235 | traverse _ = pure . reforget
238 | Profunctor (Forget r) where
239 | dimap f _ (MkForget k) = MkForget (k . f)
240 | lmap f (MkForget k) = MkForget (k . f)
246 | record Coforget {0 k : Type} r (a : k) b where
247 | constructor MkCoforget
248 | runCoforget : r -> b
251 | recoforget : Coforget r a c -> Coforget r b c
252 | recoforget (MkCoforget k) = MkCoforget k
255 | Functor (Coforget r a) where
256 | map f (MkCoforget k) = MkCoforget (f . k)
259 | Bifunctor (Coforget r) where
260 | bimap _ f (MkCoforget k) = MkCoforget (f . k)
261 | mapFst _ = recoforget
265 | Applicative (Coforget r a) where
266 | pure = MkCoforget . const
267 | MkCoforget f <*> MkCoforget g = MkCoforget (\r => f r (g r))
270 | Monad (Coforget r a) where
271 | MkCoforget k >>= f = MkCoforget (\r => runCoforget (f $
k r) r)
274 | Profunctor (Coforget r) where
275 | dimap _ f (MkCoforget k) = MkCoforget (f . k)
276 | lmap _ = recoforget
287 | [FunctorId] Functor Prelude.id where
291 | [ApplicativeId] Applicative Prelude.id using FunctorId where
296 | [MonadId] Monad Prelude.id using ApplicativeId where
301 | [FoldableId] Foldable Prelude.id where
310 | [TraversableId] Traversable Prelude.id using FunctorId FoldableId where