import { IReadonlyList } from '../../misc/readonly-list/interfaces'; import { IObservable } from '../observable/interfaces'; import { TObserverObserveResultNonCyclic } from './types'; /** INTERFACES **/ export interface IObserverConstructor { new(onEmit: (value: T, observable?: IObservable) => void): IObserver; } export interface IObserverTypedConstructor { new(onEmit: (value: T, observable?: IObservable) => void): IObserver; } /** * A Observer is a push destination: it receives data though 'emit' */ export interface IObserver { // true if Observer is activated readonly activated: boolean; // list of Observables observed by this Observer readonly observables: IReadonlyList>; // true if Observer is observing at least one Observable readonly observing: boolean; // emit a value emit(value: T, observable?: IObservable): void; // activates the Observer activate(): this; // deactivates the Observer deactivate(): this // observes a list of Observables observe[]>(...observables: O): TObserverObserveResultNonCyclic; // returns this // stops observing a list of Observables unobserve[]>(...observables: O): TObserverObserveResultNonCyclic; // returns this // stops observing all its Observables disconnect(): this; }