enum methods to support multiple values; all?, any?, grep, include?, drop,...

enum methods to support multiple values; all?, any?, grep, include?, drop, drop_while, take, take_while, each_cons, each_slice, group_by, first, count
parent 57c7f92d
...@@ -17,7 +17,7 @@ module Enumerable ...@@ -17,7 +17,7 @@ module Enumerable
raise ArgumentError, "attempt to drop negative size" if n < 0 raise ArgumentError, "attempt to drop negative size" if n < 0
ary = [] ary = []
self.each {|e| n == 0 ? ary << e : n -= 1 } self.each {|*val| n == 0 ? ary << val.__svalue : n -= 1 }
ary ary
end end
...@@ -34,9 +34,9 @@ module Enumerable ...@@ -34,9 +34,9 @@ module Enumerable
def drop_while(&block) def drop_while(&block)
ary, state = [], false ary, state = [], false
self.each do |e| self.each do |*val|
state = true if !state and !block.call(e) state = true if !state and !block.call(*val)
ary << e if state ary << val.__svalue if state
end end
ary ary
end end
...@@ -55,9 +55,9 @@ module Enumerable ...@@ -55,9 +55,9 @@ module Enumerable
raise ArgumentError, "attempt to take negative size" if n < 0 raise ArgumentError, "attempt to take negative size" if n < 0
ary = [] ary = []
self.each do |e| self.each do |*val|
break if ary.size >= n break if ary.size >= n
ary << e ary << val.__svalue
end end
ary ary
end end
...@@ -75,9 +75,9 @@ module Enumerable ...@@ -75,9 +75,9 @@ module Enumerable
def take_while(&block) def take_while(&block)
ary = [] ary = []
self.each do |e| self.each do |*val|
return ary unless block.call(e) return ary unless block.call(*val)
ary << e ary << val.__svalue
end end
ary ary
end end
...@@ -106,9 +106,9 @@ module Enumerable ...@@ -106,9 +106,9 @@ module Enumerable
raise ArgumentError, "invalid size" if n <= 0 raise ArgumentError, "invalid size" if n <= 0
ary = [] ary = []
self.each do |e| self.each do |*val|
ary.shift if ary.size == n ary.shift if ary.size == n
ary << e ary << val.__svalue
block.call(ary.dup) if ary.size == n block.call(ary.dup) if ary.size == n
end end
end end
...@@ -132,8 +132,8 @@ module Enumerable ...@@ -132,8 +132,8 @@ module Enumerable
raise ArgumentError, "invalid slice size" if n <= 0 raise ArgumentError, "invalid slice size" if n <= 0
ary = [] ary = []
self.each do |e| self.each do |*val|
ary << e ary << val.__svalue
if ary.size == n if ary.size == n
block.call(ary) block.call(ary)
ary = [] ary = []
...@@ -154,9 +154,10 @@ module Enumerable ...@@ -154,9 +154,10 @@ module Enumerable
def group_by(&block) def group_by(&block)
h = {} h = {}
self.each do |e| self.each do |*val|
key = block.call(e) key = block.call(*val)
h.key?(key) ? (h[key] << e) : (h[key] = [e]) sv = val.__svalue
h.key?(key) ? (h[key] << sv) : (h[key] = [sv])
end end
h h
end end
...@@ -193,16 +194,16 @@ module Enumerable ...@@ -193,16 +194,16 @@ module Enumerable
# second form returns an empty array. # second form returns an empty array.
def first(n=NONE) def first(n=NONE)
if n == NONE if n == NONE
self.each do |e| self.each do |*val|
return e return val.__svalue
end end
return nil return nil
else else
a = [] a = []
i = 0 i = 0
self.each do |e| self.each do |*val|
break if n<=i break if n<=i
a.push e a.push val.__svalue
i += 1 i += 1
end end
a a
...@@ -212,15 +213,15 @@ module Enumerable ...@@ -212,15 +213,15 @@ module Enumerable
def count(v=NONE, &block) def count(v=NONE, &block)
count = 0 count = 0
if block if block
self.each do |e| self.each do |*val|
count += 1 if block.call(e) count += 1 if block.call(*val)
end end
else else
if v == NONE if v == NONE
self.each { count += 1 } self.each { count += 1 }
else else
self.each do |e| self.each do |*val|
count += 1 if e == v count += 1 if val.__svalue == v
end end
end end
end end
......
...@@ -24,14 +24,14 @@ module Enumerable ...@@ -24,14 +24,14 @@ module Enumerable
# ISO 15.3.2.2.1 # ISO 15.3.2.2.1
def all?(&block) def all?(&block)
if block if block
self.each{|val| self.each{|*val|
unless block.call(val) unless block.call(*val)
return false return false
end end
} }
else else
self.each{|val| self.each{|*val|
unless val unless val.__svalue
return false return false
end end
} }
...@@ -49,14 +49,14 @@ module Enumerable ...@@ -49,14 +49,14 @@ module Enumerable
# ISO 15.3.2.2.2 # ISO 15.3.2.2.2
def any?(&block) def any?(&block)
if block if block
self.each{|val| self.each{|*val|
if block.call(val) if block.call(*val)
return true return true
end end
} }
else else
self.each{|val| self.each{|*val|
if val if val.__svalue
return true return true
end end
} }
...@@ -165,9 +165,10 @@ module Enumerable ...@@ -165,9 +165,10 @@ module Enumerable
# ISO 15.3.2.2.9 # ISO 15.3.2.2.9
def grep(pattern, &block) def grep(pattern, &block)
ary = [] ary = []
self.each{|val| self.each{|*val|
if pattern === val sv = val.__svalue
ary.push((block)? block.call(val): val) if pattern === sv
ary.push((block)? block.call(*val): sv)
end end
} }
ary ary
...@@ -181,8 +182,8 @@ module Enumerable ...@@ -181,8 +182,8 @@ module Enumerable
# #
# ISO 15.3.2.2.10 # ISO 15.3.2.2.10
def include?(obj) def include?(obj)
self.each{|val| self.each{|*val|
if val == obj if val.__svalue == obj
return true return true
end end
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment