import { CloneConfig } from "./cloneConfig";
import { Cloner } from "./cloner";
import { CloneContext } from "./cloneContext";
export declare const SelfClone: unique symbol;
export declare const GetSelfCloner: unique symbol;
/**
 * Will clone {@link input}.
 *
 * @param input Input to be cloned.
 * @param options Optional options to influence the cloning operations. See {@link CloneConfig}.
 * @returns Cloned value/object of {@link input}.
 */
export declare function makeClone<T>(input: T, options?: {
    config?: CloneConfig;
    setupConfig?: (x: CloneConfig) => void;
}): T;
/**
 * Will clone {@link input}.
 *
 * @param input Input to be cloned.
 * @param context Contextual information about cloning operation. See {@link CloneContext}.
 * @returns Cloned value/object of {@link input}.
 */
export declare function makeContextualClone<T>(input: T, context: CloneContext): T;
/**
 * The basic implementation of object cloning operation.
 *
 * @param input Input (object) to be cloned.
 * @param context Contextual information about cloning operation. See {@link CloneContext}.
 * @returns Cloned object of {@link input}.
 */
export declare function makeBasicObjectClone<T extends object>(input: T, context: CloneContext): T;
export declare function cloneObjectKeys<T extends object>(original: T, result: T, context: CloneContext): void;
/**
 * Will resolve proper cloner for specified {@link input}.
 * If no cloner is eligible, the NULL is returned.
 *
 * @param input Input supposed to be cloned.
 * @param context Contextual information about cloning operation. See {@link CloneContext}.
 * @returns NULL or cloner supposed to be used to clone the specified {@link input}.
 */
export declare function resolveCloner<T>(input: T, context: CloneContext): Cloner;
