0 | module Data.Bicontravariant
2 | import Data.Morphisms
3 | import Data.Contravariant
4 | import Data.Profunctor
10 | interface Bicontravariant f where
11 | contrabimap : (a -> b) -> (c -> d) -> f b d -> f a c
12 | contrabimap f g = contramapFst f . contramapSnd g
14 | contramapFst : (a -> b) -> f b c -> f a c
15 | contramapFst f = contrabimap f id
17 | contramapSnd : (b -> c) -> f a c -> f a b
18 | contramapSnd = contrabimap id
22 | Contravariant f => Bicontravariant (Star f) where
23 | contrabimap f g = MkStar . dimap @{Function} f (contramap g) . applyStar
26 | Contravariant f => Bicontravariant (Kleislimorphism f) where
27 | contrabimap f g = Kleisli . dimap @{Function} f (contramap g) . applyKleisli
30 | Bicontravariant (Forget {k=Type} r) where
31 | contrabimap f _ = MkForget . lmap @{Function} f . runForget
35 | rphantom : (Profunctor p, Bicontravariant p) => p a b -> p a c
36 | rphantom = contramapSnd (const ()) . rmap (const ())
39 | biphantom : (Bifunctor p, Bicontravariant p) => p a b -> p c d
40 | biphantom = contrabimap (const ()) (const ()) . bimap (const ()) (const ())