import { OnPatchesListener } from "./emitPatch";
import type { Patch } from "./Patch";
/**
 * Patch recorder event.
 */
export interface PatchRecorderEvent {
    /**
     * Target object.
     */
    readonly target: object;
    /**
     * Recorded patches.
     */
    readonly patches: Patch[];
    /**
     * Recorded inverse patches.
     */
    readonly inversePatches: Patch[];
}
/**
 * Patch recorder interface.
 */
export interface PatchRecorder {
    /**
     * Gets/sets if the patch recorder is currently recording.
     */
    recording: boolean;
    /**
     * Observable array of patching events.
     */
    readonly events: PatchRecorderEvent[];
    /**
     * Dispose of the patch recorder.
     */
    dispose(): void;
}
/**
 * Patch recorder options.
 */
export interface PatchRecorderOptions {
    /**
     * If the patch recorder is initially recording when created.
     */
    recording?: boolean;
    /**
     * An optional callback filter to select wich patches to record/skip.
     * It will be executed before the event is added to the events list.
     *
     * @param patches Patches about to be recorded.
     * @param inversePatches Inverse patches about to be recorded.
     * @returns `true` to record the patch, `false` to skip it.
     */
    filter?(patches: Patch[], inversePatches: Patch[]): boolean;
    /**
     * An optional callback run once a patch is recorded.
     * It will be executed after the event is added to the events list.
     *
     * @param patches Patches just recorded.
     * @param inversePatches Inverse patches just recorded.
     */
    onPatches?: OnPatchesListener;
}
/**
 * Creates a patch recorder.
 *
 * @param subtreeRoot
 * @param [opts]
 * @returns The patch recorder.
 */
export declare function patchRecorder(subtreeRoot: object, opts?: PatchRecorderOptions): PatchRecorder;
