0 | module Data.Prim.Char
2 | import public Control.WellFounded
3 | import public Data.DPair
4 | import public Data.Prim.Ord
9 | unsafeRefl = believe_me (Refl {x = a})
17 | data (<) : (m,n : Char) -> Type where
18 | LT : {0 m,n : Char} -> (0 prf : (m < n) === True) -> m < n
24 | 0 mkLT : (0 prf : (m < n) === True) -> m < n
31 | 0 runLT : m < n -> (m < n) === True
32 | runLT (LT prf) = prf
37 | strictLT : (0 p : m < n) -> Lazy c -> c
38 | strictLT (LT prf) x = x
46 | 0 (>) : (m,n : Char) -> Type
51 | 0 (<=) : (m,n : Char) -> Type
52 | m <= n = Either (m < n) (m === n)
56 | 0 (>=) : (m,n : Char) -> Type
61 | 0 (/=) : (m,n : Char) -> Type
62 | m /= n = Either (m < n) (m > n)
68 | 0 ltNotEQ : m < n -> Not (m === n)
69 | ltNotEQ x = strictLT x $
assert_total (idris_crash "IMPOSSIBLE: LT and EQ")
71 | 0 ltNotGT : m < n -> Not (n < m)
72 | ltNotGT x = strictLT x $
assert_total (idris_crash "IMPOSSIBLE: LT and GT")
74 | 0 eqNotLT : m === n -> Not (m < n)
75 | eqNotLT = flip ltNotEQ
78 | comp : (m,n : Char) -> Trichotomy (<) m n
79 | comp m n = case prim__lt_Char m n of
80 | 0 => case prim__eq_Char m n of
81 | 0 => GT (ltNotGT $
LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (LT unsafeRefl)
82 | x => EQ (eqNotLT unsafeRefl) (unsafeRefl) (eqNotLT unsafeRefl)
83 | x => LT (LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (ltNotGT $
LT unsafeRefl)
86 | Total Char (<) where
88 | transLT p q = strictLT p $
strictLT q $
LT unsafeRefl
101 | 0 GTE_MinChar : (m : Char) -> m >= MinChar
102 | GTE_MinChar m = case comp MinChar m of
103 | LT x f g => %search
104 | EQ f x g => %search
105 | GT f g x => assert_total $
idris_crash "IMPOSSIBLE: Char smaller than 0"
109 | 0 Not_LT_MinChar : m < MinChar -> Void
110 | Not_LT_MinChar = GTE_not_LT (GTE_MinChar m)
115 | accessLT : (m : Char) -> Accessible (<) m
116 | accessLT m = Access $
\n,lt => accessLT (assert_smaller m n)
120 | WellFounded Char (<) where
121 | wellFounded = accessLT