import type { CallbackInterface, Loadable, RecoilValue, Snapshot } from 'recoil';
export declare type Cancelled = () => boolean;
export declare type WaitFor = <T>(promiseOrMs: Promise<T> | number) => Promise<T | void>;
export declare type Fork = <Args extends readonly unknown[], Return = void>(taskCreator: (recoilTask: RecoilTaskInterface) => (...args: Args) => Return, executeArgs: Args, debugKey?: string) => {
    id: number;
    cancel: () => void;
    task: Promise<Return | undefined>;
    getTaskState: () => Task<Return> | undefined;
};
export declare type RecoilTaskInterface = CallbackInterface & {
    getSnapshot: RecoilGetSnapshot;
    getLoadable: Snapshot['getLoadable'];
    cancelled: Cancelled;
    waitFor: WaitFor;
    fork: Fork;
};
export declare type RecoilGetPromise = <T>(recoilValue: RecoilValue<T>) => Promise<T>;
export declare type RecoilGetLoadable = <T>(recoilValue: RecoilValue<T>) => Loadable<T>;
export declare type RecoilGetSnapshot = () => Snapshot;
export declare type RecoilStore = {
    set: CallbackInterface['set'];
    reset: CallbackInterface['reset'];
    refresh: CallbackInterface['refresh'];
    gotoSnapshot: CallbackInterface['gotoSnapshot'];
    getSnapshot: RecoilGetSnapshot;
    getPromise: Snapshot['getPromise'];
    getLoadable: Snapshot['getLoadable'];
};
export declare enum TaskStatus {
    Running = 0,
    Error = 1,
    Done = 2
}
export declare type TaskOptions<Data = unknown, Args = unknown> = {
    key?: string;
    errorStack?: boolean;
    loaderStack?: string | boolean;
    exclusive?: boolean;
    dataSelector?: RecoilValue<Data>;
    autoStart?: Args;
    cancelOnUnmount?: boolean;
};
export declare type Task<Data = unknown, Error = unknown> = {
    parentId?: number;
    id: number;
    status: TaskStatus;
    args: ReadonlyArray<unknown>;
    startedAt: Date;
    endAt?: Date;
    error?: Error;
    data?: Data;
    options?: TaskOptions;
    extra?: unknown;
};
export declare type ErrorAtom = {
    id: number;
    key?: string;
    error?: unknown;
    taskId?: number;
};
