Skip to content

Commit 33c5320

Browse files
authored
Merge pull request #2825 from mikaelbr/array-partition
Add Belt_Array.partition
2 parents c9d4888 + 7569ec0 commit 33c5320

File tree

5 files changed

+220
-100
lines changed

5 files changed

+220
-100
lines changed

Diff for: jscomp/others/belt_Array.ml

+26-3
Original file line numberDiff line numberDiff line change
@@ -408,13 +408,36 @@ let cmpU a b p =
408408

409409
let cmp a b p = cmpU a b (fun[@bs] a b -> p a b)
410410

411+
let partitionU a f =
412+
let l = length a in
413+
let i = ref 0 in
414+
let j = ref 0 in
415+
let a1 = makeUninitializedUnsafe l in
416+
let a2 = makeUninitializedUnsafe l in
417+
for ii = 0 to l - 1 do
418+
let v = getUnsafe a ii in
419+
if f v [@bs] then (
420+
setUnsafe a1 !i v;
421+
incr i
422+
)
423+
else (
424+
setUnsafe a2 !j v;
425+
incr j
426+
)
427+
done;
428+
truncateToLengthUnsafe a1 !i;
429+
truncateToLengthUnsafe a2 !j;
430+
(a1, a2)
431+
432+
let partition a f = partitionU a (fun [@bs] x -> f x)
433+
411434
let unzip a =
412435
let l = length a in
413-
let a1 = makeUninitializedUnsafe l in
414-
let a2 = makeUninitializedUnsafe l in
436+
let a1 = makeUninitializedUnsafe l in
437+
let a2 = makeUninitializedUnsafe l in
415438
for i = 0 to l - 1 do
416439
let (v1, v2) = getUnsafe a i in
417440
setUnsafe a1 i v1;
418-
setUnsafe a2 i v2
441+
setUnsafe a2 i v2
419442
done;
420443
(a1, a2)

Diff for: jscomp/others/belt_Array.mli

+12-1
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,18 @@ val mapWithIndex: 'a array -> (int -> 'a -> 'b ) -> 'b array
411411
[|0 + 1; 1 + 2; 2 + 3|]
412412
]}
413413
*)
414-
414+
415+
416+
val partitionU : 'a array -> ('a -> bool [@bs]) -> 'a array * 'a array
417+
val partition : 'a array -> ('a -> bool) -> 'a array * 'a array
418+
(** [partition f a] split array into tuple of two arrays based on predicate f; first of tuple where predicate vause true, second where predicate cause false
419+
420+
@example {[
421+
predicate [|1;2;3;4;5|] (fun x -> if x mod 2 = 0) = ([|2;4|], [|1;2;3|]);;
422+
predicate [|1;2;3;4;5|] (fun x -> if x mod 2 <> 0) = ([|1;2;3|], [|2;4|]);;
423+
]}
424+
*)
425+
415426
val reduceU: 'b array -> 'a -> ('a -> 'b -> 'a [@bs]) ->'a
416427
val reduce: 'b array -> 'a -> ('a -> 'b -> 'a ) ->'a
417428
(** [reduce xs init f]

0 commit comments

Comments
 (0)