import { EventEmitter } from 'tsee'; declare type WatcherEvents = { change: (newValue: T, oldValue?: T) => void; dispose: () => void; }; export declare class Watcher extends EventEmitter> { constructor(propListenerDisposer?: () => void); private _propListenerDisposer?; get propListenerDisposer(): (() => void) | undefined; lastValue: T | undefined; readonly emitChange: (newValue: T) => void; readonly setPropListenerDisposer: (disposer: Watcher["_propListenerDisposer"]) => void; /** unbind all listeners from this watcher and bind to other */ readonly rebindTo: (otherWatcher: Watcher) => void; /** unbind all listeners from this watcher and bind to other and disposeEmitter */ readonly rebindDisposePropListener: (otherWatcher: Watcher) => void; readonly disposePropListener: () => void; } export declare function watchProperty(getter: () => Value, opts?: { pollInterval?: number; isEqual?: (oldV: Value, newV: Value) => boolean; watcher?: Watcher; /** true by default */ emitOnStart?: boolean; }): Watcher; export declare function watchCascadePair(parent: Watcher, child: (newValue: A, oldWatcher?: Watcher) => Watcher): Watcher; export declare function watchCascade(parent: Watcher, child: (newValue: A, oldWatcher?: Watcher) => Watcher): ((then: (newValue?: B | undefined, oldWatcher?: Watcher | undefined) => Watcher) => void) & { last: Watcher; }; export {};