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
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
......
......@@ -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
}
......
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