Выполнение всех аргументов функции по порядку перед вызовом

Я пытаюсь понять, как сделать следующую функцию zip (особенно функцию invoke) более функциональной. Проблема, с которой я столкнулся, заключается в том, что метод invoke должен ждать заполнения левой и правой сторон, прежде чем он сможет отправлять значения. Значения должны быть вызваны для того, чтобы правильные значения были заархивированы, в противном случае я бы рассмотрел функцию карри / частичного выполнения этого.

Есть ли что-нибудь, что я мог бы использовать, чтобы устранить это препятствие.

function zip(state, a, b) {
    var left = [];
    var right = [];

    function invoke() {
        if (left.length > 0 && right.length > 0) {
            state([left.shift(), right.shift()]);
        }
    }

    a.foreach(function(v) {
        left.push(v);
        invoke();
    });

    b.foreach(function(v) {
        right.push(v);
        invoke();
    });
}

Ниже приведен простой пример того, что удовлетворяет функции zip.

function Stream() {
    var env = this;
    env.subs = [];
    env.id = setInterval(function() {
        env.subs.forEach(function(f) {
            f(Math.random()); 
        });
    }, ((Math.random() * 100) + 500) | 0);
}
Stream.prototype.foreach = function(f) {
    this.subs.push(f);
}
zip(function(v) {
    console.log(v);
}, new Stream(), new Stream());

Бонус: удаление изменяемого массива.

Ответы на вопрос(3)

Ваш ответ на вопрос