export type GetListItemKey<T = unknown> = (item: T) => string | undefined;
export type ReconciliationListReader<T> = {
    readonly isStrict: boolean;
    readonly count: number;
    readonly countOfAdded: number;
    readonly countOfRemoved: number;
    readonly isReconciliationInProgress: boolean;
    lookup(key: string): LinkedItem<T> | undefined;
    firstItem(): LinkedItem<T> | undefined;
    lastItem(): LinkedItem<T> | undefined;
    items(onlyAfter?: LinkedItem<T>): Generator<LinkedItem<T>>;
    itemsAdded(clear?: boolean): Generator<LinkedItem<T>>;
    itemsRemoved(clear?: boolean): Generator<LinkedItem<T>>;
    isAdded(item: LinkedItem<T>): boolean;
    isMoved(item: LinkedItem<T>): boolean;
    isRemoved(item: LinkedItem<T>): boolean;
    isActual(item: LinkedItem<T>): boolean;
    isExternal(item: LinkedItem<T>): boolean;
};
export type LinkedItem<T> = {
    readonly instance: T;
    readonly index: number;
    readonly next?: LinkedItem<T>;
    readonly prev?: LinkedItem<T>;
    aux?: LinkedItem<T>;
};
export declare class ReconciliationList<T> implements ReconciliationListReader<T> {
    readonly getKey: GetListItemKey<T>;
    private strict;
    private map;
    private tag;
    private actual;
    private added;
    private removed;
    private lastNotFoundKey;
    private strictNextItem?;
    constructor(getKey: GetListItemKey<T>, strict?: boolean);
    get isStrict(): boolean;
    set isStrict(value: boolean);
    get count(): number;
    get countOfAdded(): number;
    get countOfRemoved(): number;
    get isReconciliationInProgress(): boolean;
    lookup(key: string | undefined): LinkedItem<T> | undefined;
    tryReuse(key: string, resolution?: {
        isDuplicate: boolean;
    }, error?: string): LinkedItem<T> | undefined;
    add(instance: T): LinkedItem<T>;
    remove(item: LinkedItem<T>): void;
    move(item: LinkedItem<T>, after: LinkedItem<T>): void;
    beginReconciliation(): void;
    endReconciliation(error?: unknown): void;
    clearAddedAndRemoved(): void;
    firstItem(): LinkedItem<T> | undefined;
    lastItem(): LinkedItem<T> | undefined;
    items(onlyAfter?: LinkedItem<T>): Generator<LinkedItem<T>>;
    itemsAdded(clear?: boolean): Generator<LinkedItem<T>>;
    itemsRemoved(clear?: boolean): Generator<LinkedItem<T>>;
    isAdded(item: LinkedItem<T>): boolean;
    isMoved(item: LinkedItem<T>): boolean;
    isRemoved(item: LinkedItem<T>): boolean;
    isActual(item: LinkedItem<T>): boolean;
    isExternal(item: LinkedItem<T>): boolean;
    markAsMoved(item: LinkedItem<T>): void;
    static createItem<T>(instance: T): LinkedItem<T>;
}
