diff --git a/mrbgems/mruby-enum-lazy/mrblib/lazy.rb b/mrbgems/mruby-enum-lazy/mrblib/lazy.rb index 140faf65b..25e728004 100644 --- a/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +++ b/mrbgems/mruby-enum-lazy/mrblib/lazy.rb @@ -349,6 +349,26 @@ class Enumerator } end + # + # call-seq: + # lazy.tap_each {|obj| block } -> lazy_enumerator + # + # Yields each element to the block for side effects (e.g. logging, + # debugging) and passes it through unmodified. + # + # (1..Float::INFINITY).lazy + # .tap_each {|i| puts "saw: #{i}" } + # .select(&:even?) + # .first(3) + # #=> [2, 4, 6] (prints "saw: 1", "saw: 2", ... along the way) + # + def tap_each(&block) + Lazy.new(self){|yielder, val| + block.call(val) + yielder << val + } + end + # # call-seq: # lazy.force -> array diff --git a/mrbgems/mruby-enum-lazy/test/lazy.rb b/mrbgems/mruby-enum-lazy/test/lazy.rb index a3090864a..0464441ee 100644 --- a/mrbgems/mruby-enum-lazy/test/lazy.rb +++ b/mrbgems/mruby-enum-lazy/test/lazy.rb @@ -64,6 +64,19 @@ assert("Enumerator::Lazy#grep_v") do assert_equal [0, 1, 5, 6], lazy_grep_v.first(4) end +assert("Enumerator::Lazy#tap_each") do + seen = [] + result = [1, 2, 3, 4, 5].lazy.tap_each{|x| seen << x }.select{|x| x % 2 == 0 }.force + assert_equal [2, 4], result + assert_equal [1, 2, 3, 4, 5], seen +end + +assert("Enumerator::Lazy#tap_each laziness") do + seen = [] + [1, 2, 3, 4, 5].lazy.tap_each{|x| seen << x }.first(3) + assert_equal [1, 2, 3], seen +end + assert("Enumerator::Lazy#zip with cycle") do e1 = [1, 2, 3].cycle e2 = [:a, :b].cycle