···150150151151### Standard library:
152152153153+- #13885: Add Dynarray.{exists2, for_all2}.
154154+ (T. Kinsart, review by Daniel Bünzli, Gabriel Scherer, and Nicolás Ojeda Bär)
155155+153156- #13836: Add [Float.]Array.{equal,compare}.
154157 (Daniel Bünzli, review by Nicolás Ojeda Bär and Gabriel Scherer)
155158
+43
stdlib/dynarray.ml
···409409 let[@inline never] empty_dynarray f =
410410 Printf.ksprintf invalid_arg
411411 "Dynarray.%s: empty array" f
412412+413413+ let[@inline never] different_lengths f ~length1 ~length2 =
414414+ Printf.ksprintf invalid_arg
415415+ "Dynarray.%s: array length mismatch: %d <> %d"
416416+ f length1 length2
412417end
413418414419(* Detecting iterator invalidation.
···960965 in
961966 let res = loop p arr dummy 0 length in
962967 check_same_length "for_all" a ~length;
968968+ res
969969+970970+let exists2 p a1 a2 =
971971+ let Pack {arr = arr1; length = length1; dummy = dummy1} = a1 in
972972+ let Pack {arr = arr2; length = length2; dummy = dummy2} = a2 in
973973+ check_valid_length length1 arr1;
974974+ check_valid_length length2 arr2;
975975+ if length1 <> length2 then
976976+ Error.different_lengths "exists2" ~length1 ~length2;
977977+ let rec loop p arr1 dummy1 arr2 dummy2 i length =
978978+ if i = length then false
979979+ else
980980+ p (unsafe_get arr1 ~dummy:dummy1 ~i ~length)
981981+ (unsafe_get arr2 ~dummy:dummy2 ~i ~length)
982982+ || loop p arr1 dummy1 arr2 dummy2 (i + 1) length
983983+ in
984984+ let res = loop p arr1 dummy1 arr2 dummy2 0 length1 in
985985+ check_same_length "exists2" a1 ~length:length1;
986986+ check_same_length "exists2" a2 ~length:length2;
987987+ res
988988+989989+let for_all2 p a1 a2 =
990990+ let Pack {arr = arr1; length = length1; dummy = dummy1} = a1 in
991991+ let Pack {arr = arr2; length = length2; dummy = dummy2} = a2 in
992992+ check_valid_length length1 arr1;
993993+ check_valid_length length2 arr2;
994994+ if length1 <> length2 then
995995+ Error.different_lengths "for_all2" ~length1 ~length2;
996996+ let rec loop p arr1 dummy1 arr2 dummy2 i length =
997997+ if i = length then true
998998+ else
999999+ p (unsafe_get arr1 ~dummy:dummy1 ~i ~length)
10001000+ (unsafe_get arr2 ~dummy:dummy2 ~i ~length)
10011001+ && loop p arr1 dummy1 arr2 dummy2 (i + 1) length
10021002+ in
10031003+ let res = loop p arr1 dummy1 arr2 dummy2 0 length1 in
10041004+ check_same_length "for_all2" a1 ~length:length1;
10051005+ check_same_length "for_all2" a2 ~length:length2;
9631006 res
96410079651008let filter f a =
+16
stdlib/dynarray.mli
···327327 [for_all f a] is [f x0 && f x1 && f x2].
328328*)
329329330330+val exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
331331+(** Same as {!exists}, but for a two-argument predicate.
332332+333333+ @raise Invalid_argument if the two arrays have different lengths.
334334+335335+ @since 5.4
336336+*)
337337+338338+val for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
339339+(** Same as {!for_all}, but for a two-argument predicate.
340340+341341+ @raise Invalid_argument if the two arrays have different lengths.
342342+343343+ @since 5.4
344344+*)
345345+330346val mem : 'a -> 'a t -> bool
331347(** [mem a set] is true if and only if [a] is structurally equal
332348 to an element of [set] (i.e. there is an [x] in [set] such that
+30
testsuite/tests/lib-dynarray/test.ml
···8787 let a = A.of_list [1; 2; 3] in
8888 assert (A.fold_right List.cons a [] = [1; 2; 3]);;
89899090+(* exists2 *)
9191+let () =
9292+ let a = A.of_list [1; 2; 3] in
9393+ assert (A.exists2 (=) a a);
9494+ assert (not (A.exists2 (=) (A.of_list []) (A.of_list [])));
9595+ assert (A.exists2 (=) a (A.of_list [1; 4; 3]));
9696+ assert (match A.exists2 (=) a (A.of_list [1; 2]) with
9797+ | exception (Invalid_argument _) -> true
9898+ | _ -> false
9999+ );
100100+ assert (match A.exists2 (=) (A.of_list [1; 2]) a with
101101+ | exception (Invalid_argument _) -> true
102102+ | _ -> false
103103+ );;
104104+105105+(* for_all2 *)
106106+let () =
107107+ let a = A.of_list [1; 2; 3] in
108108+ assert (A.for_all2 (=) a a);
109109+ assert (A.for_all2 (=) (A.of_list []) (A.of_list []));
110110+ assert (not (A.for_all2 (=) a (A.of_list [1; 4; 3])));
111111+ assert (match A.for_all2 (=) a (A.of_list [1; 2]) with
112112+ | exception (Invalid_argument _) -> true
113113+ | _ -> false
114114+ );
115115+ assert (match A.for_all2 (=) (A.of_list [1; 2]) a with
116116+ | exception (Invalid_argument _) -> true
117117+ | _ -> false
118118+ );;
119119+90120(** {1:adding Adding elements} *)
9112192122(** add_last was tested above *)