module Pandora.Pattern.Functor.Divariant where
import Pandora.Pattern.Functor.Covariant (Covariant, Covariant_)
import Pandora.Pattern.Functor.Contravariant (Contravariant_)
import Pandora.Paradigm.Primary.Transformer.Flip (Flip)
infixl 4 >->
class (forall i . Covariant (v i)) => Divariant (v :: * -> * -> *) where
{-# MINIMAL (>->) #-}
(>->) :: (a -> b) -> (c -> d) -> v b c -> v a d
dimap :: (a -> b) -> (c -> d) -> v b c -> v a d
dimap a -> b
f c -> d
g v b c
x = (a -> b
f (a -> b) -> (c -> d) -> v b c -> v a d
forall (v :: * -> * -> *) a b c d.
Divariant v =>
(a -> b) -> (c -> d) -> v b c -> v a d
>-> c -> d
g) v b c
x
class (forall i . Contravariant_ (Flip v i) left target, forall i . Covariant_ (v i) right target)
=> Divariant_ v left right target where
(->->-) :: left a b -> right c d -> target (v b c) (v a d)