From 07d81a113daeb29f154ad50caadf38e4f7d1ee1f Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 19 Mar 2014 15:36:55 +0900 Subject: enum methods to support multiple values; all?, any?, grep, include?, drop, drop_while, take, take_while, each_cons, each_slice, group_by, first, count --- mrbgems/mruby-enum-ext/mrblib/enum.rb | 49 ++++++++++++++++++----------------- mrblib/enum.rb | 27 +++++++++---------- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb index e54e0de2e..4be807640 100644 --- a/mrbgems/mruby-enum-ext/mrblib/enum.rb +++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb @@ -17,7 +17,7 @@ module Enumerable raise ArgumentError, "attempt to drop negative size" if n < 0 ary = [] - self.each {|e| n == 0 ? ary << e : n -= 1 } + self.each {|*val| n == 0 ? ary << val.__svalue : n -= 1 } ary end @@ -34,9 +34,9 @@ module Enumerable def drop_while(&block) ary, state = [], false - self.each do |e| - state = true if !state and !block.call(e) - ary << e if state + self.each do |*val| + state = true if !state and !block.call(*val) + ary << val.__svalue if state end ary end @@ -55,9 +55,9 @@ module Enumerable raise ArgumentError, "attempt to take negative size" if n < 0 ary = [] - self.each do |e| + self.each do |*val| break if ary.size >= n - ary << e + ary << val.__svalue end ary end @@ -75,9 +75,9 @@ module Enumerable def take_while(&block) ary = [] - self.each do |e| - return ary unless block.call(e) - ary << e + self.each do |*val| + return ary unless block.call(*val) + ary << val.__svalue end ary end @@ -106,9 +106,9 @@ module Enumerable raise ArgumentError, "invalid size" if n <= 0 ary = [] - self.each do |e| + self.each do |*val| ary.shift if ary.size == n - ary << e + ary << val.__svalue block.call(ary.dup) if ary.size == n end end @@ -132,8 +132,8 @@ module Enumerable raise ArgumentError, "invalid slice size" if n <= 0 ary = [] - self.each do |e| - ary << e + self.each do |*val| + ary << val.__svalue if ary.size == n block.call(ary) ary = [] @@ -154,9 +154,10 @@ module Enumerable def group_by(&block) h = {} - self.each do |e| - key = block.call(e) - h.key?(key) ? (h[key] << e) : (h[key] = [e]) + self.each do |*val| + key = block.call(*val) + sv = val.__svalue + h.key?(key) ? (h[key] << sv) : (h[key] = [sv]) end h end @@ -193,16 +194,16 @@ module Enumerable # second form returns an empty array. def first(n=NONE) if n == NONE - self.each do |e| - return e + self.each do |*val| + return val.__svalue end return nil else a = [] i = 0 - self.each do |e| + self.each do |*val| break if n<=i - a.push e + a.push val.__svalue i += 1 end a @@ -212,15 +213,15 @@ module Enumerable def count(v=NONE, &block) count = 0 if block - self.each do |e| - count += 1 if block.call(e) + self.each do |*val| + count += 1 if block.call(*val) end else if v == NONE self.each { count += 1 } else - self.each do |e| - count += 1 if e == v + self.each do |*val| + count += 1 if val.__svalue == v end end end diff --git a/mrblib/enum.rb b/mrblib/enum.rb index 38c51aa21..4f9682ac7 100644 --- a/mrblib/enum.rb +++ b/mrblib/enum.rb @@ -24,14 +24,14 @@ module Enumerable # ISO 15.3.2.2.1 def all?(&block) if block - self.each{|val| - unless block.call(val) + self.each{|*val| + unless block.call(*val) return false end } else - self.each{|val| - unless val + self.each{|*val| + unless val.__svalue return false end } @@ -49,14 +49,14 @@ module Enumerable # ISO 15.3.2.2.2 def any?(&block) if block - self.each{|val| - if block.call(val) + self.each{|*val| + if block.call(*val) return true end } else - self.each{|val| - if val + self.each{|*val| + if val.__svalue return true end } @@ -165,9 +165,10 @@ module Enumerable # ISO 15.3.2.2.9 def grep(pattern, &block) ary = [] - self.each{|val| - if pattern === val - ary.push((block)? block.call(val): val) + self.each{|*val| + sv = val.__svalue + if pattern === sv + ary.push((block)? block.call(*val): sv) end } ary @@ -181,8 +182,8 @@ module Enumerable # # ISO 15.3.2.2.10 def include?(obj) - self.each{|val| - if val == obj + self.each{|*val| + if val.__svalue == obj return true end } -- cgit v1.2.3