aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/gleam/set.gleam27
-rw-r--r--test/gleam/set_test.gleam12
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)
+}