import { ArrayLike } from 'zrender/lib/core/types.js'; 
 | 
declare type DiffKeyGetter<CTX = unknown> = (this: DataDiffer<CTX>, value: unknown, index: number) => string; 
 | 
declare type DiffCallbackAdd = (newIndex: number) => void; 
 | 
declare type DiffCallbackUpdate = (newIndex: number, oldIndex: number) => void; 
 | 
declare type DiffCallbackRemove = (oldIndex: number) => void; 
 | 
declare type DiffCallbackUpdateManyToOne = (newIndex: number, oldIndex: number[]) => void; 
 | 
declare type DiffCallbackUpdateOneToMany = (newIndex: number[], oldIndex: number) => void; 
 | 
declare type DiffCallbackUpdateManyToMany = (newIndex: number[], oldIndex: number[]) => void; 
 | 
export declare type DataDiffMode = 'oneToOne' | 'multiple'; 
 | 
declare class DataDiffer<CTX = unknown> { 
 | 
    private _old; 
 | 
    private _new; 
 | 
    private _oldKeyGetter; 
 | 
    private _newKeyGetter; 
 | 
    private _add; 
 | 
    private _update; 
 | 
    private _updateManyToOne; 
 | 
    private _updateOneToMany; 
 | 
    private _updateManyToMany; 
 | 
    private _remove; 
 | 
    private _diffModeMultiple; 
 | 
    readonly context: CTX; 
 | 
    /** 
 | 
     * @param context Can be visited by this.context in callback. 
 | 
     */ 
 | 
    constructor(oldArr: ArrayLike<unknown>, newArr: ArrayLike<unknown>, oldKeyGetter?: DiffKeyGetter<CTX>, newKeyGetter?: DiffKeyGetter<CTX>, context?: CTX, diffMode?: DataDiffMode); 
 | 
    /** 
 | 
     * Callback function when add a data 
 | 
     */ 
 | 
    add(func: DiffCallbackAdd): this; 
 | 
    /** 
 | 
     * Callback function when update a data 
 | 
     */ 
 | 
    update(func: DiffCallbackUpdate): this; 
 | 
    /** 
 | 
     * Callback function when update a data and only work in `cbMode: 'byKey'`. 
 | 
     */ 
 | 
    updateManyToOne(func: DiffCallbackUpdateManyToOne): this; 
 | 
    /** 
 | 
     * Callback function when update a data and only work in `cbMode: 'byKey'`. 
 | 
     */ 
 | 
    updateOneToMany(func: DiffCallbackUpdateOneToMany): this; 
 | 
    /** 
 | 
     * Callback function when update a data and only work in `cbMode: 'byKey'`. 
 | 
     */ 
 | 
    updateManyToMany(func: DiffCallbackUpdateManyToMany): this; 
 | 
    /** 
 | 
     * Callback function when remove a data 
 | 
     */ 
 | 
    remove(func: DiffCallbackRemove): this; 
 | 
    execute(): void; 
 | 
    private _executeOneToOne; 
 | 
    /** 
 | 
     * For example, consider the case: 
 | 
     * oldData: [o0, o1, o2, o3, o4, o5, o6, o7], 
 | 
     * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8], 
 | 
     * Where: 
 | 
     *     o0, o1, n0 has key 'a' (many to one) 
 | 
     *     o5, n4, n5, n6 has key 'b' (one to many) 
 | 
     *     o2, n1 has key 'c' (one to one) 
 | 
     *     n2, n3 has key 'd' (add) 
 | 
     *     o3, o4 has key 'e' (remove) 
 | 
     *     o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove) 
 | 
     * Then: 
 | 
     *     (The order of the following directives are not ensured.) 
 | 
     *     this._updateManyToOne(n0, [o0, o1]); 
 | 
     *     this._updateOneToMany([n4, n5, n6], o5); 
 | 
     *     this._update(n1, o2); 
 | 
     *     this._remove(o3); 
 | 
     *     this._remove(o4); 
 | 
     *     this._remove(o6); 
 | 
     *     this._remove(o7); 
 | 
     *     this._add(n2); 
 | 
     *     this._add(n3); 
 | 
     *     this._add(n7); 
 | 
     *     this._add(n8); 
 | 
     */ 
 | 
    private _executeMultiple; 
 | 
    private _performRestAdd; 
 | 
    private _initIndexMap; 
 | 
} 
 | 
export default DataDiffer; 
 |