aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/extend/set.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/extend/set.rb')
-rw-r--r--Library/Homebrew/extend/set.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/Library/Homebrew/extend/set.rb b/Library/Homebrew/extend/set.rb
new file mode 100644
index 000000000..b45b85de9
--- /dev/null
+++ b/Library/Homebrew/extend/set.rb
@@ -0,0 +1,24 @@
+require 'set'
+
+class ComparableSet < Set
+ def add new
+ # smileys only
+ return super new unless new.respond_to? :>
+
+ objs = find_all { |o| o.class == new.class }
+ objs.each do |o|
+ return self if o > new
+ delete o
+ end
+ super new
+ end
+
+ alias_method :<<, :add
+
+ # Set#merge bypasses enumerating the set's contents,
+ # so the subclassed #add would never be called
+ def merge enum
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ enum.each { |o| add(o) }
+ end
+end