import type { Placeholder } from './placeholder.d.mts'; 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; export type NormalizeFn any, Arity extends number> = Fn extends ( ...args: infer Args ) => infer Result ? number extends Parameters['length'] ? (...args: TupleOf) => Result : Fn : Fn; export 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; export type Curried< Fn extends (...args: any[]) => any, NormalizedFn extends (...args: any[]) => any, Arity extends number = TupleLength>, > = CurriedFn & { arity: Arity; fn: Fn; }; export {};