trampoline-ts
Version:
A type-safe way to emulate tail-call optimization with trampolines
16 lines (15 loc) • 891 B
TypeScript
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>;