aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorinoas <mail@inoas.com>2022-10-27 01:56:47 +0200
committerLouis Pilfold <louis@lpil.uk>2022-10-27 15:33:11 +0100
commit4b75aba3006f752fbaa1f810d703379e776be1dd (patch)
treefb97bf228f3959d174565f174a24d3a5d27d481d
parent5cc1fafd7793af9e55c4f66ac57afbf010771a4e (diff)
downloadgleam_stdlib-4b75aba3006f752fbaa1f810d703379e776be1dd.tar.gz
gleam_stdlib-4b75aba3006f752fbaa1f810d703379e776be1dd.zip
imprive list.flatten speed in most cases
-rw-r--r--src/gleam/list.gleam15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index b4c24c3..ddb062a 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -530,17 +530,24 @@ pub fn prepend(to list: List(a), item: a) -> List(a) {
[item, ..list]
}
+fn prepend_list_reverse(list prefix: List(a), to suffix: List(a)) -> List(a) {
+ case prefix {
+ [] -> suffix
+ [head, ..tail] -> prepend_list_reverse(tail, [head, ..suffix])
+ }
+}
+
fn do_flatten(lists: List(List(a)), acc: List(a)) -> List(a) {
case lists {
- [] -> acc
- [l, ..rest] -> do_flatten(rest, append(acc, l))
+ [] -> reverse(acc)
+ [a_list, ..rest_lists] ->
+ do_flatten(rest_lists, prepend_list_reverse(a_list, acc))
}
}
/// Flattens a list of lists into a single list.
///
-/// This function runs in linear time, and it traverses and copies all the
-/// inner lists.
+/// This function traverses all elements twice.
///
/// ## Examples
///