module Darcs.Patch.Witnesses.Eq
( EqCheck(..)
, Eq2(..)
, isIsEq
) where
import Prelude ()
import Darcs.Prelude
import Darcs.Patch.Witnesses.Unsafe ( unsafeCoerceP )
data EqCheck wA wB where
IsEq :: EqCheck wA wA
NotEq :: EqCheck wA wB
instance Eq (EqCheck wA wB) where
IsEq == :: EqCheck wA wB -> EqCheck wA wB -> Bool
== IsEq = Bool
True
NotEq == NotEq = Bool
True
_ == _ = Bool
False
instance Show (EqCheck wA wB) where
show :: EqCheck wA wB -> String
show IsEq = "IsEq"
show NotEq = "NotEq"
class Eq2 p where
unsafeCompare :: p wA wB -> p wC wD -> Bool
unsafeCompare a :: p wA wB
a b :: p wC wD
b = EqCheck wA wA
forall wA. EqCheck wA wA
IsEq EqCheck wA wA -> EqCheck wA wA -> Bool
forall a. Eq a => a -> a -> Bool
== (p wA wB
a p wA wB -> p wA wB -> EqCheck wA wA
forall (p :: * -> * -> *) wA wC wB.
Eq2 p =>
p wA wC -> p wB wC -> EqCheck wA wB
=/\= p wC wD -> p wA wB
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP p wC wD
b)
(=\/=) :: p wA wB -> p wA wC -> EqCheck wB wC
a :: p wA wB
a =\/= b :: p wA wC
b | p wA wB -> p wA wC -> Bool
forall (p :: * -> * -> *) wA wB wC wD.
Eq2 p =>
p wA wB -> p wC wD -> Bool
unsafeCompare p wA wB
a p wA wC
b = EqCheck Any Any -> EqCheck wB wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP EqCheck Any Any
forall wA. EqCheck wA wA
IsEq
| Bool
otherwise = EqCheck wB wC
forall wA wB. EqCheck wA wB
NotEq
(=/\=) :: p wA wC -> p wB wC -> EqCheck wA wB
a :: p wA wC
a =/\= b :: p wB wC
b | EqCheck wC wC
forall wA. EqCheck wA wA
IsEq EqCheck wC wC -> EqCheck wC wC -> Bool
forall a. Eq a => a -> a -> Bool
== (p wA wC
a p wA wC -> p wA wC -> EqCheck wC wC
forall (p :: * -> * -> *) wA wB wC.
Eq2 p =>
p wA wB -> p wA wC -> EqCheck wB wC
=\/= p wB wC -> p wA wC
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP p wB wC
b) = EqCheck Any Any -> EqCheck wA wB
forall (a :: * -> * -> *) wX wY wB wC. a wX wY -> a wB wC
unsafeCoerceP EqCheck Any Any
forall wA. EqCheck wA wA
IsEq
| Bool
otherwise = EqCheck wA wB
forall wA wB. EqCheck wA wB
NotEq
infix 4 =\/=, =/\=
isIsEq :: EqCheck wA wB -> Bool
isIsEq :: EqCheck wA wB -> Bool
isIsEq IsEq = Bool
True
isIsEq NotEq = Bool
False