0 | module Data.Contravariant
4 | export infixl 4 >$
, >$<
, >&<
, $<
8 | interface Contravariant (0 f : Type -> Type) where
9 | contramap : (a -> b) -> f b -> f a
11 | (>$) : b -> f b -> f a
12 | v >$ fb = contramap (const v) fb
17 | public export %inline
18 | phantom : Contravariant f => Functor f => f a -> f b
19 | phantom fa = () >$ (fa $> ())
22 | public export %inline
23 | (>$<) : Contravariant f => (a -> b) -> f b -> f a
27 | public export %inline
28 | (>&<) : Contravariant f => f b -> (a -> b) -> f a
29 | (>&<) = flip contramap
32 | public export %inline
33 | ($<) : Contravariant f => f b -> b -> f a
38 | [Compose] (Contravariant f, Contravariant g) => Functor (f . g) where
39 | map = contramap . contramap
43 | [ComposeFC] (Functor f, Contravariant g) => Contravariant (f . g) where
44 | contramap = map . contramap
48 | [ComposeCF] (Contravariant f, Functor g) => Contravariant (f . g) where
49 | contramap = contramap . map