 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Looping Through Multiple Iterables in Parallel | ||
|---|---|---|
| Code | Expected | Actual | 
| require 'generator'
enumerator = SyncEnumerator.new(%w{Four seven}, %w{score years}, 
            	                %w{and ago})
enumerator.each do |row|
  row.each { |word| puts word }
  puts '---'
end | Four score and --- seven years ago --- | Four score and --- seven years ago --- | 
| enumerator = SyncEnumerator.new(%w{Four and}, %w{score seven years ago})
enumerator.each do |row|
  row.each { |word| puts word }
  puts '---'
end | Four score --- and seven --- nil years --- nil ago --- | Four score --- and seven --- nil years --- nil ago --- | 
| def interosculate(*enumerables)
  generators = enumerables.collect { |x| Generator.new(x) }
  done = false
  until done	
    done = true
    generators.each do |g|
      if g.next?
        yield g.next
        done = false
      end
    end
  end
end
interosculate(%w{Four and}, %w{score seven years ago}) do |x|
  puts x
end | Four score and seven years ago | Four score and seven years ago | 
| l = ["junk1", 1, "junk2", 2, "junk3", "junk4", 3, "junk5"] g = Generator.new(l) g.next | "junk1" | "junk1" | 
| g.next | 1 | 1 | 
| g.next | "junk2" | "junk2" | 
| def l.my_iterator
  each { |e| yield e unless e =~ /^junk/ }
end
l.my_iterator { |x| puts x } | 1 2 3 | 1 2 3 | 
| g = Generator.new { |g| l.each { |e| g.yield e unless e =~ /^junk/ } }
g.next | 1 | 1 | 
| g.next | 2 | 2 | 
| g.next | 3 | 3 | 
| g = Generator.new { |g| l.my_iterator { |e| g.yield e } }
g.next | 1 | 1 | 
| g.next | 2 | 2 | 
| g.next | 3 | 3 | 
| def interosculate(*iteratables)
  generators = iteratables.collect do |x| 
    if x.is_a? Method
      Generator.new { |g| x.call { |e| g.yield e } }
    else
      Generator.new(x) 
    end
  end
  done = false
  until done	
    done = true
    generators.each do |g|
      if g.next?
        yield g.next
        done = false
      end
    end
  end
end
words1 = %w{Four and years}
words2 = %w{ago seven score}
interosculate(words1, words2.method(:reverse_each)) { |x| puts x } | Four score and seven years ago | Four score and seven years ago |