From c153d1ab16d19724e47cc5c160b60b45cda195d2 Mon Sep 17 00:00:00 2001 From: Doug Tykocki Date: Thu, 28 Dec 2023 09:54:40 -0500 Subject: [PATCH] Add set difference function --- CHANGELOG.md | 4 ++++ src/gleam/set.gleam | 17 +++++++++++++++++ test/gleam/set_test.gleam | 7 +++++++ 3 files changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 713fa2bb..22c37661 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 9ffaccdc..406d5019 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 85eaf4bf..06af5dc5 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]) +}