How to collect over two arrays then look back to one?

Two parallel arrays A, B . For each element n of A for which
f(An) is true,
is g(B[n-3:n+3]) true? Where B[n-3:n+3] refers to seven
elements of B whose
position is centered over An' position.

Can the block inside Enumerable#collect know it's position inside the
Enumerable? Can one collect two parallel arrays?

#collect_with_index doesn't exist natively (but should)

#zip will merge the arrays, and then you can map the results.

module Enumerable
  def map_with_index
    a =
    each_with_index { |x, i|
      a << yield( x, i )
    }
    a
  end
end

class Array
  def sum
    inject(0){ |s,v| s+v }
  end
end
    
def f( n )
  n % 2 == 0
end

def g( *vals )
  vals.sum
end
    
a = (1..10).to_a
b = (10..20).to_a

pairs = a.zip( b )
odd_sums = pairs.map_with_index{ |pair, i|
  a_val = pair[ 0 ]
  if f( a_val )
    b_vals = pairs[ (i-3)..(i+3) ].map{ |pair| pair[1] }
    g( *b_vals )
  else
    nil
  end
}

p odd_sums
#=> [nil, 0, nil, 91, nil, 105, nil, 99, nil, 70]

···

From: Peter Booth [mailto:pbooth@marketaxess.com]