Add Enumerable#reverse_each
authorJun Hiroe <[email protected]>
Mon, 24 Mar 2014 08:49:14 +0000 (24 17:49 +0900)
committerJun Hiroe <[email protected]>
Mon, 24 Mar 2014 09:03:37 +0000 (24 18:03 +0900)
mrbgems/mruby-enum-ext/mrblib/enum.rb
mrbgems/mruby-enum-ext/test/enum.rb

index c3e1b25..6ac1812 100644 (file)
@@ -498,4 +498,29 @@ module Enumerable
     self.each {|*val| block.call(val.__svalue, obj) }
     obj
   end
+
+  ##
+  #  call-seq:
+  #     enum.reverse_each { |item| block } ->  enum
+  #     enum.reverse_each                  ->  an_enumerator
+  #
+  #  Builds a temporary array and traverses that array in reverse order.
+  #
+  #  If no block is given, an enumerator is returned instead.
+  #
+  #      (1..3).reverse_each { |v| p v }
+  #
+  #    produces:
+  #
+  #      3
+  #      2
+  #      1
+  #
+
+  def reverse_each(&block)
+    ary = []
+    self.each {|*val| ary.unshift(*val) }
+    ary.each {|*val| block.call(*val) }
+    self
+  end
 end
index ae54820..127b263 100644 (file)
@@ -115,3 +115,10 @@ assert("Enumerable#each_with_object") do
   assert_true [2, 4, 6, 8, 10, 12, 14, 16, 18, 20], (1..10).each_with_object([]) { |i, a| a << i*2 }
   assert_raise(ArgumentError) { (1..10).each_with_object() { |i, a| a << i*2 } }
 end
+
+assert("Enumerable#reverse_each") do
+  r = (1..3)
+  a = []
+  assert_equal (1..3), r.reverse_each { |v| a << v }
+  assert_equal [3, 2, 1], a
+end