Skip to content

Commit 6e76748

Browse files
committed
document different in cmp between array and list, make reduceReverse stack safe, more docs/tests
1 parent 1c750d1 commit 6e76748

10 files changed

+665
-175
lines changed

jscomp/others/belt_Array.ml

+11
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,17 @@ let reduceReverseU a x f =
327327

328328
let reduceReverse a x f = reduceReverseU a x (fun[@bs] a b -> f a b)
329329

330+
let reduceReverse2U a b x f =
331+
let r = ref x in
332+
let len = min (length a) (length b) in
333+
for i = len - 1 downto 0 do
334+
r := f !r (getUnsafe a i) (getUnsafe b i) [@bs]
335+
done;
336+
!r
337+
338+
let reduceReverse2 a b x f =
339+
reduceReverse2U a b x (fun [@bs] a b c -> f a b c)
340+
330341
let rec everyAux arr i b len =
331342
if i = len then true
332343
else if b (getUnsafe arr i) [@bs] then

jscomp/others/belt_Array.mli

+10
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,16 @@ val reduceReverse: 'b array -> 'a -> ('a -> 'b -> 'a ) -> 'a
300300
]}
301301
*)
302302

303+
val reduceReverse2U:
304+
'a array -> 'b array -> 'c -> ('c -> 'a -> 'b -> 'c [@bs]) -> 'c
305+
val reduceReverse2:
306+
'a array -> 'b array -> 'c -> ('c -> 'a -> 'b -> 'c) -> 'c
307+
(**
308+
@example {[
309+
reduceReverse2 [|1;2;3|] [|1;2|] 0 (fun acc x y -> acc + x + y) = 6
310+
]}
311+
*)
312+
303313
val someU: 'a array -> ('a -> bool [@bs]) -> bool
304314
val some: 'a array -> ('a -> bool) -> bool
305315
(** [some xs p]

jscomp/others/belt_List.ml

+33-6
Original file line numberDiff line numberDiff line change
@@ -511,11 +511,19 @@ let rec reduceU l accu f =
511511
let reduce l accu f =
512512
reduceU l accu (fun[@bs] acc x -> f acc x )
513513

514-
let rec reduceReverseU l accu f =
514+
515+
let rec reduceReverseUnsafeU l accu f =
515516
match l with
516517
[] -> accu
517-
| a::l -> f a (reduceReverseU l accu f) [@bs]
518+
| a::l -> f (reduceReverseUnsafeU l accu f) a [@bs]
518519

520+
let reduceReverseU (type a ) (type b) (l : a list) (acc : b) f =
521+
let len = length l in
522+
if len < 1000 then
523+
reduceReverseUnsafeU l acc f
524+
else
525+
A.reduceReverseU (toArray l) acc f
526+
519527
let reduceReverse l accu f =
520528
reduceReverseU l accu (fun [@bs] a b -> f a b)
521529

@@ -544,13 +552,23 @@ let rec reduce2U l1 l2 accu f =
544552

545553
let reduce2 l1 l2 acc f = reduce2U l1 l2 acc (fun[@bs] a b c -> f a b c )
546554

547-
let rec reduceReverse2U l1 l2 accu f =
555+
let rec reduceReverse2UnsafeU l1 l2 accu f =
548556
match (l1, l2) with
549557
([], []) -> accu
550-
| (a1::l1, a2::l2) -> f a1 a2 (reduceReverse2U l1 l2 accu f) [@bs]
558+
| (a1::l1, a2::l2) ->
559+
f (reduceReverse2UnsafeU l1 l2 accu f) a1 a2 [@bs]
551560
| _, [] | [], _ -> accu
552561

553-
let reduceReverse2 l1 l2 acc f = reduceReverse2U l1 l2 acc (fun [@bs] a b c -> f a b c)
562+
let reduceReverse2U (type a ) (type b ) (type c)
563+
(l1 : a list) (l2 : b list) (acc : c) f =
564+
let len = length l1 in
565+
if len < 1000 then
566+
reduceReverse2UnsafeU l1 l2 acc f
567+
else
568+
A.reduceReverse2U (toArray l1) (toArray l2) acc f
569+
570+
let reduceReverse2 l1 l2 acc f =
571+
reduceReverse2U l1 l2 acc (fun [@bs] a b c -> f a b c)
554572

555573
let rec everyU xs p =
556574
match xs with
@@ -573,6 +591,14 @@ let rec every2U l1 l2 p =
573591

574592
let every2 l1 l2 p = every2U l1 l2 (fun[@bs] a b -> p a b)
575593

594+
let rec cmpByLength l1 l2 =
595+
match l1, l2 with
596+
| [], [] -> 0
597+
| _, [] -> 1
598+
| [], _ -> -1
599+
| _ :: l1s , _ :: l2s ->
600+
cmpByLength l1s l2s
601+
576602
let rec cmpU l1 l2 p =
577603
match (l1, l2) with
578604
| [], [] -> 0
@@ -583,9 +609,10 @@ let rec cmpU l1 l2 p =
583609
if c = 0 then
584610
cmpU l1 l2 p
585611
else c
586-
612+
587613
let cmp l1 l2 f = cmpU l1 l2 (fun [@bs] x y -> f x y)
588614

615+
589616
let rec eqU l1 l2 p =
590617
match (l1, l2) with
591618
| [], [] -> true

jscomp/others/belt_List.mli

+29-5
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,8 @@ val reduce: 'a t -> 'b -> ('b -> 'a -> 'b) -> 'b
304304
]}
305305
*)
306306

