koSakano/type-challenges

462 - Currying 2

Opened this issue · 0 comments

type Cut<T extends any[], U extends any[], Acc extends any[] = []> = U extends [infer UH, ...infer UR]
  ? T extends [infer TH, ...infer TR]
    ? Cut<TR, UR, Acc>
    : never
  : T extends [infer TH, ...infer TR]
    ? Cut<TR, [], [...Acc, TH]>
    : Acc
type Slice<T> = T extends [infer x, ...infer xs] ? [x, ...Slice<xs>] | [x] : never;
type Curry<T extends any[], R> = T extends [infer Head, ...infer Rest]
  ? <S extends Slice<Rest> | []>(head: Head, ...args: S) =>  Curry<Cut<Rest, S>, R>
  : R;

declare function DynamicParamsCurrying<T extends any[], R>(fn: (...args: T) => R): Curry<T, R>