216 - Slice
Opened this issue · 0 comments
koSakano commented
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;