export type ExperimentFunction<TParams extends any[], TResult> = (...args: TParams) => TResult;
export type ExperimentAsyncFunction<TParams extends any[], TResult> = ExperimentFunction<TParams, Promise<TResult>>;
export interface Results<TParams extends any[], TResult> {
    experimentName: string;
    experimentArguments: TParams;
    controlResult?: TResult;
    candidateResult?: TResult;
    controlError?: any;
    candidateError?: any;
    controlTimeMs?: number;
    candidateTimeMs?: number;
}
export interface Options<TParams extends any[], TResult> {
    publish?: (results: Results<TParams, TResult>) => void;
    enabled?: (...args: TParams) => boolean;
}
export type OptionsSync<TParams extends any[], TResult> = Options<TParams, TResult>;
export type OptionsAsync<TParams extends any[], TResult> = Options<TParams, TResult> & {
    inParallel?: boolean;
};
/**
 * A factory that creates an experiment function.
 *
 * @param name - The name of the experiment, typically for use in publish.
 * @param control - The legacy function you are trying to replace.
 * @param candidate - The new function intended to replace the control.
 * @param [options] - Options for the experiment. You will usually want to specify a publish function.
 * @returns A function that acts like the control while also running the candidate and publishing results.
 */
export declare function experiment<TParams extends any[], TResult>({ name, control, candidate, options }: {
    name: string;
    control: ExperimentFunction<TParams, TResult>;
    candidate: ExperimentFunction<TParams, TResult>;
    options?: OptionsSync<TParams, TResult>;
}): ExperimentFunction<TParams, TResult>;
/**
 * A factory that creates an asynchronous experiment function.
 *
 * @param name - The name of the experiment, typically for use in publish.
 * @param control - The legacy async function you are trying to replace.
 * @param candidate - The new async function intended to replace the control.
 * @param [options] - Options for the experiment. You will usually want to specify a publish function.
 * @returns An async function that acts like the control while also running the candidate and publishing results.
 */
export declare function experimentAsync<TParams extends any[], TResult>({ name, control, candidate, options }: {
    name: string;
    control: ExperimentAsyncFunction<TParams, TResult>;
    candidate: ExperimentAsyncFunction<TParams, TResult>;
    options?: OptionsAsync<TParams, TResult>;
}): ExperimentAsyncFunction<TParams, TResult>;
