For "combine":
How much of a performance problem would it be to have zip, if given a 
block, return an array of the results, instead of nil? Code using it for 
side-effects at the moment would be unaffected (but it would create a 
potentially big array). Then you could do
[1,2,3].zip([4,5,6])    # => [[1,4],[2,5],[3,6]]

[1,2,3].zip([4,5,6]) { |x,y| puts x*y }
 > 4
 > 10
 > 18
# => [nil,nil,nil]    (this would presumably be ignored)

[1,2,3].zip([4,5,6]) { |x,y| x*y } # => [4,10,18]

This generalises to more than one array...

Sam