import { Subject } from '../Subject'; import { Observable } from '../Observable'; import { MulticastObservable } from '../observable/MulticastObservable'; import { ConnectableObservable } from '../observable/ConnectableObservable'; /** * Returns an Observable that emits the results of invoking a specified selector on items * emitted by a ConnectableObservable that shares a single subscription to the underlying stream. * * * * @param {Function|Subject} Factory function to create an intermediate subject through * which the source sequence's elements will be multicast to the selector function * or Subject to push source elements into. * @param {Function} Optional selector function that can use the multicasted source stream * as many times as needed, without causing multiple subscriptions to the source stream. * Subscribers to the given source will receive all notifications of the source from the * time of the subscription forward. * @return {Observable} an Observable that emits the results of invoking the selector * on the items emitted by a `ConnectableObservable` that shares a single subscription to * the underlying stream. * @method multicast * @owner Observable */ export function multicast(subjectOrSubjectFactory: Subject | (() => Subject), selector?: (source: Observable) => Observable): Observable | ConnectableObservable { let subjectFactory: () => Subject; if (typeof subjectOrSubjectFactory === 'function') { subjectFactory = <() => Subject>subjectOrSubjectFactory; } else { subjectFactory = function subjectFactory() { return >subjectOrSubjectFactory; }; } return !selector ? new ConnectableObservable(this, subjectFactory) : new MulticastObservable(this, subjectFactory, selector); } export type factoryOrValue = T | (() => T); export type selector = (source: Observable) => Observable; export interface MulticastSignature { (subjectOrSubjectFactory: factoryOrValue>): ConnectableObservable; (SubjectFactory: () => Subject, selector?: selector): Observable; }