diff --git a/benchs/run_benchs.ml b/benchs/run_benchs.ml index ca50ad18d..306a7eab3 100644 --- a/benchs/run_benchs.ml +++ b/benchs/run_benchs.ml @@ -1153,12 +1153,14 @@ module Iter_ = struct let bench_to_array n = let iter () = Iter.to_array Iter.(1 -- n) and gen () = Gen.to_array Gen.(1 -- n) - and oseq () = OSeq.to_array OSeq.(1 -- n) in + and oseq () = OSeq.to_array OSeq.(1 -- n) + and of_iter () = CCArray.of_iter Iter.(1 -- n) in B.throughputN 3 ~repeat [ "iter.to_array", iter, (); "gen.to_array", gen, (); "oseq.to_array", oseq, (); + "ccarray.of_iter", of_iter, (); ] let bench_cons n = diff --git a/src/core/CCArray.ml b/src/core/CCArray.ml index 00c57142d..f89043685 100644 --- a/src/core/CCArray.ml +++ b/src/core/CCArray.ml @@ -466,6 +466,12 @@ let to_seq a = let to_iter a k = iter k a +let of_iter (i : 'a iter) : 'a array = + let open CCVector in + let vec = create () in + i (push vec); + to_array vec + let to_gen a = let k = ref 0 in fun () -> diff --git a/src/core/CCArray.mli b/src/core/CCArray.mli index d19d42523..e411838c7 100644 --- a/src/core/CCArray.mli +++ b/src/core/CCArray.mli @@ -240,6 +240,11 @@ val to_iter : 'a t -> 'a iter in modification of the iterator. @since 2.8 *) +val of_iter : 'a iter -> 'a t +(** [of_iter iter] builds a array from a given [iter]. + In the result, elements appear in the same order as they did in the source [iter]. + @since NEXT_RELEASE *) + val to_seq : 'a t -> 'a Seq.t (** [to_seq a] returns a [Seq.t] of the elements of an array [a]. The input array [a] is shared with the sequence and modification of it will result diff --git a/src/core/CCArrayLabels.mli b/src/core/CCArrayLabels.mli index 8663c7ddd..fd6552bf4 100644 --- a/src/core/CCArrayLabels.mli +++ b/src/core/CCArrayLabels.mli @@ -248,6 +248,11 @@ val to_iter : 'a t -> 'a iter in modification of the iterator. @since 2.8 *) +val of_iter : 'a iter -> 'a t +(** [of_iter iter] builds a array from a given [iter]. + In the result, elements appear in the same order as they did in the source [iter]. + @since NEXT_RELEASE *) + val to_seq : 'a t -> 'a Seq.t (** [to_seq a] returns a [Seq.t] of the elements of an array [a]. The input array [a] is shared with the sequence and modification of it will result diff --git a/tests/core/t_array.ml b/tests/core/t_array.ml index ecc76690c..da836f054 100644 --- a/tests/core/t_array.ml +++ b/tests/core/t_array.ml @@ -309,3 +309,6 @@ q ~count:300 arr_arbitrary (fun a -> Array.sort CCInt.compare a1; sort_generic (module IA) ~cmp:CCInt.compare a2; a1 = a2) +;; + +q Q.(array int) (fun a -> of_iter (to_iter a) = a)