aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuci Phillips <104490260+scorpi4n@users.noreply.github.com>2024-05-17 19:55:15 -0500
committerLouis Pilfold <louis@lpil.uk>2024-05-21 13:58:25 +0100
commit96b2eb1b00d38c6bd6d0d4c1fc01f35573f1b167 (patch)
tree7083672935679f5eb62732ea38b38c5aee2c594a
parent0faee2f58d41be64a0fb54a2c728656d59b52370 (diff)
downloadgleam_stdlib-96b2eb1b00d38c6bd6d0d4c1fc01f35573f1b167.tar.gz
gleam_stdlib-96b2eb1b00d38c6bd6d0d4c1fc01f35573f1b167.zip
Test and implement set.symmetric_difference
-rw-r--r--src/gleam/set.gleam18
-rw-r--r--test/gleam/set_test.gleam5
2 files changed, 23 insertions, 0 deletions
diff --git a/src/gleam/set.gleam b/src/gleam/set.gleam
index c04ca92..7fb8a41 100644
--- a/src/gleam/set.gleam
+++ b/src/gleam/set.gleam
@@ -325,3 +325,21 @@ pub fn is_subset(first: Set(member), of second: Set(member)) -> Bool {
pub fn is_disjoint(first: Set(member), from second: Set(member)) -> Bool {
intersection(of: first, and: second) == new()
}
+
+/// Creates a new set that contains members that are present in either set, but
+/// not both.
+///
+/// ```gleam
+/// symmetric_difference(from_list([1, 2, 4]), from_list([3, 4])) |> to_list
+/// // -> [1, 2, 4]
+/// ```
+///
+pub fn symmetric_difference(
+ of first: Set(member),
+ and second: Set(member),
+) -> Set(member) {
+ difference(
+ from: union(of: first, and: second),
+ minus: intersection(of: first, and: second),
+ )
+}
diff --git a/test/gleam/set_test.gleam b/test/gleam/set_test.gleam
index f763c5d..94dd5da 100644
--- a/test/gleam/set_test.gleam
+++ b/test/gleam/set_test.gleam
@@ -129,3 +129,8 @@ pub fn is_disjoint_test() {
set.is_disjoint(set.from_list([1, 2]), set.from_list([2, 3, 4]))
|> should.be_false()
}
+
+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]))
+}