interface ArrayDiffResult<T> {
    added: T[];
    removed: T[];
    unchanged: T[];
    changed: Array<{
        index: number;
        from: T;
        to: T;
    }>;
}
interface DiffResult {
    added: Record<string, unknown>;
    removed: Record<string, unknown>;
    changed: Record<string, {
        from: unknown;
        to: unknown;
    } | DiffResult | ArrayDiffResult<unknown>>;
    unchanged: Record<string, unknown>;
}
declare function isFlatChange(value: unknown): value is {
    from: unknown;
    to: unknown;
};
declare function isDiffResult(value: unknown): value is DiffResult;
declare function isArrayDiffResult(value: unknown): value is ArrayDiffResult<unknown>;

declare function diff(objA: Record<string, any>, objB: Record<string, any>): DiffResult | {};

declare function diffArrays<T>(a: T[], b: T[], options?: {
    deep?: boolean;
}): ArrayDiffResult<T>;

type FlatDiff = Record<string, {
    from: unknown;
    to: unknown;
}>;
declare function diffFlattened(a: Record<string, any>, b: Record<string, any>, prefix?: string): FlatDiff;

interface SmartDiffOptions {
    flatten?: boolean;
}
declare function smartDiff(a: Record<string, any>, b: Record<string, any>, options?: SmartDiffOptions): DiffResult | FlatDiff;

export { ArrayDiffResult, DiffResult, FlatDiff, SmartDiffOptions, diff, diffArrays, diffFlattened, isArrayDiffResult, isDiffResult, isFlatChange, smartDiff };
