@reactivex/ix-esnext-esm
Version:
The Interactive Extensions for JavaScript
39 lines (37 loc) • 1.23 kB
JavaScript
import { IterableX } from './iterablex';
import { identity } from '../util/identity';
import { returnIterator } from '../util/returniterator';
export class ZipIterable extends IterableX {
constructor(sources, fn) {
super();
this._sources = sources;
this._fn = fn;
}
// eslint-disable-next-line consistent-return
*[Symbol.iterator]() {
const fn = this._fn;
const sourcesLength = this._sources.length;
const its = this._sources.map(x => x[Symbol.iterator]());
while (sourcesLength > 0) {
const values = new Array(sourcesLength);
for (let index = -1; ++index < sourcesLength;) {
const result = its[index].next();
if (result.done) {
its.forEach(returnIterator);
return undefined;
}
values[index] = result.value;
}
yield fn(values);
}
}
}
export function zip(...sources) {
let fn = (sources.shift() || identity);
if (fn && typeof fn !== 'function') {
sources.unshift(fn);
fn = identity;
}
return new ZipIterable(sources, fn);
}
//# sourceMappingURL=zip.mjs.map