declare const enum Placeholder { Value = '<<\u200BCURRIABLE PLACEHOLDER\u200B>>', } declare const __ = Placeholder.Value; type TupleOf = S extends A['length'] ? A : TupleOf; type TupleLength = A extends unknown ? (number extends A['length'] ? never : A['length']) : never; type DefaultableParams = Initial extends [infer H, ...infer T] ? DefaultableParams : Defaultable; type Initial = S extends TupleLength ? I : A extends [infer H, ...infer T] ? Initial : I; type RequiredFirstParam any, Arity extends number> = Initial, Arity> extends [infer Head, ...infer Tail] ? [Head | Placeholder.Value, ...Partial] : []; type RemainingParameters = AppliedParams extends [ infer AHead, ...infer ATail, ] ? ExpectedParams extends [infer EHead, ...infer ETail] ? AHead extends Placeholder.Value ? [EHead, ...RemainingParameters] : RemainingParameters : [] : ExpectedParams; type NormalizeFn any, Arity extends number> = Fn extends ( ...args: infer Args ) => infer Result ? number extends Parameters['length'] ? (...args: TupleOf) => Result : Fn : Fn; type CurriedFn any, Arity extends number> = < AppliedParams extends RequiredFirstParam, >( ...args: [...AppliedParams, ...extraArgs: unknown[]] ) => RemainingParameters, Arity>> extends [unknown, ...unknown[]] ? CurriedFn< (...args: RemainingParameters, Arity>>) => ReturnType, Arity > : ReturnType; type Curried< Fn extends (...args: any[]) => any, NormalizedFn extends (...args: any[]) => any, Arity extends number = TupleLength>, > = CurriedFn & { arity: Arity; fn: Fn; }; /** * Get the method passed as a curriable method based on its parameters */ declare function curry any, Arity extends number = Parameters['length']>( fn: Fn, arityOverride?: Arity, ): number extends Arity ? never : Curried, Arity>; /** * Return a function that is the non-curried version of the fn passed. */ declare function uncurry any, (...args: any[]) => any, number>>( curried: CurriedFn, ): CurriedFn['fn']; export { __, curry, uncurry };