pandora-0.4.4: Pandora/Pattern/Functor/Bivariant.hs
module Pandora.Pattern.Functor.Bivariant where
import Pandora.Pattern.Functor.Covariant (Covariant_)
import Pandora.Paradigm.Primary.Transformer.Flip (Flip)
infixl 4 <->
{- |
> When providing a new instance, you should ensure it satisfies:
> * Identity: identity <-> identity ≡ identity
> * Parametricity: (f . g) <-> (h . i) ≡ f <-> h . g <-> i
-}
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)