bug fix for CCList.range_by

This commit is contained in:
Glen Mével 2016-04-25 11:39:03 +02:00
parent fb97af680b
commit f57d7267ac

View file

@ -793,23 +793,29 @@ module Idx = struct
end end
let range_by ~step i j = let range_by ~step i j =
if step = 0 then raise (Invalid_argument "CCList.range_by"); let rec range i j acc =
let rec up i j acc = if i=j then i::acc else range i (j-step) (j::acc)
if i>j then acc else up i (j-step) (j::acc)
and down i j acc =
if i<j then acc else down i (j-step) (j::acc)
in in
let j = (j - i) / step * step + i in if step = 0 then
if step > 0 then up i j [] else down i j [] raise (Invalid_argument "CCList.range_by")
else if (if step > 0 then i>j else i<j) then
[]
else
range i ((j-i)/step*step + i) []
(* note: the last test checks that no error occurs due to overflows. *)
(*$T (*$T
range_by ~step:1 0 0 = [0] range_by ~step:1 0 0 = [0]
range_by ~step:1 5 0 = [] range_by ~step:1 5 0 = []
range_by ~step:2 1 0 = []
range_by ~step:2 0 4 = [0;2;4] range_by ~step:2 0 4 = [0;2;4]
range_by ~step:2 0 5 = [0;2;4] range_by ~step:2 0 5 = [0;2;4]
range_by ~step:~-1 0 0 = [0]
range_by ~step:~-1 0 5 = [] range_by ~step:~-1 0 5 = []
range_by ~step:~-2 0 1 = []
range_by ~step:~-2 5 1 = [5;3;1] range_by ~step:~-2 5 1 = [5;3;1]
range_by ~step:~-2 5 0 = [5;3;1] range_by ~step:~-2 5 0 = [5;3;1]
range_by ~step:max_int 0 2 = [0]
*) *)
let range i j = let range i j =