diff options
author | Marcin Puc <marcin.e.puc@gmail.com> | 2021-03-23 19:11:20 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-03-23 20:15:33 +0000 |
commit | 6d01c3691b86073de8e2b651458545071a5faf54 (patch) | |
tree | 01d45ee1e02bedb8293538f167bd8e7996bee5d7 /src | |
parent | 3c16601d920335dc57d266e6f8392f2058fba70a (diff) | |
download | gleam_stdlib-6d01c3691b86073de8e2b651458545071a5faf54.tar.gz gleam_stdlib-6d01c3691b86073de8e2b651458545071a5faf54.zip |
Make list.intersperse tail-recursive
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam/list.gleam | 9 |
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]) } } |