File tree Expand file tree Collapse file tree 12 files changed +22436
-22028
lines changed
Expand file tree Collapse file tree 12 files changed +22436
-22028
lines changed Original file line number Diff line number Diff line change @@ -1286,8 +1286,10 @@ let init n f =
12861286
12871287let rec rev_append l1 l2 =
12881288 match l1 with
1289- [] -> l2
1290- | a :: l -> rev_append l (a :: l2)
1289+ | [] -> l2
1290+ | [a0] -> a0::l2 (* single element is common *)
1291+ | [a0 ; a1] -> a1 :: a0 :: l2
1292+ | a0::a1::a2::rest -> rev_append rest (a2::a1::a0::l2)
12911293
12921294let rev l = rev_append l []
12931295
@@ -1364,7 +1366,16 @@ let rec rev_map_append l1 l2 f =
13641366let rec flat_map_aux f acc append lx =
13651367 match lx with
13661368 | [] -> rev_append acc append
1367- | a0::rest -> flat_map_aux f (rev_append (f a0) acc ) append rest
1369+ | a0::rest ->
1370+ let new_acc =
1371+ match f a0 with
1372+ | [] -> acc
1373+ | [a0] -> a0::acc
1374+ | [a0;a1] -> a1::a0::acc
1375+ | a0::a1::a2::rest ->
1376+ rev_append rest (a2::a1::a0::acc)
1377+ in
1378+ flat_map_aux f new_acc append rest
13681379
13691380let flat_map lx f =
13701381 flat_map_aux f [] [] lx
Original file line number Diff line number Diff line change @@ -1278,8 +1278,10 @@ let init n f =
12781278
12791279let rec rev_append l1 l2 =
12801280 match l1 with
1281- [] -> l2
1282- | a :: l -> rev_append l (a :: l2)
1281+ | [] -> l2
1282+ | [a0] -> a0::l2 (* single element is common *)
1283+ | [a0 ; a1] -> a1 :: a0 :: l2
1284+ | a0 ::a1 ::a2 ::rest -> rev_append rest (a2::a1::a0::l2)
12831285
12841286let rev l = rev_append l []
12851287
@@ -1356,7 +1358,16 @@ let rec rev_map_append l1 l2 f =
13561358let rec flat_map_aux f acc append lx =
13571359 match lx with
13581360 | [] -> rev_append acc append
1359- | a0 ::rest -> flat_map_aux f (rev_append (f a0) acc ) append rest
1361+ | a0 ::rest ->
1362+ let new_acc =
1363+ match f a0 with
1364+ | [] -> acc
1365+ | [a0] -> a0::acc
1366+ | [a0;a1] -> a1::a0::acc
1367+ | a0 ::a1 ::a2 ::rest ->
1368+ rev_append rest (a2::a1::a0::acc)
1369+ in
1370+ flat_map_aux f new_acc append rest
13601371
13611372let flat_map lx f =
13621373 flat_map_aux f [] [] lx
Original file line number Diff line number Diff line change @@ -5963,8 +5963,10 @@ let init n f =
59635963
59645964let rec rev_append l1 l2 =
59655965 match l1 with
5966- [] -> l2
5967- | a :: l -> rev_append l (a :: l2)
5966+ | [] -> l2
5967+ | [a0] -> a0::l2 (* single element is common *)
5968+ | [a0 ; a1] -> a1 :: a0 :: l2
5969+ | a0::a1::a2::rest -> rev_append rest (a2::a1::a0::l2)
59685970
59695971let rev l = rev_append l []
59705972
@@ -6041,7 +6043,16 @@ let rec rev_map_append l1 l2 f =
60416043let rec flat_map_aux f acc append lx =
60426044 match lx with
60436045 | [] -> rev_append acc append
6044- | a0::rest -> flat_map_aux f (rev_append (f a0) acc ) append rest
6046+ | a0::rest ->
6047+ let new_acc =
6048+ match f a0 with
6049+ | [] -> acc
6050+ | [a0] -> a0::acc
6051+ | [a0;a1] -> a1::a0::acc
6052+ | a0::a1::a2::rest ->
6053+ rev_append rest (a2::a1::a0::acc)
6054+ in
6055+ flat_map_aux f new_acc append rest
60456056
60466057let flat_map lx f =
60476058 flat_map_aux f [] [] lx
Original file line number Diff line number Diff line change @@ -1286,8 +1286,10 @@ let init n f =
12861286
12871287let rec rev_append l1 l2 =
12881288 match l1 with
1289- [] -> l2
1290- | a :: l -> rev_append l (a :: l2)
1289+ | [] -> l2
1290+ | [a0] -> a0::l2 (* single element is common *)
1291+ | [a0 ; a1] -> a1 :: a0 :: l2
1292+ | a0::a1::a2::rest -> rev_append rest (a2::a1::a0::l2)
12911293
12921294let rev l = rev_append l []
12931295
@@ -1364,7 +1366,16 @@ let rec rev_map_append l1 l2 f =
13641366let rec flat_map_aux f acc append lx =
13651367 match lx with
13661368 | [] -> rev_append acc append
1367- | a0::rest -> flat_map_aux f (rev_append (f a0) acc ) append rest
1369+ | a0::rest ->
1370+ let new_acc =
1371+ match f a0 with
1372+ | [] -> acc
1373+ | [a0] -> a0::acc
1374+ | [a0;a1] -> a1::a0::acc
1375+ | a0::a1::a2::rest ->
1376+ rev_append rest (a2::a1::a0::acc)
1377+ in
1378+ flat_map_aux f new_acc append rest
13681379
13691380let flat_map lx f =
13701381 flat_map_aux f [] [] lx
Original file line number Diff line number Diff line change @@ -9253,8 +9253,10 @@ let init n f =
92539253
92549254let rec rev_append l1 l2 =
92559255 match l1 with
9256- [] -> l2
9257- | a :: l -> rev_append l (a :: l2)
9256+ | [] -> l2
9257+ | [a0] -> a0::l2 (* single element is common *)
9258+ | [a0 ; a1] -> a1 :: a0 :: l2
9259+ | a0::a1::a2::rest -> rev_append rest (a2::a1::a0::l2)
92589260
92599261let rev l = rev_append l []
92609262
@@ -9331,7 +9333,16 @@ let rec rev_map_append l1 l2 f =
93319333let rec flat_map_aux f acc append lx =
93329334 match lx with
93339335 | [] -> rev_append acc append
9334- | a0::rest -> flat_map_aux f (rev_append (f a0) acc ) append rest
9336+ | a0::rest ->
9337+ let new_acc =
9338+ match f a0 with
9339+ | [] -> acc
9340+ | [a0] -> a0::acc
9341+ | [a0;a1] -> a1::a0::acc
9342+ | a0::a1::a2::rest ->
9343+ rev_append rest (a2::a1::a0::acc)
9344+ in
9345+ flat_map_aux f new_acc append rest
93359346
93369347let flat_map lx f =
93379348 flat_map_aux f [] [] lx
You can’t perform that action at this time.
0 commit comments