import { Observable } from '../Observable'; import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject'; import { from } from './from'; import { identity } from '../util/identity'; import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs'; import { popResultSelector, popScheduler } from '../util/args'; import { createObject } from '../util/createObject'; import { createOperatorSubscriber } from '../operators/OperatorSubscriber'; import { executeSchedule } from '../util/executeSchedule'; export function combineLatest(...args) { const scheduler = popScheduler(args); const resultSelector = popResultSelector(args); const { args: observables, keys } = argsArgArrayOrObject(args); if (observables.length === 0) { return from([], scheduler); } const result = new Observable(combineLatestInit(observables, scheduler, keys ? (values) => createObject(keys, values) : identity)); return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result; } export function combineLatestInit(observables, scheduler, valueTransform = identity) { return (subscriber) => { maybeSchedule(scheduler, () => { const { length } = observables; const values = new Array(length); let active = length; let remainingFirstValues = length; for (let i = 0; i < length; i++) { maybeSchedule(scheduler, () => { const source = from(observables[i], scheduler); let hasFirstValue = false; source.subscribe(createOperatorSubscriber(subscriber, (value) => { values[i] = value; if (!hasFirstValue) { hasFirstValue = true; remainingFirstValues--; } if (!remainingFirstValues) { subscriber.next(valueTransform(values.slice())); } }, () => { if (!--active) { subscriber.complete(); } })); }, subscriber); } }, subscriber); }; } function maybeSchedule(scheduler, execute, subscription) { if (scheduler) { executeSchedule(subscription, scheduler, execute); } else { execute(); } } //# sourceMappingURL=combineLatest.js.map