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