diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | src/gleam/set.gleam | 27 | ||||
-rw-r--r-- | test/gleam/set_test.gleam | 12 |
3 files changed, 40 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index f1d1fef..4a50496 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - The `list.concat` function has been deprecated in favour of `list.flatten`. - The handling of float exponentials and signs in the `float.to_string` and `string.inspect` functions have been improved on JavaScript. +- The `set` module gains the `each` function. ## v0.40.0 - 2024-08-19 diff --git a/src/gleam/set.gleam b/src/gleam/set.gleam index 5dfc749..a5e3918 100644 --- a/src/gleam/set.gleam +++ b/src/gleam/set.gleam @@ -380,3 +380,30 @@ pub fn symmetric_difference( minus: intersection(of: first, and: second), ) } + +/// Calls a function for each member in a set, discarding the return +/// value. +/// +/// Useful for producing a side effect for every item of a set. +/// +/// ```gleam +/// import gleam/io +/// +/// let set = from_list(["apple", "banana", "cherry"]) +/// +/// each(set, io.println) +/// // -> Nil +/// // apple +/// // banana +/// // cherry +/// ``` +/// +/// The order of elements in the iteration is an implementation detail that +/// should not be relied upon. +/// +pub fn each(set: Set(member), fun: fn(member) -> a) -> Nil { + fold(set, Nil, fn(nil, member) { + fun(member) + nil + }) +} diff --git a/test/gleam/set_test.gleam b/test/gleam/set_test.gleam index 597fab1..eaa55b3 100644 --- a/test/gleam/set_test.gleam +++ b/test/gleam/set_test.gleam @@ -158,3 +158,15 @@ pub fn symmetric_difference_test() { set.symmetric_difference(set.from_list([1, 2, 3]), set.from_list([3, 4])) |> should.equal(set.from_list([1, 2, 4])) } + +pub fn each_test() { + [1, 2, 3] + |> set.from_list + |> set.each(fn(member) { + let assert True = case member { + 1 | 2 | 3 -> True + _ -> False + } + }) + |> should.equal(Nil) +} |