diff --git a/README.md b/README.md index 8d9818e51..6b106b4f3 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ These methods are not implemented yet. + taint + untaint + to_set -+ divide ++ divide(Set#divide with 2 arity block is not implemented.) ## License under the MIT License: diff --git a/mrblib/mrb_set.rb b/mrblib/mrb_set.rb index 0b45e9a2f..4db9729ff 100644 --- a/mrblib/mrb_set.rb +++ b/mrblib/mrb_set.rb @@ -296,8 +296,15 @@ class Set h end - # def divide - # end + def divide(&func) + return to_enum :divide unless block_given? + + if func.arity == 2 + raise NotImplementedError, "Set#divide with 2 arity block is not implemented." + end + + Set.new(classify(&func).values) + end def inspect sprintf('#<%s: {%s}>', self.class, to_a.inspect[1..-2]) diff --git a/test/mrb_set.rb b/test/mrb_set.rb index 0234b7692..e632a68c9 100644 --- a/test/mrb_set.rb +++ b/test/mrb_set.rb @@ -561,8 +561,37 @@ assert("Set#classify") do assert_equal(Set[2,5,8], ret[2]) end -#assert("Set#divide") do -#end +assert("Set#divide") do + # arity is 1 + set = Set.new(1..10) + ret = set.divide { |i| i % 3 } + + assert_equal(3, ret.size) + n = 0 + ret.each { |s| n += s.size } + assert_equal(set.size, n) + assert_equal(set, ret.flatten) + + assert_equal(Set, ret.class) + assert_true(ret.include?(Set[3,6,9])) + assert_true(ret.include?(Set[1,4,7,10])) + assert_true(ret.include?(Set[2,5,8])) + + + # arity is 2 + set = Set[7,10,5,11,1,3,4,9,0] + assert_raise(NotImplementedError) { + ret = set.divide { |a, b| (a - b).abs == 1 } + } + + # assert_equal(4, ret.size) + # n = 0 + # ret.each { |s| n += s.size } + # assert_equal(set.size, n) + # assert_equal(set, ret.flatten) + + # assert_equal(Set, ret.class) +end # taint is not implemented yet #assert("taintness") do