var zipWith = function (fn, a, b) { var l = Math.min(a.length, b.length), r = []; for(var i = 0; i < l; i += 1) { r.push(fn(a[i], b[i])); } return r; }; var apply = function (fn, v) { return fn(v); }; var id = function (v) { return v; } var dbl = function (n) { return 2 * n; } var cycle = function (a, n) { var output = []; for (var i = 0; i < n; i++) { output.push(a[i % a.length]); } return output; }; // doubleEveryOther zipWith(apply, cycle([id, dbl], 10), [1,2,3,4,5]); /* 1,4,3,8,5 */