import { Observable } from '../Observable'; import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject'; import { innerFrom } from './innerFrom'; import { popResultSelector } from '../util/args'; import { createOperatorSubscriber } from '../operators/OperatorSubscriber'; import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs'; import { createObject } from '../util/createObject'; export function forkJoin(...args) { const resultSelector = popResultSelector(args); const { args: sources, keys } = argsArgArrayOrObject(args); const result = new Observable((subscriber) => { const { length } = sources; if (!length) { subscriber.complete(); return; } const values = new Array(length); let remainingCompletions = length; let remainingEmissions = length; for (let sourceIndex = 0; sourceIndex < length; sourceIndex++) { let hasValue = false; innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, (value) => { if (!hasValue) { hasValue = true; remainingEmissions--; } values[sourceIndex] = value; }, () => remainingCompletions--, undefined, () => { if (!remainingCompletions || !hasValue) { if (!remainingEmissions) { subscriber.next(keys ? createObject(keys, values) : values); } subscriber.complete(); } })); } }); return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result; } //# sourceMappingURL=forkJoin.js.map