0 | module Data.Prim.Char
2 | import public Algebra.Ring
3 | import public Control.Order
4 | import public Control.Relation
5 | import public Control.Relation.ReflexiveClosure
6 | import public Control.Relation.Trichotomy
7 | import public Control.WellFounded
8 | import public Data.Maybe0
12 | unsafeRefl : a === b
13 | unsafeRefl = believe_me (Builtin.Refl {x = a})
17 | data (<) : (m,n : Char) -> Type where
18 | LT : {0 m,n : Char} -> (0 prf : (m < n) === True) -> m < n
26 | unerase : (0 p : m < n) -> m < n
27 | unerase (LT p) = LT p
33 | 0 mkLT : (0 prf : (m < n) === True) -> m < n
40 | 0 runLT : m < n -> (m < n) === True
41 | runLT (LT prf) = prf
46 | strictLT : (0 p : m < n) -> Lazy c -> c
47 | strictLT (LT prf) x = x
55 | 0 (>) : (m,n : Char) -> Type
60 | 0 (<=) : (m,n : Char) -> Type
61 | (<=) = ReflexiveClosure (<)
67 | 0 ltNotEQ : m < n -> Not (m === n)
68 | ltNotEQ x = strictLT x $
assert_total (idris_crash "IMPOSSIBLE: LT and EQ")
70 | 0 ltNotGT : m < n -> Not (n < m)
71 | ltNotGT x = strictLT x $
assert_total (idris_crash "IMPOSSIBLE: LT and GT")
73 | 0 eqNotLT : m === n -> Not (m < n)
74 | eqNotLT = flip ltNotEQ
76 | public export %inline
77 | lt : (x,y : Char) -> Maybe0 (x < y)
78 | lt x y = case prim__lt_Char x y of
80 | _ => Just0 (mkLT unsafeRefl)
82 | public export %inline
83 | lte : (x,y : Char) -> Maybe0 (x <= y)
84 | lte x y = case prim__lte_Char x y of
86 | _ => Just0 (if x < y then (Rel $
mkLT unsafeRefl) else (fromEq unsafeRefl))
89 | comp : (m,n : Char) -> Trichotomy (<) m n
90 | comp m n = case prim__lt_Char m n of
91 | 0 => case prim__eq_Char m n of
92 | 0 => GT (ltNotGT $
LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (LT unsafeRefl)
93 | x => EQ (eqNotLT unsafeRefl) (unsafeRefl) (eqNotLT unsafeRefl)
94 | x => LT (LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (ltNotGT $
LT unsafeRefl)
101 | Transitive Char (<) where
102 | transitive _ _ = LT unsafeRefl
105 | Trichotomous Char (<) where
106 | trichotomy m n = comp m n
119 | 0 GTE_MinChar : (m : Char) -> MinChar <= m
120 | GTE_MinChar m = case comp MinChar m of
122 | EQ f x g => fromEq x
123 | GT f g x => assert_total $
idris_crash "IMPOSSIBLE: Char smaller than 0"
127 | 0 Not_LT_MinChar : m < MinChar -> Void
128 | Not_LT_MinChar p = Not_LT_and_GTE p (GTE_MinChar m)
133 | accessLT : (m : Char) -> Accessible (<) m
134 | accessLT m = Access $
\n,lt => accessLT (assert_smaller m n)
136 | namespace WellFounded
139 | [LT] WellFounded Char (<) where
140 | wellFounded = accessLT