import { Observable } from '../Observable'; import { ReplaySubject } from '../ReplaySubject'; import { IScheduler } from '../Scheduler'; import { multicast } from './multicast'; import { ConnectableObservable } from '../observable/ConnectableObservable'; import { UnaryFunction, MonoTypeOperatorFunction, OperatorFunction } from '../interfaces'; /* tslint:disable:max-line-length */ export function publishReplay(bufferSize?: number, windowTime?: number, scheduler?: IScheduler): UnaryFunction, ConnectableObservable>; export function publishReplay(bufferSize?: number, windowTime?: number, selector?: MonoTypeOperatorFunction, scheduler?: IScheduler): MonoTypeOperatorFunction; export function publishReplay(bufferSize?: number, windowTime?: number, selector?: OperatorFunction, scheduler?: IScheduler): OperatorFunction; /* tslint:enable:max-line-length */ export function publishReplay(bufferSize?: number, windowTime?: number, selectorOrScheduler?: IScheduler | OperatorFunction, scheduler?: IScheduler): UnaryFunction, ConnectableObservable | Observable> { if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { scheduler = selectorOrScheduler; } const selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; const subject = new ReplaySubject(bufferSize, windowTime, scheduler); return (source: Observable) => multicast(() => subject, selector)(source) as Observable | ConnectableObservable; }