import {Future} from './index.ts' type FuturifyArgs = { [K in keyof Args]: Args[K] | Future } type FuturifyReturn = R extends Promise ? Future : Future type FuturifyOverload any> = ( ...args: FuturifyArgs> ) => FuturifyReturn> type Futurified = F extends { (...args: infer A1): infer R1 (...args: infer A2): infer R2 (...args: infer A3): infer R3 (...args: infer A4): infer R4 (...args: infer A5): infer R5 } ? FuturifyOverload<(...args: A1) => R1> & FuturifyOverload<(...args: A2) => R2> & FuturifyOverload<(...args: A3) => R3> & FuturifyOverload<(...args: A4) => R4> & FuturifyOverload<(...args: A5) => R5> : F extends (...args: infer A) => infer R ? FuturifyOverload : never export function futurify any>(fn: F): Futurified { return ((...args: any[]) => { const resolvedArgsFuture = Promise.all(args) return new Future(async () => { const resolvedArgs = await resolvedArgsFuture return fn(...resolvedArgs) }) }) as unknown as Futurified }