aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcin Puc <marcin.e.puc@gmail.com>2021-03-23 19:11:20 +0100
committerLouis Pilfold <louis@lpil.uk>2021-03-23 20:15:33 +0000
commit6d01c3691b86073de8e2b651458545071a5faf54 (patch)
tree01d45ee1e02bedb8293538f167bd8e7996bee5d7 /src
parent3c16601d920335dc57d266e6f8392f2058fba70a (diff)
downloadgleam_stdlib-6d01c3691b86073de8e2b651458545071a5faf54.tar.gz
gleam_stdlib-6d01c3691b86073de8e2b651458545071a5faf54.zip
Make list.intersperse tail-recursive
Diffstat (limited to 'src')
-rw-r--r--src/gleam/list.gleam9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index 422f26b..f2f3e5f 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -748,6 +748,13 @@ pub fn unzip(input: List(tuple(a, b))) -> tuple(List(a), List(b)) {
do_unzip(input, [], [])
}
+fn do_intersperse(list: List(a), separator: a, acc: List(a)) -> List(a) {
+ case list {
+ [] -> reverse(acc)
+ [x, ..rest] -> do_intersperse(rest, separator, [x, separator, ..acc])
+ }
+}
+
/// Inserts a given value between each existing element in a given list.
///
/// This function runs in linear time and copies the list.
@@ -763,7 +770,7 @@ pub fn unzip(input: List(tuple(a, b))) -> tuple(List(a), List(b)) {
pub fn intersperse(list: List(a), with elem: a) -> List(a) {
case list {
[] | [_] -> list
- [x, ..rest] -> [x, elem, ..intersperse(rest, elem)]
+ [x, ..rest] -> do_intersperse(rest, elem, [x])
}
}