export interface Subscription { unsubscribe: () => void; } type Observer = (data: T) => void; export declare class Observable { private onFirstSubscribe?; protected observers: Array>; private onLastUnsubscribe?; constructor(onFirstSubscribe?: ((observable: Observable) => (() => void) | void) | undefined); subscribe(observer: Observer): Subscription; notify(data: T): void; protected addObserver(observer: Observer): void; protected removeObserver(observer: Observer): void; } export declare function mergeObservables(...observables: Array>): Observable; export declare class BufferedObservable extends Observable { private maxBufferSize; private buffer; constructor(maxBufferSize: number); notify(data: T): void; subscribe(observer: Observer): Subscription; /** * Drop buffered data and don't buffer future data. This is to avoid leaking memory when it's not * needed anymore. This can be seen as a performance optimization, and things will work probably * even if this method isn't called, but still useful to clarify our intent and lowering our * memory impact. */ unbuffer(): void; } export {};