# File lib/facet/enumerable/cross.rb, line 20 def self.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) { |i| if gens[i].end? if i > 0 gens[i].rewind gens[i-1].next else return res end end } end end