import type { ApplyUndefinedType } from './assert';
export declare function isObject(o: any): boolean;
export declare function hasFunction(o: object | any[], name: PropertyKey): boolean;
export declare function deepClone<A extends object>(o: A): A;
export declare function deepEqual(a: any, b: any): boolean;
export declare function replaceObject<A extends object>(dest: A, src: A): A;
export declare const SafeObjectOptions: {
    throwError: boolean;
};
/**
 * make a loss object, very forgiving
 * */
export declare function createSafeObject(target?: object): any;
export declare const updateObject: <T extends object, U extends object>(dest: T) => (x: U) => T & U;
export declare const isNull: (x: any) => boolean;
export declare function removeNull<A>(o: A): A;
/**
 * @param {any}       o           : value to be checked
 * @param {boolean}   skip        : true will remove duplicated value silently;
 *                                  false will throw an error upon duplication
 * @param {any}       placeholder : custom value to replace duplicated object
 * @param {function}  mapper      : optional map function
 * @param {Set}       visited     : internal book keeping seen objects
 * */
export declare function ensureNonCyclic<A>(o: A, skip?: boolean, placeholder?: any, mapper?: (a: any) => any, visited?: Set<unknown>): A;
export declare function deleteUndefined(o: ApplyUndefinedType): void;
/**
 * to encode json data in csv-style
 * i.e. only need to store the keys once for a large collection (e.g. Array / Set)
 * */
export declare function objectToValues<T extends object>(o: T, keys?: Array<keyof T>): Array<T[keyof T]>;
/**
 * to decode json data from csv-style
 * i.e. populate values and keys to a collection (e.g. Array / Set)
 * */
export declare function valuesToObject<T>(values: Array<T[keyof T]>, keys: Array<keyof T>): T;
export declare function objectGetOrSetDefault<V = any, K extends PropertyKey = string>(object: Record<K, V>, key: K, f: () => V): V;
export declare function objectPick<T extends object, K extends keyof T = keyof T>(object: T, keys: K[]): Pick<T, K>;
export declare function incObject<K extends PropertyKey>(object: Record<K, number>, key: K): void;
