@@ -156,8 +156,15 @@ natEnumFromTo n m = if n <= m
156156total natEnumFromThenTo' : Nat -> Nat -> Nat -> List Nat
157157natEnumFromThenTo' _ Z _ = []
158158natEnumFromThenTo' n (S inc) m = map (plus n . (* (S inc))) (natRange (S (divNatNZ (minus m n) (S inc) SIsNotZ)))
159+
159160total natEnumFromThenTo : Nat -> Nat -> Nat -> List Nat
160−natEnumFromThenTo n next m = natEnumFromThenTo' n (minus next n) m
161+natEnumFromThenTo n next m = if n == m then [n]
162+ else if n < m then natEnumFromThenTo' n (minus next n) m
163+ else case minus n next of
164+ Z => []
165+ S step => List.reverse . map (+ (modNatNZ (minus n m) (S step) SIsNotZ)) $ natEnumFromThenTo' m (minus n next) n
166+ where modNatNZ : Nat -> (m : Nat) -> Not (m = 0) -> Nat
167+ modNatNZ n m nz = minus n $ mult m $ divNatNZ n m nz
161168
162169interface Enum a where
163170 total pred : a -> a
@@ -197,8 +204,9 @@ Enum Integer where
197204 go' n (x :: xs) = n + cast x :: go' n xs
198205 go : Integer -> Integer -> List Integer
199206 go n m = go' n (natRange (S (cast {to = Nat} (m - n))))
200− enumFromThenTo _ 0 _ = []
201− enumFromThenTo n next m = go (natRange (S (divNatNZ (fromInteger (abs (m - n))) (S (fromInteger ((abs (next - n)) - 1))) SIsNotZ)))
207+ enumFromThenTo n next m = if n == m then [n]
208+ else if next - n == 0 || next - n < 0 /= m - n < 0 then []
209+ else go (natRange (S (divNatNZ (fromInteger (abs (m - n))) (S (fromInteger ((abs (next - n)) - 1))) SIsNotZ)))
202210 where go : List Nat -> List Integer
203211 go [] = []
204212 go (x :: xs) = n + (cast x * (next - n)) :: go xs
@@ -217,8 +225,9 @@ Enum Int where
217225 go : Int -> Int -> List Int
218226 go n m = go' [] (cast {to = Nat} (m - n)) m
219227 enumFromThen n inc = n :: enumFromThen (inc + n) inc
220− enumFromThenTo _ 0 _ = []
221− enumFromThenTo n next m = go (natRange (S (divNatNZ (cast {to=Nat} (abs (m - n))) (S (cast {to=Nat} ((abs (next - n)) - 1))) SIsNotZ)))
228+ enumFromThenTo n next m = if n == m then [n]
229+ else if next - n == 0 || next - n < 0 /= m - n < 0 then []
230+ else go (natRange (S (divNatNZ (cast {to=Nat} (abs (m - n))) (S (cast {to=Nat} ((abs (next - n)) - 1))) SIsNotZ)))
222231 where go : List Nat -> List Int
223232 go [] = []
224233 go (x :: xs) = n + (cast x * (next - n)) :: go xs