module Pandora.Paradigm.Primary.Functor.Equivalence where import Pandora.Pattern.Category (($)) import Pandora.Pattern.Functor.Contravariant (Contravariant ((>$<))) import Pandora.Paradigm.Primary.Object.Boolean (Boolean) data Equivalence a = Equivalence (a -> a -> Boolean) instance Contravariant Equivalence where a -> b f >$< :: (a -> b) -> Equivalence b -> Equivalence a >$< Equivalence b -> b -> Boolean g = (a -> a -> Boolean) -> Equivalence a forall a. (a -> a -> Boolean) -> Equivalence a Equivalence ((a -> a -> Boolean) -> Equivalence a) -> (a -> a -> Boolean) -> Equivalence a forall (m :: * -> * -> *) a b. Category m => m a b -> m a b $ \a x a y -> b -> b -> Boolean g (a -> b f a x) (a -> b f a y)