declare type FormState<T> = SuccessState<T> | ErrorState | LoadingState | ReadyState;
interface SuccessState<T> {
    kind: "success";
    result: T;
}
interface ErrorState {
    kind: "error";
    msg: string;
}
interface LoadingState {
    kind: "loading";
}
interface ReadyState {
    kind: "ready";
}
export declare class FormStateHandler<T = unknown> {
    readonly isSuccess: boolean;
    readonly isError: boolean;
    readonly isLoading: boolean;
    readonly isReady: boolean;
    readonly result: T | undefined;
    readonly errorMsg: string | undefined;
    readonly state: FormState<T>;
    private readonly setState;
    private handlers;
    constructor(state: FormState<T>, setState: (state: FormState<T>) => void);
    match<S>(matchers: {
        success?: (t: T) => S;
        error?: (msg: string) => S;
        ready?: () => S;
        loading?: () => S;
    }): S | undefined;
    success(result: T): void;
    error(msg: string): void;
    loading(): void;
    ready(): void;
    handleSuccess(callback: (t: T) => void): void;
    handleError(callback: (msg: string) => void): void;
}
export declare type FormResult<T> = SuccessState<T> | ErrorState;
export declare function formResultPromise<T = unknown>(fun: (handler: FormStateHandler<T>) => void): Promise<FormResult<T>>;
export declare function useFormState<T = unknown>(): FormStateHandler<T>;
export {};
