diff --git a/README.md b/README.md index fba04d7fb..8d9818e51 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,6 @@ These methods are not implemented yet. + taint + untaint + to_set -+ classify + divide ## License diff --git a/mrblib/mrb_set.rb b/mrblib/mrb_set.rb index 2b0d751c6..0b45e9a2f 100644 --- a/mrblib/mrb_set.rb +++ b/mrblib/mrb_set.rb @@ -284,8 +284,17 @@ class Set @hash.eql?(o.instance_variable_get(:@hash)) end - # def classify - # end + def classify + return to_enum :classify unless block_given? + h = {} + + each { |i| + x = yield(i) + (h[x] ||= self.class.new).add(i) + } + + h + end # def divide # end diff --git a/test/mrb_set.rb b/test/mrb_set.rb index 0751d08d7..0234b7692 100644 --- a/test/mrb_set.rb +++ b/test/mrb_set.rb @@ -549,9 +549,18 @@ assert("Set#==") do assert_equal(set1.clone, set1) end -#assert("Set#classify") do -#end -# +assert("Set#classify") do + set = Set.new(1..10) + ret = set.classify { |i| i % 3 } + + assert_equal(3, ret.size) + assert_equal(Hash, ret.class) + ret.each_value { |v| assert_equal(Set, v.class) } + assert_equal(Set[3,6,9], ret[0]) + assert_equal(Set[1,4,7,10], ret[1]) + assert_equal(Set[2,5,8], ret[2]) +end + #assert("Set#divide") do #end