import { ArgumentTypes } from './types';
import { Thunk, UnwrapThunkDeep } from './thunk';
export declare type UnwrapPromise<T> = T extends Promise<infer U> ? Exclude<U, Promise<T>> : T;
export declare type Unbox<T> = UnwrapThunkDeep<UnwrapPromise<T>>;
export declare type Cont<A extends any[], R> = (...args: A) => Thunk<Unbox<R>>;
export interface Trampoline<F extends ((...args: any[]) => any)> {
    (...args: ArgumentTypes<F>): Unbox<ReturnType<F>>;
    cont: Cont<ArgumentTypes<F>, ReturnType<F>>;
}
export interface TrampolineAsync<F extends ((...args: any[]) => any)> {
    (...args: ArgumentTypes<F>): Promise<Unbox<ReturnType<F>>>;
    cont: Cont<ArgumentTypes<F>, ReturnType<F>>;
}
export declare const trampoline: <F extends (...args: any[]) => any>(fn: F) => Trampoline<F>;
export declare const trampolineAsync: <F extends (...args: any[]) => any>(fn: F) => TrampolineAsync<F>;
