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 left target (v i), forall i . Covariant right target (Flip v i)) => Bivariant left right target v where (<->) :: left a b -> right c d -> target (v a c) (v b d)