diff options
| author | Misty De Meo | 2012-10-02 13:21:00 -0500 |
|---|---|---|
| committer | Misty De Meo | 2012-10-15 09:46:29 -0500 |
| commit | bbfb6400c77aeaaf88216263d86491d85a40f8a9 (patch) | |
| tree | 2d07e2d07653ed7d3010b2a0ca6b8019adf7a3e1 /Library/Homebrew/extend | |
| parent | 3fb5dfbd7b77e03ccd9b8aee54c198673a9cb054 (diff) | |
| download | brew-bbfb6400c77aeaaf88216263d86491d85a40f8a9.tar.bz2 | |
Manage Requirements using ComparableSet
ComparableSet only allows a single object of a given class,
choosing the object with the greatest value. This was mainly created
for Requirements, so that, e.g., two X11Dependencies of differing
strictness don't both end up in the same requirement set.
Fixes Homebrew/homebrew#15240.
Diffstat (limited to 'Library/Homebrew/extend')
| -rw-r--r-- | Library/Homebrew/extend/set.rb | 24 |
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 |
