export declare class FunctionX0 { private fn; /** * @hidden */ constructor(fn: () => R); apply(): R; } declare type THead = T extends [infer R, ...any[]] ? R : T extends [] ? undefined : never; declare type TTail = ((...args: T) => void) extends ((first: any, ...rest: infer S1) => void) ? S1 : T extends [infer S2] ? [] : T extends [] ? [] : never; declare type TLast = T extends [] ? never : T extends [infer T1] ? T1 : { 0: TTail; 1: never; }[T extends [infer T1, infer S] ? 0 : 1]; declare type TInit = { 0: ((...args: T) => void) extends ((first: infer T1, ...rest: infer T2) => void) ? (((a: T1, ...rest: TInit) => void) extends ((...all: infer AP) => void) ? AP : never) : never; 1: []; }[T extends [] | [any] ? 1 : 0]; declare type TReverse = { 2: []; 3: ((a: TLast, ...args: TReverse>) => void) extends ((...all: infer AP) => void) ? AP : never; }[T extends [] ? 2 : 3]; declare type Apply1ReturnType = P extends [infer T1, infer T2, ...any[]] ? (((...args: P) => void) extends ((first: any, ...rest: infer S1) => void) ? FunctionX : never) : FunctionX0; declare type CurryReturnType = { 0: FunctionX; 1: FunctionX, TTail

, R>>; }[P extends [infer T1, ...any[]] ? 1 : 0]; export declare class FunctionX { private fn; private constructor(); static of(fn: () => R): FunctionX0; static of(fn: (p1: T, ...p: P) => R): FunctionX; apply(p1: T, ...rest: P): R; apply1(p: T): Apply1ReturnType; curried(): CurryReturnType; tupled(): ((a: T, ...args: P) => R) extends ((...allP: infer AP) => infer R1) ? FunctionX : never; flipped(): FunctionX, TTail>, R>; } export {};