JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://raw.github.com/javascript/augment/master/lib/augment.js"></script>

JavaScript

// using the augment library - https://github.com/javascript/augment

var Stream = Object.augment(function () {
    this.constructor = function () {
        var subs = this.subs = [];

        this.id = setInterval(function () {
            var length = subs.length;
            for (var i = 0; i < length; i++)
                subs[i](Math.random());
        }, 500 + 100 * Math.random() | 0);
    };

    this.forEach = function (callback) {
        this.subs.push(callback);
    };
});

zip(new Stream, new Stream, console.log.bind(console));

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

    a.forEach(function (value) {
        if (right.length)
            callback([value, right.shift()]);
        else left.push(value);
    });

    b.forEach(function (value) {
        if (left.length)
            callback([left.shift(), value]);
        else right.push(value);
    });
}