require 'finite-set' require 'delegate' require 'thread' class AbstractSet def self.phi Set.phi end def member?(obj) raise NotImplementError.new("need to define `member?'") end def include?(obj) member?(obj) end alias === include? alias has? include? alias contains? include? def union(other) Union.new(Set[self, other]) end alias | union alias cup union def intersection(other) Intersection.new(Set[self, other]) end alias & intersection alias cap intersection def difference(other) Difference.new(self, other) end alias - difference def complement Complement.new(self) end ## def self.strip_adapter(obj) while obj.is_a? Adapter obj = obj.__getobj__ end obj end public class Composite < AbstractSet end class Union < Composite attr_reader :sets class <b}) @enum = enum @compare_proc = compare_proc end def member?(obj) @enum.each{|item| if @compare_proc.call(obj, item) < 0 break elsif item == obj return true end } false end def each(&block) @enum.each(&block) end end end if __FILE__ == $0 class <b.size}) p !a.member?('123') end