module Type.Data.Ord
( Compare
, compare
, LT
, EQ
, GT
, IsLT
, isLT
, IsEQ
, isEQ
, IsGT
, isGT
, (:<:)
, lt
, LTT
, (:<=:)
, le
, LET
, (:==:)
, eq
, EQT
, (:/=:)
, ne
, NET
, (:>=:)
, ge
, GET
, (:>:)
, gt
, GTT
, Min
, min
, Max
, max
) where
import Type.Data.Bool (If, Not, True, False)
import Type.Base.Proxy (Proxy(Proxy))
import Prelude ()
type family Compare x y
data LT
data EQ
data GT
compare :: Proxy x -> Proxy y -> Proxy (Compare x y)
compare Proxy Proxy = Proxy
type family IsLT c
type instance IsLT LT = True
type instance IsLT EQ = False
type instance IsLT GT = False
isLT :: Proxy c -> Proxy (IsLT c)
isLT Proxy = Proxy
type family IsEQ c
type instance IsEQ LT = False
type instance IsEQ EQ = True
type instance IsEQ GT = False
isEQ :: Proxy c -> Proxy (IsEQ c)
isEQ Proxy = Proxy
type family IsGT c
type instance IsGT LT = False
type instance IsGT EQ = False
type instance IsGT GT = True
isGT :: Proxy c -> Proxy (IsGT c)
isGT Proxy = Proxy
type instance Compare LT LT = EQ
type instance Compare LT EQ = LT
type instance Compare LT GT = LT
type instance Compare EQ LT = GT
type instance Compare EQ EQ = EQ
type instance Compare EQ GT = LT
type instance Compare GT LT = GT
type instance Compare GT EQ = GT
type instance Compare GT GT = EQ
type family LTT x y
type instance LTT x y = IsLT (Compare x y)
lt :: Proxy x -> Proxy y -> Proxy (LTT x y)
lt Proxy Proxy = Proxy
class x :<: y
type family LET x y
type instance LET x y = Not (GTT x y)
le :: Proxy x -> Proxy y -> Proxy (LET x y)
le Proxy Proxy = Proxy
class x :<=: y
type family EQT x y
type instance EQT x y = IsEQ (Compare x y)
eq :: Proxy x -> Proxy y -> Proxy (EQT x y)
eq Proxy Proxy = Proxy
class x :==: y
type family NET x y
type instance NET x y = Not (EQT x y)
ne :: Proxy x -> Proxy y -> Proxy (NET x y)
ne Proxy Proxy = Proxy
class x :/=: y
type family GET x y
type instance GET x y = Not (LTT x y)
ge :: Proxy x -> Proxy y -> Proxy (GET x y)
ge Proxy Proxy = Proxy
class x :>=: y
type family GTT x y
type instance GTT x y = IsGT (Compare x y)
gt :: Proxy x -> Proxy y -> Proxy (GTT x y)
gt Proxy Proxy = Proxy
class x :>: y
type family Min x y
type instance Min x y = If (LET x y) x y
min :: Proxy x -> Proxy y -> Proxy (Min x y)
min Proxy Proxy = Proxy
type family Max x y
type instance Max x y = If (GET x y) x y
max :: Proxy x -> Proxy y -> Proxy (Max x y)
max Proxy Proxy = Proxy
type instance Compare False False = EQ
type instance Compare False True = LT
type instance Compare True False = GT
type instance Compare True True = EQ