diff options
Diffstat (limited to 'mrbgems/mruby-array-ext/mrblib/array.rb')
| -rw-r--r-- | mrbgems/mruby-array-ext/mrblib/array.rb | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb index 21ef6791b..e28e5238d 100644 --- a/mrbgems/mruby-array-ext/mrblib/array.rb +++ b/mrbgems/mruby-array-ext/mrblib/array.rb @@ -101,8 +101,19 @@ class Array hash = {} array = [] - elem.each { |x| hash[x] = true } - self.each { |x| array << x unless hash[x] } + idx = 0 + len = elem.size + while idx < len + hash[elem[idx]] = true + idx += 1 + end + idx = 0 + len = size + while idx < len + v = self[idx] + array << v unless hash[v] + idx += 1 + end array end @@ -137,12 +148,21 @@ class Array hash = {} array = [] - elem.each{|v| hash[v] = true } - self.each do |v| + idx = 0 + len = elem.size + while idx < len + hash[elem[idx]] = true + idx += 1 + end + idx = 0 + len = size + while idx < len + v = self[idx] if hash[v] array << v hash.delete v end + idx += 1 end array end @@ -190,13 +210,17 @@ class Array def flatten!(depth=nil) modified = false ar = [] - self.each do |e| + idx = 0 + len = size + while idx < len + e = self[idx] if e.is_a?(Array) && (depth.nil? || depth > 0) ar += e.flatten(depth.nil? ? nil : depth - 1) modified = true else ar << e end + idx += 1 end if modified self.replace(ar) @@ -718,10 +742,14 @@ class Array return to_enum :select! unless block result = [] - self.each do |x| - result << x if block.call(x) + idx = 0 + len = size + while idx < len + elem = self[idx] + result << elem if block.call(elem) + idx += 1 end - return nil if self.size == result.size + return nil if len == result.size self.replace(result) end @@ -743,8 +771,9 @@ class Array if block idx = 0 - self.each do |*e| - return idx if block.call(*e) + len = size + while idx < len + return idx if block.call self[idx] idx += 1 end else |
