diff options
-rw-r--r-- | CHANGELOG.md | 4 | ||||
-rw-r--r-- | src/gleam/set.gleam | 17 | ||||
-rw-r--r-- | test/gleam/set_test.gleam | 7 |
3 files changed, 28 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 713fa2b..22c3766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- The `set` module gains the `difference` function. + ## v0.34.0 - 2023-12-17 - The `int.random` function now takes a single argument. diff --git a/src/gleam/set.gleam b/src/gleam/set.gleam index 9ffaccd..406d501 100644 --- a/src/gleam/set.gleam +++ b/src/gleam/set.gleam @@ -260,3 +260,20 @@ pub fn intersection( let #(larger, smaller) = order(first, second) take(from: larger, keeping: to_list(smaller)) } + +/// Creates a new set that contains members that are present in the first set +/// but not the second. +/// +/// ## Examples +/// +/// ```gleam +/// > difference(from_list([1, 2]), from_list([2, 3, 4])) |> to_list +/// [1] +/// ``` +/// +pub fn difference( + from first: Set(member), + minus second: Set(member), +) -> Set(member) { + drop(from: first, drop: to_list(second)) +} diff --git a/test/gleam/set_test.gleam b/test/gleam/set_test.gleam index 85eaf4b..06af5dc 100644 --- a/test/gleam/set_test.gleam +++ b/test/gleam/set_test.gleam @@ -63,6 +63,7 @@ pub fn fold_test() { [1, 3, 9] |> set.from_list |> set.fold(from: 0, with: fn(m, a) { m + a }) + |> should.equal(13) } pub fn filter_test() { @@ -100,3 +101,9 @@ pub fn intersection_test() { |> set.to_list |> should.equal([2]) } + +pub fn difference_test() { + set.difference(set.from_list([1, 2]), set.from_list([2, 3, 4])) + |> set.to_list + |> should.equal([1]) +} |