0 | module Data.Prim.String
2 | import public Data.DPair
3 | import public Data.Prim.Ord
8 | unsafeRefl = believe_me (Refl {x = a})
16 | data (<) : (m,n : String) -> Type where
17 | LT : {0 m,n : String} -> (0 prf : (m < n) === True) -> m < n
23 | 0 mkLT : (0 prf : (m < n) === True) -> m < n
30 | 0 runLT : m < n -> (m < n) === True
31 | runLT (LT prf) = prf
36 | strictLT : (0 p : m < n) -> Lazy c -> c
37 | strictLT (LT prf) x = x
45 | 0 (>) : (m,n : String) -> Type
50 | 0 (<=) : (m,n : String) -> Type
51 | m <= n = Either (m < n) (m === n)
55 | 0 (>=) : (m,n : String) -> Type
60 | 0 (/=) : (m,n : String) -> Type
61 | m /= n = Either (m < n) (m > n)
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
77 | comp : (m,n : String) -> Trichotomy (<) m n
78 | comp m n = case prim__lt_String m n of
79 | 0 => case prim__eq_String m n of
80 | 0 => GT (ltNotGT $
LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (LT unsafeRefl)
81 | x => EQ (eqNotLT unsafeRefl) (unsafeRefl) (eqNotLT unsafeRefl)
82 | x => LT (LT unsafeRefl) (ltNotEQ $
LT unsafeRefl) (ltNotGT $
LT unsafeRefl)
85 | Total String (<) where
87 | transLT p q = strictLT p $
strictLT q $
LT unsafeRefl
100 | 0 GTE_MinString : (m : String) -> m >= MinString
101 | GTE_MinString m = case comp MinString m of
102 | LT x f g => %search
103 | EQ f x g => %search
104 | GT f g x => assert_total $
idris_crash #"IMPOSSIBLE: String smaller than """#
108 | 0 Not_LT_MinString : m < MinString -> Void
109 | Not_LT_MinString = GTE_not_LT (GTE_MinString m)