diff options
author | Louis Pilfold <louis@lpil.uk> | 2019-12-11 07:52:17 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2020-05-26 19:19:29 +0100 |
commit | 21e774dea2d678b90d5eb872eb9f0d9924c818ab (patch) | |
tree | cab555f594929e7a1f06a9b7c6f2a74cd1017840 /src | |
parent | 9557ad2019f73eac4090afd30c3bbd80787097de (diff) | |
download | gleam_stdlib-21e774dea2d678b90d5eb872eb9f0d9924c818ab.tar.gz gleam_stdlib-21e774dea2d678b90d5eb872eb9f0d9924c818ab.zip |
take
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam/iterator.gleam | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/gleam/iterator.gleam b/src/gleam/iterator.gleam index 53b80d3..6634f23 100644 --- a/src/gleam/iterator.gleam +++ b/src/gleam/iterator.gleam @@ -63,7 +63,6 @@ pub fn repeat(x: element) -> Iterator(element) { repeatedly(fn() { x }) } -// TODO: test // TODO: document pub fn from_list(list: List(element)) -> Iterator(element) { unfold(list, fn(acc) { @@ -96,7 +95,6 @@ pub fn run(iterator) -> Nil { fold(iterator, Nil, fn(_, acc) { acc }) } -// TODO: test // TODO: document pub fn to_list(iterator: Iterator(element)) -> List(element) { iterator @@ -104,6 +102,24 @@ pub fn to_list(iterator: Iterator(element)) -> List(element) { |> list.reverse } +fn do_take(iterator, desired, acc) { + case desired > 0 { + True -> case iterator() { + Continue(element, iterator) -> do_take(iterator, desired - 1, [element | acc]) + Stop -> acc + } + False -> acc + } +} + +// TODO: document +pub fn take(from iterator: Iterator(e), up_to desired: Int) -> List(e) { + iterator + |> unopaque + |> do_take(_, desired, []) + |> list.reverse +} + // Transforming Iterators fn do_map(iterator, f) { |