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);
});
}