# File lib/facets/yore/enumerable/cross.rb, line 25 def cross(*enums, &block) raise if enums.empty? gens = enums.map{|e| Generator.new(e)} return [] if gens.any? {|g| g.end?} sz = gens.size res = [] tuple = Array.new(sz) loop do # fill tuple (0 ... sz).each { |i| tuple[i] = gens[i].current } if block.nil? res << tuple.dup else block.call(tuple.dup) end # step forward gens[-1].next (sz-1).downto(0) do |i| if gens[i].end? if i > 0 gens[i].rewind gens[i-1].next else return res end end end end #loop end