// Pending: https://stackoverflow.com/questions/68761267/capture-generic-type-of-passed-function-for-overloads-in-typescript // TODO: refactor "./value.ts" with this when/if resolved /* eslint-disable @typescript-eslint/no-explicit-any */ export function curried( fn: (...args: [...TLeadingParameters, TLastParameter]) => TReturn ) { return (...args: TLeadingParameters) => (curried: TLastParameter) => fn(...[...args, curried]); } type Leading = T extends [...infer I, infer _] ? I : never; type Last = T extends [...infer _, infer I] ? I : never; export function overloadWithCurried any>( fn: F ): { (...args: Parameters): ReturnType; (...args: Leading>): (curried: Last>) => ReturnType; } { return (...args) => args.length == fn.length - 1 ? (curried: any) => fn(...[...args, curried]) : fn(...args); }