declare enum AFFECTED_TYPES {
    KEYS = "k",
    HAS_KEY = "h",
    HAS_OWN_KEY = "o",
    ALL_KEYS = "a"
}
export interface MemoConfig {
    objectShallowCompare?: boolean;
    shouldCompare?: (args?: any[], cachedArgsCfg?: NormalizeArgCfg[]) => boolean;
    isChanged?: (args?: any[], cachedArgsCfg?: NormalizeArgCfg[]) => boolean;
}
/**
 * @param t The Type
 * @param v The normalized value
 * @param r The raw value
 * @param a The affected info
 */
export interface NormalizeArgCfg {
    t: string;
    v: any;
    r: unknown;
    a: Affected;
}
export interface HasKeyArgCfg {
    v: boolean;
}
export interface HasOwnKeyArgCfg {
    v: boolean;
}
export declare type RecordKey = string | symbol;
export declare type AffectedKey = Map<RecordKey, NormalizeArgCfg>;
export declare type AffectedHasKey = Map<RecordKey, HasKeyArgCfg>;
export declare type AffectedHasOwnKey = Map<RecordKey, HasOwnKeyArgCfg>;
export declare type AffectedAllKey = [boolean, Array<RecordKey>];
/**
 * @param k The key map which used
 * @param h The key which used in has
 * @param a The key which used in all keys
 */
export interface Used {
    p?: ProxyHandler<any>;
    [AFFECTED_TYPES.KEYS]: AffectedKey;
    [AFFECTED_TYPES.HAS_KEY]: AffectedHasKey;
    [AFFECTED_TYPES.HAS_OWN_KEY]: AffectedHasOwnKey;
    [AFFECTED_TYPES.ALL_KEYS]: AffectedAllKey;
}
export declare type Affected = WeakMap<object, Used>;
export declare type PathSet = string;
export declare const original: (proxyTarget: any) => any;
export declare const getUsed: (arg: any, affected: Affected) => Used;
export declare const memo: (fn: (...args: any[]) => any, memoCfg?: MemoConfig) => (...args: any[]) => any;
export declare const memoAsync: (fn: (...args: any[]) => any, memoCfg?: MemoConfig) => (...args: any[]) => Promise<any>;
export {};
