class MySet(*set) { method init { var elems = set set = Hash() elems.each { |e| self += e } } method +(elem) { set{elem} = elem self } method del(elem) { set.delete(elem) } method has(elem) { set.has_key(elem) } method ∪(MySet that) { MySet(set.values..., that.values...) } method ∩(MySet that) { MySet(set.keys.grep{ |k| k ∈ that } \ .map { |k| set{k} }...) } method ∖(MySet that) { MySet(set.keys.grep{|k| !(k ∈ that) } \ .map {|k| set{k} }...) } method ^(MySet that) { var d = ((self ∖ that) ∪ (that ∖ self)) MySet(d.values...) } method count { set.len } method ≡(MySet that) { (self ∖ that -> count.is_zero) && (that ∖ self -> count.is_zero) } method values { set.values } method ⊆(MySet that) { that.set.keys.each { |k| k ∈ self || return false } return true } method to_s { "Set{" + set.values.map{|e| "#{e}"}.sort.join(', ') + "}" } } class Object { method ∈(MySet set) { set.has(self) } }