UNPKG

trampoline-ts

Version:

A type-safe way to emulate tail-call optimization with trampolines

16 lines (15 loc) 891 B
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>;