From aacbc39b27dcb6697b1463deb86d87ffbfdc64bc Mon Sep 17 00:00:00 2001 From: skandhas Date: Fri, 22 Mar 2013 15:43:30 +0800 Subject: add Enumerable#each_cons --- mrbgems/mruby-enum-ext/mrblib/enum.rb | 31 +++++++++++++++++++++++++++++++ mrbgems/mruby-enum-ext/test/enum.rb | 5 +++++ 2 files changed, 36 insertions(+) (limited to 'mrbgems/mruby-enum-ext') diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb index a9545da98..7116325f7 100644 --- a/mrbgems/mruby-enum-ext/mrblib/enum.rb +++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb @@ -82,4 +82,35 @@ module Enumerable ary end + ## + # call-seq: + # enum.each_cons(n) {...} -> nil + # + # Iterates the given block for each array of consecutive + # elements. + # + # e.g.: + # (1..10).each_cons(3) {|a| p a} + # # outputs below + # [1, 2, 3] + # [2, 3, 4] + # [3, 4, 5] + # [4, 5, 6] + # [5, 6, 7] + # [6, 7, 8] + # [7, 8, 9] + # [8, 9, 10] + + def each_cons(n, &block) + raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer + raise ArgumentError, "invalid size" if n <= 0 + + ary = [] + self.each do |e| + ary.shift if ary.size == n + ary << e + block.call(ary.dup) if ary.size == n + end + end + end diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb index 5fc9759ad..c82297437 100644 --- a/mrbgems/mruby-enum-ext/test/enum.rb +++ b/mrbgems/mruby-enum-ext/test/enum.rb @@ -23,3 +23,8 @@ assert("Enumerable#take_while") do assert_equal a.take_while {|i| i < 3 }, [1, 2] end +assert("Enumrable#each_cons") do + a = [] + (1..5).each_cons(3){|e| a << e} + assert_equal a, [[1, 2, 3], [2, 3, 4], [3, 4, 5]] +end -- cgit v1.2.3