aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Puc <marcin.e.puc@gmail.com>2021-03-15 12:34:01 +0100
committerLouis Pilfold <louis@lpil.uk>2021-03-25 14:15:13 +0000
commit374e2d9f4a5c89d3da9d23de3e742c5bc1d47f71 (patch)
tree980799eab1b59c388a0c1cf97025d6a61223a6ff
parent6d01c3691b86073de8e2b651458545071a5faf54 (diff)
downloadgleam_stdlib-374e2d9f4a5c89d3da9d23de3e742c5bc1d47f71.tar.gz
gleam_stdlib-374e2d9f4a5c89d3da9d23de3e742c5bc1d47f71.zip
Add iterator.intersperse
-rw-r--r--src/gleam/iterator.gleam40
-rw-r--r--test/gleam/iterator_test.gleam17
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])
+}