Sha256: 72a2dc63e4efa7e884bedbfc814e4625655e2e70dd533efa9b38996498444a86

Contents?: true

Size: 1.22 KB

Versions: 3

Compression:

Stored size: 1.22 KB

Contents

require 'set'

# Override #== to fix behavior where it seems to ignore overrides of Object#== or Object#eql? when comparing set elements.
# Note that we can't put these definitions inside a helper module, as we do for other methods, and include in the reopened
# Hash class. If we do this, the method is not used!
class Set
  def == set
    equal?(set) and return true
    set.is_a?(Set) && size == set.size or return false
    ary = to_a
    set.all? { |o| ary.include?(o) }
  end

  alias :eql? :==

  def union_using_eql_comparison other
    first = dup
    second = other.dup
    first.size > second.size ? do_union(first, second) : do_union(second, first)
  end

  def intersection_using_eql_comparison other
    first = dup
    second = other.dup
    first.size > second.size ? do_intersection(first, second) : do_intersection(second, first)
  end

  private

  def do_union larger, smaller
    smaller.each do |x| 
     larger.add(x) unless contained_in(larger, x)
    end
    larger
  end

  def do_intersection larger, smaller
    result = Set.new
    smaller.each do |x| 
     result.add(x) if contained_in(larger, x)
    end
    result
  end

  def contained_in set, element
    set.each {|x| return true if element == x}
    false
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
aquarium-0.1.0 lib/aquarium/extensions/set.rb
aquarium-0.1.5 lib/aquarium/extensions/set.rb
aquarium-0.1.6 lib/aquarium/extensions/set.rb