Skip to content

Commit d20944d

Browse files
committed
Add Ext_array.fold_left
1 parent 20da1ed commit d20944d

19 files changed

+4570
-4437
lines changed

Diff for: jscomp/bin/all_ounit_tests.ml

+21-6
Original file line numberDiff line numberDiff line change
@@ -1340,6 +1340,12 @@ val iter :
13401340
'a array ->
13411341
('a -> unit) ->
13421342
unit
1343+
1344+
val fold_left :
1345+
'b array ->
1346+
'a ->
1347+
('a -> 'b -> 'a) ->
1348+
'a
13431349
end = struct
13441350
#1 "ext_array.ml"
13451351
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -1600,6 +1606,15 @@ let iter a f =
16001606
let open Array in
16011607
for i = 0 to length a - 1 do f(unsafe_get a i) done
16021608

1609+
1610+
let fold_left a x f =
1611+
let open Array in
1612+
let r = ref x in
1613+
for i = 0 to length a - 1 do
1614+
r := f !r (unsafe_get a i)
1615+
done;
1616+
!r
1617+
16031618
end
16041619
module Ext_bytes : sig
16051620
#1 "ext_bytes.mli"
@@ -3480,7 +3495,7 @@ let of_list l =
34803495
| _ -> of_sorted_list (List.sort_uniq compare_elt l)
34813496

34823497
let of_array l =
3483-
Array.fold_left (fun acc x -> add acc x ) empty l
3498+
Ext_array.fold_left l empty (fun acc x -> add acc x )
34843499

34853500
(* also check order *)
34863501
let invariant t =
@@ -5475,7 +5490,7 @@ let add_list (xs : _ list ) init =
54755490
let of_list xs = add_list xs empty
54765491

54775492
let of_array xs =
5478-
Array.fold_left (fun acc (k,v) -> add acc k v ) empty xs
5493+
Ext_array.fold_left xs empty (fun acc (k,v) -> add acc k v )
54795494

54805495
end
54815496
module Ext_json_types
@@ -8496,7 +8511,7 @@ let elements set =
84968511

84978512
let stats h =
84988513
let mbl =
8499-
Array.fold_left (fun m b -> max m (List.length b)) 0 h.data in
8514+
Ext_array.fold_left h.data 0 (fun m b -> max m (List.length b)) in
85008515
let histo = Array.make (mbl + 1) 0 in
85018516
Ext_array.iter h.data
85028517
(fun b ->
@@ -9070,7 +9085,7 @@ let rec bucket_length acc (x : _ bucket) =
90709085

90719086
let stats h =
90729087
let mbl =
9073-
Array.fold_left (fun m (b : _ bucket) -> max m (bucket_length 0 b)) 0 h.data in
9088+
Ext_array.fold_left h.data 0 (fun m (b : _ bucket) -> max m (bucket_length 0 b)) in
90749089
let histo = Array.make (mbl + 1) 0 in
90759090
Ext_array.iter h.data
90769091
(fun b ->
@@ -9831,7 +9846,7 @@ let rec bucket_length accu = function
98319846

98329847
let stats h =
98339848
let mbl =
9834-
Array.fold_left (fun m b -> max m (bucket_length 0 b)) 0 h.data in
9849+
Ext_array.fold_left h.data 0 (fun m b -> max m (bucket_length 0 b)) in
98359850
let histo = Array.make (mbl + 1) 0 in
98369851
Ext_array.iter h.data
98379852
(fun b ->
@@ -13988,7 +14003,7 @@ let add_list (xs : _ list ) init =
1398814003
let of_list xs = add_list xs empty
1398914004

1399014005
let of_array xs =
13991-
Array.fold_left (fun acc (k,v) -> add acc k v ) empty xs
14006+
Ext_array.fold_left xs empty (fun acc (k,v) -> add acc k v )
1399214007

1399314008
end
1399414009
module Ounit_map_tests

Diff for: jscomp/bin/bsb_native.ml

+34-20
Original file line numberDiff line numberDiff line change
@@ -1491,6 +1491,12 @@ val iter :
14911491
'a array ->
14921492
('a -> unit) ->
14931493
unit
1494+
1495+
val fold_left :
1496+
'b array ->
1497+
'a ->
1498+
('a -> 'b -> 'a) ->
1499+
'a
14941500
end = struct
14951501
#1 "ext_array.ml"
14961502
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -1751,6 +1757,15 @@ let iter a f =
17511757
let open Array in
17521758
for i = 0 to length a - 1 do f(unsafe_get a i) done
17531759

1760+
1761+
let fold_left a x f =
1762+
let open Array in
1763+
let r = ref x in
1764+
for i = 0 to length a - 1 do
1765+
r := f !r (unsafe_get a i)
1766+
done;
1767+
!r
1768+
17541769
end
17551770
module Ext_list : sig
17561771
#1 "ext_list.mli"
@@ -3367,7 +3382,7 @@ let add_list (xs : _ list ) init =
33673382
let of_list xs = add_list xs empty
33683383

33693384
let of_array xs =
3370-
Array.fold_left (fun acc (k,v) -> add acc k v ) empty xs
3385+
Ext_array.fold_left xs empty (fun acc (k,v) -> add acc k v )
33713386

33723387
end
33733388
module Ext_json_types
@@ -4411,7 +4426,7 @@ let rec bucket_length accu = function
44114426

44124427
let stats h =
44134428
let mbl =
4414-
Array.fold_left (fun m b -> max m (bucket_length 0 b)) 0 h.data in
4429+
Ext_array.fold_left h.data 0 (fun m b -> max m (bucket_length 0 b)) in
44154430
let histo = Array.make (mbl + 1) 0 in
44164431
Ext_array.iter h.data
44174432
(fun b ->
@@ -8954,7 +8969,7 @@ let of_list l =
89548969
| _ -> of_sorted_list (List.sort_uniq compare_elt l)
89558970

89568971
let of_array l =
8957-
Array.fold_left (fun acc x -> add acc x ) empty l
8972+
Ext_array.fold_left l empty (fun acc x -> add acc x )
89588973

89598974
(* also check order *)
89608975
let invariant t =
@@ -9660,7 +9675,7 @@ let handle_empty_sources
96609675
let files_array = Lazy.force file_array in
96619676
let dyn_file_array = String_vec.make (Array.length files_array) in
96629677
let files =
9663-
Array.fold_left (fun acc name ->
9678+
Ext_array.fold_left files_array !cur_sources (fun acc name ->
96649679
if is_input_or_output generators name then acc
96659680
else
96669681
match Ext_string.is_valid_source_name name with
@@ -9674,7 +9689,7 @@ let handle_empty_sources
96749689
warning_unused_file name dir ;
96759690
acc
96769691
| Suffix_mismatch -> acc
9677-
) !cur_sources files_array in
9692+
) in
96789693
cur_sources := files ;
96799694
[ Ext_file_pp.patch_action dyn_file_array
96809695
loc_start loc_end
@@ -9830,7 +9845,7 @@ let rec
98309845
| None -> (* No setting on [!files]*)
98319846
(** We should avoid temporary files *)
98329847
cur_sources :=
9833-
Array.fold_left (fun acc name ->
9848+
Ext_array.fold_left (Lazy.force file_array) !cur_sources (fun acc name ->
98349849
if is_input_or_output generators name then
98359850
acc
98369851
else
@@ -9844,7 +9859,7 @@ let rec
98449859
;
98459860
acc
98469861
| Suffix_mismatch -> acc
9847-
) !cur_sources (Lazy.force file_array);
9862+
) ;
98489863
cur_globbed_dirs := [dir]
98499864
| Some (Arr ({content = [||] }as empty_json_array)) ->
98509865
(* [ ] populatd by scanning the dir (just once) *)
@@ -9858,12 +9873,12 @@ let rec
98589873
TODO: still need check?
98599874
*)
98609875
cur_sources :=
9861-
Array.fold_left (fun acc (s : Ext_json_types.t) ->
9876+
Ext_array.fold_left sx !cur_sources (fun acc s ->
98629877
match s with
98639878
| Str {str = s} ->
98649879
Bsb_db.collect_module_by_filename ~dir acc s
98659880
| _ -> acc
9866-
) !cur_sources sx
9881+
)
98679882
| Some (Obj {map = m; loc} ) -> (* { excludes : [], slow_re : "" }*)
98689883
cur_globbed_dirs := [dir];
98699884
let excludes =
@@ -9882,11 +9897,11 @@ let rec
98829897
fun name -> Str.string_match re name 0 && not (List.mem name excludes)
98839898
| Some x, _ -> Bsb_exception.errorf ~loc "slow-re expect a string literal"
98849899
| None , _ -> Bsb_exception.errorf ~loc "missing field: slow-re" in
9885-
cur_sources := Array.fold_left (fun acc name ->
9900+
cur_sources := Ext_array.fold_left (Lazy.force file_array) !cur_sources (fun acc name ->
98869901
if is_input_or_output generators name || not (predicate name) then acc
98879902
else
98889903
Bsb_db.collect_module_by_filename ~dir acc name
9889-
) !cur_sources (Lazy.force file_array)
9904+
)
98909905
| Some x -> Bsb_exception.config_error x "files field expect array or object "
98919906
end;
98929907
let cur_sources = !cur_sources in
@@ -9900,7 +9915,7 @@ let rec
99009915
| Some (True _), _ ->
99019916
let root = cxt.root in
99029917
let parent = Filename.concat root dir in
9903-
Array.fold_left (fun origin x ->
9918+
Ext_array.fold_left (Lazy.force file_array) Bsb_file_groups.empty (fun origin x ->
99049919
if Sys.is_directory (Filename.concat parent x) then
99059920
Bsb_file_groups.merge
99069921
(
@@ -9911,7 +9926,7 @@ let rec
99119926
traverse = true
99129927
} String_map.empty) origin
99139928
else origin
9914-
) Bsb_file_groups.empty (Lazy.force file_array)
9929+
)
99159930
(* readdir parent avoiding scanning twice *)
99169931
| None, false
99179932
| Some (False _), _ -> Bsb_file_groups.empty
@@ -9971,10 +9986,9 @@ and parsing_single_source ({not_dev; dir_index ; cwd} as cxt ) (x : Ext_json_typ
99719986
cwd= Ext_path.concat cwd dir} map
99729987
| _ -> Bsb_file_groups.empty
99739988
and parsing_arr_sources cxt (file_groups : Ext_json_types.t array) =
9974-
Array.fold_left (fun origin x ->
9989+
Ext_array.fold_left file_groups Bsb_file_groups.empty (fun origin x ->
99759990
Bsb_file_groups.merge (parsing_single_source cxt x) origin
9976-
) Bsb_file_groups.empty file_groups
9977-
9991+
)
99789992
and parse_sources ( cxt : cxt) (sources : Ext_json_types.t ) =
99799993
match sources with
99809994
| Arr file_groups ->
@@ -10833,7 +10847,7 @@ let elements set =
1083310847

1083410848
let stats h =
1083510849
let mbl =
10836-
Array.fold_left (fun m b -> max m (List.length b)) 0 h.data in
10850+
Ext_array.fold_left h.data 0 (fun m b -> max m (List.length b)) in
1083710851
let histo = Array.make (mbl + 1) 0 in
1083810852
Ext_array.iter h.data
1083910853
(fun b ->
@@ -11809,8 +11823,8 @@ let interpret_json
1180911823
|? (Bsb_build_schemas.cut_generators, `Bool (fun b -> cut_generators := b))
1181011824
|? (Bsb_build_schemas.generators, `Arr (fun s ->
1181111825
generators :=
11812-
Array.fold_left (fun acc json ->
11813-
match (json : Ext_json_types.t) with
11826+
Ext_array.fold_left s String_map.empty (fun acc json ->
11827+
match json with
1181411828
| Obj {map = m ; loc} ->
1181511829
begin match String_map.find_opt m Bsb_build_schemas.name,
1181611830
String_map.find_opt m Bsb_build_schemas.command with
@@ -11819,7 +11833,7 @@ let interpret_json
1181911833
| _, _ ->
1182011834
Bsb_exception.errorf ~loc {| generators exepect format like { "name" : "cppo", "command" : "cppo $in -o $out"} |}
1182111835
end
11822-
| _ -> acc ) String_map.empty s ))
11836+
| _ -> acc ) ))
1182311837
|? (Bsb_build_schemas.refmt_flags, `Arr (fun s -> refmt_flags := get_list_string s))
1182411838
|? (Bsb_build_schemas.entries, `Arr (fun s -> entries := parse_entries s))
1182511839
|> ignore ;

0 commit comments

Comments
 (0)