module Pandora.Pattern.Object.Setoid (Setoid (..)) where

import Pandora.Paradigm.Primary.Object.Boolean (Boolean (False, True))

infix 8 ==, !=, ?=

{- |
> When providing a new instance, you should ensure it satisfies:
> * Reflexivity: x == x ≡ True
> * Symmetry: x == y ≡ y == x
> * Transitivity: x == y * y == z ≡ True ===> x == z ≡ True
> * Negation: x != y ≡ invert (x == y)
-}

class Setoid a where
	{-# MINIMAL (==) #-}
	(==) :: a -> a -> Boolean

	(!=) :: a -> a -> Boolean
	(!=) a
x a
y = case a
x a -> a -> Boolean
forall a. Setoid a => a -> a -> Boolean
== a
y of
		Boolean
True -> Boolean
False
		Boolean
False -> Boolean
True

	(?=) :: a -> a -> r -> r -> r
	(?=) a
x a
y r
xc r
yc = case a
x a -> a -> Boolean
forall a. Setoid a => a -> a -> Boolean
== a
y of
		Boolean
True -> r
xc
		Boolean
False -> r
yc