From 1804c3368cf4a94791fafa9701f79a2e6f76d5d8 Mon Sep 17 00:00:00 2001
From: Marc-Andre Lafortune
Date: Thu, 1 Oct 2020 23:55:46 -0400
Subject: [ruby/set] Add `Set#<=>`
https://github.com/ruby/set/commit/447974a374
---
lib/set.rb | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
(limited to 'lib/set.rb')
diff --git a/lib/set.rb b/lib/set.rb
index cb07037..625046d 100644
--- a/lib/set.rb
+++ b/lib/set.rb
@@ -45,9 +45,9 @@
# == Comparison
#
# The comparison operators <, >, <=, and >= are implemented as
-# shorthand for the {proper_,}{subset?,superset?} methods. However,
-# the <=> operator is intentionally left out because not every pair of
-# sets is comparable ({x, y} vs. {x, z} for example).
+# shorthand for the {proper_,}{subset?,superset?} methods.
+# The <=> operator reflects this order, or return `nil` for
+# sets that both have distinct elements ({x, y} vs. {x, z} for example).
#
# == Example
#
@@ -302,6 +302,19 @@ class Set
end
alias < proper_subset?
+ # Returns 0 if the set are equal,
+ # -1 / +1 if the set is a proper subset / superset of the given set,
+ # or nil if they both have unique elements.
+ def <=>(set)
+ return unless set.is_a?(Set)
+
+ case size <=> set.size
+ when -1 then -1 if proper_subset?(set)
+ when +1 then +1 if proper_superset?(set)
+ else 0 if self.==(set)
+ end
+ end
+
# Returns true if the set and the given set have at least one
# element in common.
#
--
cgit v1.1