import { MapFanOut, OnNewFanOut } from './fanout';
export class NodeEvents {
    api;
    /**
     * Fired on any model change, even if the node's value has not changed. The
     * changes are fired once per microtask, so multiple changes in the same
     * microtask are batched into a single event.
     */
    onChanges;
    /**
     * Similar to `.onChanges`, but fired when the node's view has changed,
     * checked using triple equality `===`.
     *
     * The strict equality identity is preserved deeply equal values, even for
     * objects and arrays. So, this event will not fire if there was a change
     * to the node's value, but the value is still deeply equal to the previous
     * value.
     *
     * This event depends on overall Model's `onChanges` event, which is
     * batched using `queueMicrotask`.
     */
    onViewChanges;
    constructor(api) {
        this.api = api;
        this.onChanges = new MapFanOut(this.api.api.onChanges, this.getSnapshot);
        this.onViewChanges = new OnNewFanOut(this.onChanges, this.api.view());
    }
    /**
     * Called when this node is deleted.
     *
     * @internal
     * @ignore
     */
    handleDelete() {
        this.onViewChanges.clear();
        this.onChanges.clear();
    }
    // ---------------------------------------------------------------- SyncStore
    subscribe = (callback) => this.onViewChanges.listen(() => callback());
    getSnapshot = () => this.api.view();
}
//# sourceMappingURL=NodeEvents.js.map