diff options
author | Marcin Puc <marcin.e.puc@gmail.com> | 2021-03-07 21:46:10 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-03-08 22:22:28 +0000 |
commit | e5797a892d191ba3c04cb6b20cc63fa6d1c2d278 (patch) | |
tree | 5671a13c28a6cf5765ef58fa6db3369693487094 /src | |
parent | 3464cbb286b4f17cbfd4239aa5ddcfd1bf6a871c (diff) | |
download | gleam_stdlib-e5797a892d191ba3c04cb6b20cc63fa6d1c2d278.tar.gz gleam_stdlib-e5797a892d191ba3c04cb6b20cc63fa6d1c2d278.zip |
Make list.take_while tail recursive
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam/list.gleam | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam index 570769d..e49334b 100644 --- a/src/gleam/list.gleam +++ b/src/gleam/list.gleam @@ -1241,6 +1241,21 @@ pub fn drop_while( } } +fn do_take_while( + list: List(a), + predicate: fn(a) -> Bool, + acc: List(a), +) -> List(a) { + case list { + [] -> acc + [head, ..tail] -> + case predicate(head) { + True -> do_take_while(tail, predicate, [head, ..acc]) + False -> acc + } + } +} + /// Takes the first elements in a given list for which the predicate funtion returns `True`. /// /// ## Examples @@ -1252,12 +1267,6 @@ pub fn take_while( in list: List(a), satisfying predicate: fn(a) -> Bool, ) -> List(a) { - case list { - [] -> [] - [x, ..xs] -> - case predicate(x) { - True -> [x, ..take_while(xs, predicate)] - False -> [] - } - } + do_take_while(list, predicate, []) + |> reverse } |