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)