summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb30
-rw-r--r--mrbgems/mruby-enum-ext/test/enum.rb9
2 files changed, 39 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
index ead9a794a..11c9dbd98 100644
--- a/mrbgems/mruby-enum-ext/mrblib/enum.rb
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -615,4 +615,34 @@ module Enumerable
end
nil
end
+
+ ##
+ # call-seq:
+ # enum.zip(arg, ...) -> an_array_of_array
+ #
+ # Takes one element from <i>enum</i> and merges corresponding
+ # elements from each <i>args</i>. This generates a sequence of
+ # <em>n</em>-element arrays, where <em>n</em> is one more than the
+ # count of arguments. The length of the resulting sequence will be
+ # <code>enum#size</code>. If the size of any argument is less than
+ # <code>enum#size</code>, <code>nil</code> values are supplied.
+ #
+
+ def zip(*arg)
+ ary = []
+ i = 0
+ self.each do |val|
+ a = []
+ a.push(val)
+ idx = 0
+ while idx < arg.size
+ a2 = arg[idx].to_a
+ a.push(a2[i])
+ idx += 1
+ end
+ ary.push(a)
+ i += 1
+ end
+ ary
+ end
end
diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb
index daf737d37..9348cb4a5 100644
--- a/mrbgems/mruby-enum-ext/test/enum.rb
+++ b/mrbgems/mruby-enum-ext/test/enum.rb
@@ -135,3 +135,12 @@ assert("Enumerable#find_index") do
assert_equal 34, (1..100).find_index { |i| i % 5 == 0 and i % 7 == 0 }
assert_equal 49 ,(1..100).find_index(50)
end
+
+assert("Enumerable#zip") do
+ a = [ 4, 5, 6 ]
+ b = [ 7, 8, 9 ]
+ assert_equal [[4, 7], [5, 8], [6, 9]], a.zip(b)
+ assert_equal [[1, 4, 7], [2, 5, 8], [3, 6, 9]], [1, 2, 3].zip(a, b)
+ assert_equal [[1, 4, 7], [2, 5, 8]], [1, 2].zip(a, b)
+ assert_equal [[4, 1, 8], [5, 2, nil], [6, nil, nil]], a.zip([1, 2], [8])
+end