From 86701af5cc232d58afebf222e288d334de5ddf32 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Sun, 24 Apr 2016 22:59:11 +0200 Subject: [PATCH] add `int_range_by` --- sequence.ml | 20 ++++++++++++++++++++ sequence.mli | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/sequence.ml b/sequence.ml index 8e922bf..0a3bff5 100644 --- a/sequence.ml +++ b/sequence.ml @@ -580,6 +580,26 @@ let int_range ~start ~stop k = let int_range_dec ~start ~stop k = for i = start downto stop do k i done +let int_range_by ~step i j = + let rec aux step i j yield = + if step>0 then ( + if i<=j then (yield i; aux step (i+step) j yield) + ) else ( + if i>=j then (yield i; aux step (i+step) j yield) + ) + in + if step=0 then invalid_arg "int_range_by"; + aux step i j + +(*$Q + Q.(pair small_int small_int) (fun (i,j) -> \ + let i = Pervasives.min i j and j = Pervasives.max i j in \ + (i--j |> to_list) = (int_range_by ~step:1 i j |> to_list)) + Q.(pair small_int small_int) (fun (i,j) -> \ + let i = Pervasives.min i j and j = Pervasives.max i j in \ + (i--j |> to_rev_list) = (int_range_by ~step:~-1 j i |> to_list)) +*) + let bools k = k false; k true let of_set (type s) (type v) m set = diff --git a/sequence.mli b/sequence.mli index d4a278e..f60d5f0 100644 --- a/sequence.mli +++ b/sequence.mli @@ -421,6 +421,12 @@ val int_range_dec : start:int -> stop:int -> int t (** Iterator on decreasing integers in [stop...start] by steps -1. See {!(--^)} for an infix version *) +val int_range_by : step:int -> int -> int -> int t +(** [int_range_by ~step i j] is the range starting at [i], excluding [j], + where the difference between successive elements is [step]. + use a negative [step] for a decreasing sequence. + @raise Invalid_argument if [step=0] *) + val bools : bool t (** Iterates on [true] and [false] @since 0.7 *)