diff options
author | Marcin Puc <marcin.e.puc@gmail.com> | 2021-03-15 12:34:01 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-03-25 14:15:13 +0000 |
commit | 374e2d9f4a5c89d3da9d23de3e742c5bc1d47f71 (patch) | |
tree | 980799eab1b59c388a0c1cf97025d6a61223a6ff | |
parent | 6d01c3691b86073de8e2b651458545071a5faf54 (diff) | |
download | gleam_stdlib-374e2d9f4a5c89d3da9d23de3e742c5bc1d47f71.tar.gz gleam_stdlib-374e2d9f4a5c89d3da9d23de3e742c5bc1d47f71.zip |
Add iterator.intersperse
-rw-r--r-- | src/gleam/iterator.gleam | 40 | ||||
-rw-r--r-- | test/gleam/iterator_test.gleam | 17 |
2 files changed, 57 insertions, 0 deletions
diff --git a/src/gleam/iterator.gleam b/src/gleam/iterator.gleam index d0cc757..7e767db 100644 --- a/src/gleam/iterator.gleam +++ b/src/gleam/iterator.gleam @@ -767,3 +767,43 @@ pub fn sized_chunk( |> do_sized_chunk(count) |> Iterator } + +fn do_intersperse( + continuation: fn() -> Action(element), + separator: element, +) -> Action(element) { + case continuation() { + Stop -> Stop + Continue(e, next) -> { + let next_interspersed = fn() { do_intersperse(next, separator) } + Continue(separator, fn() { Continue(e, next_interspersed) }) + } + } +} + +/// Creates an iterator that yields the given element +/// between elements emitted by the underlying iterator. +/// +/// ## Examples +/// +/// > from_list([]) |> intersperse(with: 0) |> to_list +/// [] +/// +/// > from_list([1]) |> intersperse(with: 0) |> to_list +/// [1] +/// +/// > from_list([1, 2, 3, 4, 5]) |> intersperse(with: 0) |> to_list +/// [1, 0, 2, 0, 3, 0, 4, 0, 5] +/// +pub fn intersperse( + over iterator: Iterator(element), + with elem: element, +) -> Iterator(element) { + fn() { + case iterator.continuation() { + Stop -> Stop + Continue(e, next) -> Continue(e, fn() { do_intersperse(next, elem) }) + } + } + |> Iterator +} diff --git a/test/gleam/iterator_test.gleam b/test/gleam/iterator_test.gleam index 0c85ede..fbb36fa 100644 --- a/test/gleam/iterator_test.gleam +++ b/test/gleam/iterator_test.gleam @@ -317,3 +317,20 @@ pub fn sized_chunk_test() { |> iterator.to_list |> should.equal([[1, 2, 3], [4, 5, 6], [7, 8]]) } + +pub fn intersperse_test() { + iterator.from_list([]) + |> iterator.intersperse(with: 0) + |> iterator.to_list + |> should.equal([]) + + iterator.from_list([1]) + |> iterator.intersperse(with: 0) + |> iterator.to_list + |> should.equal([1]) + + iterator.from_list([1, 2, 3, 4, 5]) + |> iterator.intersperse(with: 0) + |> iterator.to_list + |> should.equal([1, 0, 2, 0, 3, 0, 4, 0, 5]) +} |