koSakano/type-challenges

216 - Slice

Opened this issue · 0 comments

type Slice<Arr extends any[], Start extends number = 0, End extends number = Arr['length']> = Iterate<Start, End, [], Arr, [], false>;
type Iterate<Start extends number, End extends number, Head extends any[], Tail extends any[], Result extends any[], InRange extends boolean>
  = Tail extends [infer X, ...infer XS] ? (
    IndexMatches<Head, Tail, End> extends true ? Result :
    Or<InRange, IndexMatches<Head, Tail, Start>> extends true ? Iterate<Start, End, [...Head, X], XS, [...Result, X], true> :
    Iterate<Start, End, [...Head, X], XS, Result, false>
  ) : Result;

type IndexMatches<Head extends any[], Tail extends any[], Index extends number> =
  Head['length'] extends Index ? true :
  `-${Tail['length']}` extends `${Index}` ? true :
  false;

type Or<A extends boolean, B extends boolean> = A extends true ? true : B extends true ? true : false;