/// <reference types="@rbxts/compiler-types" />
import { InferArguments, InferTypeFromValidator2, InferValidator, Validator, ZirconValidator } from "./ZirconTypeValidator";
import { ZirconFunction } from "./ZirconFunction";
import { ZirconContext } from "./ZirconContext";
import { ZrValue } from "@rbxts/zirconium/out/Data/Locals";
export declare class ZirconFunctionBuilder<V extends ZirconValidator<unknown, unknown>[] = [
]> {
    private name;
    private validators;
    private varadicValidator?;
    private hasVariadic;
    private description?;
    constructor(name: string);
    private GetValidator;
    private GetUnionableValidator;
    /**
     * Adds an argnument to this zircon function
     * @param argValidator The argument type/validator
     * @param description The description for this argument
     * @returns The builder
     */
    AddArgument<TValidation extends Validator>(argValidator: TValidation | TValidation[], description?: string): ZirconFunctionBuilder<[...V, InferValidator<TValidation>]>;
    /**
     * Adds an argnument to this zircon function
     * @param argValidator The argument type/validator
     * @param description The description for this argument
     * @returns The builder
     */
    AddArrayArgument<TValidation extends Validator>(argValidator: TValidation | TValidation[], description?: string): ZirconFunctionBuilder<[...V, ZirconValidator<InferTypeFromValidator2<InferValidator<TValidation>>[], never>]>;
    /**
     * Adds a varadic argument to this zircon function
     * @param arg
     * @returns
     */
    AddVariadicArgument<TValidation extends Validator>(arg: TValidation | TValidation[]): Omit<ZirconFunctionBuilder<[...V, ...InferValidator<TValidation>[]]>, "AddArgument" | "AddVariadicArgument">;
    /**
     * Adds a description to the function
     * @param description The description of this function
     * @returns
     */
    AddDescription(description: string): Omit<this, "AddDescription">;
    Bind<R extends ZrValue | void>(fn: (context: ZirconContext, ...args: InferArguments<V>) => R): ZirconFunction<V, R>;
}