307-
val reduceReverseU: 'a t -> 'b -> ('a -> 'b -> 'b [@bs]) -> 'b
308-
val reduceReverse: 'a t -> 'b -> ('a -> 'b -> 'b) -> 'b
307+
val reduceReverseU: 'a t -> 'b -> ('b -> 'a -> 'b [@bs]) -> 'b
308+
val reduceReverse: 'a t -> 'b -> ('b -> 'a -> 'b) -> 'b
309309
(** [reduceReverse xs f]
310310
311311
@example {[
@@ -342,9 +342,9 @@ val reduce2:
342342
*)
343343

344344
val reduceReverse2U:
345-
'a t -> 'b t -> 'c -> ('a -> 'b -> 'c -> 'c [@bs]) -> 'c
345+
'a t -> 'b t -> 'c -> ('c -> 'a -> 'b -> 'c [@bs]) -> 'c
346346
val reduceReverse2:
347-
'a t -> 'b t -> 'c -> ('a -> 'b -> 'c -> 'c) -> 'c
347+
'a t -> 'b t -> 'c -> ('c -> 'a -> 'b -> 'c) -> 'c
348348
(**
349349
[reduceReverse2 xs ys init f ]
350350
@@ -391,14 +391,26 @@ val some2: 'a t -> 'b t -> ('a -> 'b -> bool) -> bool
391391
(some2 [2;3] [1;4] (fun x y -> x > y)) = true;;
392392
]}
393393
*)
394+
395+
val cmpByLength: 'a t -> 'a t -> int
396+
(** [cmpByLength l1 l2]
397+
398+
Compare two lists solely by length
399+
*)
400+
394401
val cmpU: 'a t -> 'a t -> ('a -> 'a -> int [@bs]) -> int
395402
val cmp: 'a t -> 'a t -> ('a -> 'a -> int) -> int
396403
(**
397404
[cmp xs ys cmpElem]
398405
compare lists [xs] and [ys] using [cmpElem] to compare elements
399406
@example {[
400-
cmp [1;2;3] [1;2;3] compare = 0
407+
cmp [1;2;3] [1;2;3] compare = 0;;
408+
cmp [1;2;3] [0;1;2;3] compare = 1 ;;]
401409
]}
410+
411+
{b Attention}: The total ordering of List is different from Array,
412+
for Array, we compare the length first and one by one later, while
413+
for lists, we just compare one by one
402414
*)
403415

404416

@@ -441,7 +453,14 @@ val keep: 'a t -> ('a -> bool) -> 'a t
441453
*)
442454
val keepMapU: 'a t -> ('a -> 'b option [@bs]) -> 'b t
443455
val keepMap: 'a t -> ('a -> 'b option) -> 'b t
456+
(** [keepMap xs f]
444457
458+
@example {[
459+
keepMap [1;2;3;4] (fun x -> if x mod 2 = 0 then Some (-x ) else None)
460+
=
461+
[-2;-4]
462+
]}
463+
*)
445464
val partitionU: 'a t -> ('a -> bool [@bs]) -> 'a t * 'a t
446465
val partition: 'a t -> ('a -> bool) -> 'a t * 'a t
447466
(** [partition xs p]
@@ -452,7 +471,12 @@ val partition: 'a t -> ('a -> bool) -> 'a t * 'a t
452471
]}
453472
*)
454473
val unzip: ('a * 'b) t -> 'a t * 'b t
474+
(** [unzip xs]
455475
476+
@example {[
477+
unzip [(1,2) ; (3,4)] = ([1;3], [2;4])
478+
]}
479+
*)
456480
val getAssocU: ('a * 'c) t -> 'b -> ('a -> 'b -> bool [@bs]) -> 'c option
457481
val getAssoc: ('a * 'c) t -> 'b -> ('a -> 'b -> bool) -> 'c option
458482
(** [getAssoc xs k eq]

0 commit comments

Comments
 (0)