From 29964cfdac05d558ae699e890d7224d5d04eadb5 Mon Sep 17 00:00:00 2001 From: ksss Date: Fri, 14 Mar 2014 23:42:04 +0900 Subject: make private method enumerator_block_call --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 176ae661c..02d88a9e5 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -267,8 +267,13 @@ class Enumerator @args = args end return self unless block_given? + enumerator_block_call(&block) + end + + def enumerator_block_call(&block) @obj.__send__ @meth, *@args, &block end + private :enumerator_block_call ## # call-seq: -- cgit v1.2.3 From bc63518fa7fba78531b6ab1fbb42895b1f834423 Mon Sep 17 00:00:00 2001 From: ksss Date: Fri, 14 Mar 2014 23:50:40 +0900 Subject: modify core method that return Enumerator object if not block given --- mrblib/array.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mrblib/array.rb b/mrblib/array.rb index 9141146e5..aa50ac181 100644 --- a/mrblib/array.rb +++ b/mrblib/array.rb @@ -31,6 +31,8 @@ class Array # # ISO 15.2.12.5.11 def each_index(&block) + return to_enum :each_index unless block_given? + idx = 0 while(idx < length) block.call(idx) @@ -46,6 +48,8 @@ class Array # # ISO 15.2.12.5.7 def collect!(&block) + return to_enum :collect! unless block_given? + self.each_index{|idx| self[idx] = block.call(self[idx]) } -- cgit v1.2.3 From 47fc784b567d58c48ad1f018e3b56926acd76725 Mon Sep 17 00:00:00 2001 From: ksss Date: Fri, 14 Mar 2014 23:51:39 +0900 Subject: fix return value for with_index --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 6 +++--- mrbgems/mruby-enumerator/test/enumerator.rb | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 02d88a9e5..8641d99e0 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -156,10 +156,10 @@ class Enumerator return to_enum :with_index, offset unless block_given? raise TypeError, "no implicit conversion of #{offset.class} into Integer" unless offset.respond_to?(:to_int) - n = offset.to_int - each do |i| - yield [i,n] + n = offset.to_int - 1 + enumerator_block_call do |i| n += 1 + yield [i,n] end end diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index c790c1367..bbb22ee6d 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -396,3 +396,12 @@ assert 'modifying existing methods' do assert_equal Enumerator, {a:1}.each.class assert_equal Enumerator, (1..5).each.class end + +assert 'Array#map!' do + a = [1,2,3] + b = a.map! + b.with_index do |i, index| + [i*i, index*index] + end + assert_equal [[1,0],[4,1],[9,4]], a +end -- cgit v1.2.3 From 6b3cc0052d93983cd7cb9ee48a3c4c140046fc2a Mon Sep 17 00:00:00 2001 From: ksss Date: Sat, 15 Mar 2014 00:03:53 +0900 Subject: fix self modifying bug --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 5 +++-- mrbgems/mruby-enumerator/test/enumerator.rb | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 8641d99e0..cf909bac5 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -255,6 +255,7 @@ class Enumerator # enum.each(:y, :z) { |elm| elm } #=> :method_returned # def each *argv, &block + obj = self if 0 < argv.length obj = self.dup args = obj.args @@ -264,9 +265,9 @@ class Enumerator else args = argv.dup end - @args = args + obj.args = args end - return self unless block_given? + return obj unless block_given? enumerator_block_call(&block) end diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index bbb22ee6d..2c85feef3 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -89,6 +89,27 @@ assert 'Enumerator#each' do assert_equal([1], ary) end +assert 'Enumerator#each arguments' do + obj = Object.new + + def obj.each_arg(a, b=:b, *rest) + yield a + yield b + yield rest + :method_returned + end + + enum = obj.to_enum :each_arg, :a, :x + + assert_equal [:a, :x, []], enum.each.to_a + assert_true enum.each.equal?(enum) + assert_equal :method_returned, enum.each { |elm| elm } + + assert_equal [:a, :x, [:y, :z]], enum.each(:y, :z).to_a + assert_false enum.each(:y, :z).equal?(enum) + assert_equal :method_returned, enum.each(:y, :z) { |elm| elm } +end + assert 'Enumerator#next' do e = 3.times 3.times { |i| -- cgit v1.2.3 From 9447c637a558e30d6315fd712f91b349587a8a34 Mon Sep 17 00:00:00 2001 From: ksss Date: Sat, 15 Mar 2014 00:15:33 +0900 Subject: test split and to detail --- mrbgems/mruby-enumerator/test/enumerator.rb | 49 ++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index 2c85feef3..71e70733c 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -400,8 +400,8 @@ assert 'Kernel#to_enum' do assert_raise(ArgumentError){ nil.to_enum } end - assert 'modifying existing methods' do + assert_equal Enumerator, loop.class e = 3.times i = 0 loop_ret = loop { @@ -409,13 +409,28 @@ assert 'modifying existing methods' do i += 1 } assert_nil loop_ret +end - assert_equal Enumerator, loop.class - assert_equal Enumerator, 3.times.class - assert_equal Enumerator, [].each.class - assert_equal Enumerator, [].map.class - assert_equal Enumerator, {a:1}.each.class - assert_equal Enumerator, (1..5).each.class +assert 'Integral#times' do + a = 3 + b = a.times + c = [] + b.with_object(c) do |i, obj| + obj << i + end + assert_equal 3, a + assert_equal Enumerator, b.class + assert_equal [0,1,2], c +end + +assert 'Enumerable#map' do + a = [1,2,3] + b = a.map + c = b.with_index do |i, index| + [i*i, index*index] + end + assert_equal [1,2,3], a + assert_equal [[1,0],[4,1],[9,4]], c end assert 'Array#map!' do @@ -426,3 +441,23 @@ assert 'Array#map!' do end assert_equal [[1,0],[4,1],[9,4]], a end + +assert 'Hash#each' do + a = {a:1,b:2} + b = a.each + c = [] + b.each do |k,v| + c << [k,v] + end + assert_equal [[:a,1], [:b,2]], c.sort +end + +assert 'Range#each' do + a = (1..5) + b = a.each + c = [] + b.each do |i| + c << i + end + assert_equal [1,2,3,4,5], c +end -- cgit v1.2.3 From 0bb7f5e950de68cfcb188fa7df79dc2537ee45c1 Mon Sep 17 00:00:00 2001 From: ksss Date: Sat, 15 Mar 2014 00:45:58 +0900 Subject: fix variable name typo --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 2 +- mrbgems/mruby-enumerator/test/enumerator.rb | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index cf909bac5..7bf354d9c 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -206,7 +206,7 @@ class Enumerator # # => foo:2 # def with_object object - return to_enum :with_object, offset unless block_given? + return to_enum :with_object, object unless block_given? each do |i| yield [i,object] diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index 71e70733c..857615991 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -72,6 +72,21 @@ assert 'Enumerator#with_object' do assert_equal([55, 3628800], ret) end +assert 'Enumerator#with_object arguments' do + to_three = Enumerator.new do |y| + 3.times do |x| + y << x + end + end + + a = [] + to_three_with_string = to_three.with_object("foo") + to_three_with_string.each do |x,string| + a << "#{string}:#{x}" + end + assert_equal ["foo:0","foo:1","foo:2"], a +end + assert 'Enumerator#inspect' do e = (0..10).each assert_equal("#", e.inspect) -- cgit v1.2.3 From 4f8e11ae57e188355870ab14b84b329f1f7cc21f Mon Sep 17 00:00:00 2001 From: ksss Date: Sat, 15 Mar 2014 00:47:12 +0900 Subject: optimize from each to enumerator_block_call --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 7bf354d9c..912683ed9 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -208,7 +208,7 @@ class Enumerator def with_object object return to_enum :with_object, object unless block_given? - each do |i| + enumerator_block_call do |i| yield [i,object] end object -- cgit v1.2.3 From 447764763cd2608cbd47954f98113edd71b5e801 Mon Sep 17 00:00:00 2001 From: ksss Date: Sat, 15 Mar 2014 08:12:48 +0900 Subject: add test for Array#each_index if non block given --- mrbgems/mruby-enumerator/test/enumerator.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index 857615991..4ab857ae8 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -448,6 +448,17 @@ assert 'Enumerable#map' do assert_equal [[1,0],[4,1],[9,4]], c end +assert 'Array#each_index' do + a = [1,2,3] + b = a.each_index + c = [] + b.with_index do |index1,index2| + c << [index1+2,index2+5] + end + assert_equal [1,2,3], a + assert_equal [[2,5],[3,6],[4,7]], c +end + assert 'Array#map!' do a = [1,2,3] b = a.map! -- cgit v1.2.3