Skip to content

Commit a414b48

Browse files
authored
Reduce closure allocation in List (#792)
1 parent 2813be6 commit a414b48

File tree

1 file changed

+44
-44
lines changed

1 file changed

+44
-44
lines changed

ocaml/stdlib/list.ml

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ let rec mapi i f = function
103103
let mapi f l = mapi 0 f l
104104

105105
let rev_map f l =
106-
let rec rmap_f accu = function
106+
let rec rmap_f f accu = function
107107
| [] -> accu
108-
| a::l -> rmap_f (f a :: accu) l
108+
| a::l -> rmap_f f (f a :: accu) l
109109
in
110-
rmap_f [] l
110+
rmap_f f [] l
111111

112112

113113
let rec iter f = function
@@ -137,13 +137,13 @@ let rec map2 f l1 l2 =
137137
| (_, _) -> invalid_arg "List.map2"
138138

139139
let rev_map2 f l1 l2 =
140-
let rec rmap2_f accu l1 l2 =
140+
let rec rmap2_f f accu l1 l2 =
141141
match (l1, l2) with
142142
| ([], []) -> accu
143-
| (a1::l1, a2::l2) -> rmap2_f (f a1 a2 :: accu) l1 l2
143+
| (a1::l1, a2::l2) -> rmap2_f f (f a1 a2 :: accu) l1 l2
144144
| (_, _) -> invalid_arg "List.rev_map2"
145145
in
146-
rmap2_f [] l1 l2
146+
rmap2_f f [] l1 l2
147147

148148

149149
let rec iter2 f l1 l2 =
@@ -242,29 +242,29 @@ let rec find_map f = function
242242
end
243243

244244
let find_all p =
245-
let rec find accu = function
245+
let rec find p accu = function
246246
| [] -> rev accu
247-
| x :: l -> if p x then find (x :: accu) l else find accu l in
248-
find []
247+
| x :: l -> if p x then find p (x :: accu) l else find p accu l in
248+
find p []
249249

250250
let filter = find_all
251251

252252
let filteri p l =
253-
let rec aux i acc = function
253+
let rec aux p i acc = function
254254
| [] -> rev acc
255-
| x::l -> aux (i + 1) (if p i x then x::acc else acc) l
255+
| x::l -> aux p (i + 1) (if p i x then x::acc else acc) l
256256
in
257-
aux 0 [] l
257+
aux p 0 [] l
258258

259259
let filter_map f =
260-
let rec aux accu = function
260+
let rec aux f accu = function
261261
| [] -> rev accu
262262
| x :: l ->
263263
match f x with
264-
| None -> aux accu l
265-
| Some v -> aux (v :: accu) l
264+
| None -> aux f accu l
265+
| Some v -> aux f (v :: accu) l
266266
in
267-
aux []
267+
aux f []
268268

269269
let concat_map f l =
270270
let rec aux f acc = function
@@ -275,29 +275,29 @@ let concat_map f l =
275275
in aux f [] l
276276

277277
let fold_left_map f accu l =
278-
let rec aux accu l_accu = function
278+
let rec aux f accu l_accu = function
279279
| [] -> accu, rev l_accu
280280
| x :: l ->
281281
let accu, x = f accu x in
282-
aux accu (x :: l_accu) l in
283-
aux accu [] l
282+
aux f accu (x :: l_accu) l in
283+
aux f accu [] l
284284

285285
let partition p l =
286-
let rec part yes no = function
286+
let rec part p yes no = function
287287
| [] -> (rev yes, rev no)
288-
| x :: l -> if p x then part (x :: yes) no l else part yes (x :: no) l in
289-
part [] [] l
288+
| x :: l -> if p x then part p (x :: yes) no l else part p yes (x :: no) l in
289+
part p [] [] l
290290

291291
let partition_map p l =
292-
let rec part left right = function
292+
let rec part p left right = function
293293
| [] -> (rev left, rev right)
294294
| x :: l ->
295295
begin match p x with
296-
| Either.Left v -> part (v :: left) right l
297-
| Either.Right v -> part left (v :: right) l
296+
| Either.Left v -> part p (v :: left) right l
297+
| Either.Right v -> part p left (v :: right) l
298298
end
299299
in
300-
part [] [] l
300+
part p [] [] l
301301

302302
let rec split = function
303303
[] -> ([], [])
@@ -323,23 +323,23 @@ let rec merge cmp l1 l2 =
323323

324324

325325
let stable_sort cmp l =
326-
let rec rev_merge l1 l2 accu =
326+
let rec rev_merge cmp l1 l2 accu =
327327
match l1, l2 with
328328
| [], l2 -> rev_append l2 accu
329329
| l1, [] -> rev_append l1 accu
330330
| h1::t1, h2::t2 ->
331331
if cmp h1 h2 <= 0
332-
then rev_merge t1 l2 (h1::accu)
333-
else rev_merge l1 t2 (h2::accu)
332+
then rev_merge cmp t1 l2 (h1::accu)
333+
else rev_merge cmp l1 t2 (h2::accu)
334334
in
335-
let rec rev_merge_rev l1 l2 accu =
335+
let rec rev_merge_rev cmp l1 l2 accu =
336336
match l1, l2 with
337337
| [], l2 -> rev_append l2 accu
338338
| l1, [] -> rev_append l1 accu
339339
| h1::t1, h2::t2 ->
340340
if cmp h1 h2 > 0
341-
then rev_merge_rev t1 l2 (h1::accu)
342-
else rev_merge_rev l1 t2 (h2::accu)
341+
then rev_merge_rev cmp t1 l2 (h1::accu)
342+
else rev_merge_rev cmp l1 t2 (h2::accu)
343343
in
344344
let rec sort n l =
345345
match n, l with
@@ -362,7 +362,7 @@ let stable_sort cmp l =
362362
let n2 = n - n1 in
363363
let s1, l2 = rev_sort n1 l in
364364
let s2, tl = rev_sort n2 l2 in
365-
(rev_merge_rev s1 s2 [], tl)
365+
(rev_merge_rev cmp s1 s2 [], tl)
366366
and rev_sort n l =
367367
match n, l with
368368
| 2, x1 :: x2 :: tl ->
@@ -384,7 +384,7 @@ let stable_sort cmp l =
384384
let n2 = n - n1 in
385385
let s1, l2 = sort n1 l in
386386
let s2, tl = sort n2 l2 in
387-
(rev_merge s1 s2 [], tl)
387+
(rev_merge cmp s1 s2 [], tl)
388388
in
389389
let len = length l in
390390
if len < 2 then l else fst (sort len l)
@@ -429,27 +429,27 @@ let stable_sort cmp l =
429429
(** sorting + removing duplicates *)
430430

431431
let sort_uniq cmp l =
432-
let rec rev_merge l1 l2 accu =
432+
let rec rev_merge cmp l1 l2 accu =
433433
match l1, l2 with
434434
| [], l2 -> rev_append l2 accu
435435
| l1, [] -> rev_append l1 accu
436436
| h1::t1, h2::t2 ->
437437
let c = cmp h1 h2 in
438-
if c = 0 then rev_merge t1 t2 (h1::accu)
438+
if c = 0 then rev_merge cmp t1 t2 (h1::accu)
439439
else if c < 0
440-
then rev_merge t1 l2 (h1::accu)
441-
else rev_merge l1 t2 (h2::accu)
440+
then rev_merge cmp t1 l2 (h1::accu)
441+
else rev_merge cmp l1 t2 (h2::accu)
442442
in
443-
let rec rev_merge_rev l1 l2 accu =
443+
let rec rev_merge_rev cmp l1 l2 accu =
444444
match l1, l2 with
445445
| [], l2 -> rev_append l2 accu
446446
| l1, [] -> rev_append l1 accu
447447
| h1::t1, h2::t2 ->
448448
let c = cmp h1 h2 in
449-
if c = 0 then rev_merge_rev t1 t2 (h1::accu)
449+
if c = 0 then rev_merge_rev cmp t1 t2 (h1::accu)
450450
else if c > 0
451-
then rev_merge_rev t1 l2 (h1::accu)
452-
else rev_merge_rev l1 t2 (h2::accu)
451+
then rev_merge_rev cmp t1 l2 (h1::accu)
452+
else rev_merge_rev cmp l1 t2 (h2::accu)
453453
in
454454
let rec sort n l =
455455
match n, l with
@@ -490,7 +490,7 @@ let sort_uniq cmp l =
490490
let n2 = n - n1 in
491491
let s1, l2 = rev_sort n1 l in
492492
let s2, tl = rev_sort n2 l2 in
493-
(rev_merge_rev s1 s2 [], tl)
493+
(rev_merge_rev cmp s1 s2 [], tl)
494494
and rev_sort n l =
495495
match n, l with
496496
| 2, x1 :: x2 :: tl ->
@@ -530,7 +530,7 @@ let sort_uniq cmp l =
530530
let n2 = n - n1 in
531531
let s1, l2 = sort n1 l in
532532
let s2, tl = sort n2 l2 in
533-
(rev_merge s1 s2 [], tl)
533+
(rev_merge cmp s1 s2 [], tl)
534534
in
535535
let len = length l in
536536
if len < 2 then l else fst (sort len l)

0 commit comments

Comments
 (0)