-
Notifications
You must be signed in to change notification settings - Fork 0
/
slice.ts
41 lines (38 loc) · 984 Bytes
/
slice.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Add, Subtract } from "./add";
import { Length } from "./length";
type SliceStart<
T extends readonly any[],
S extends number,
U extends any[] = []
> = Subtract<Add<T["length"], U["length"]>, S> extends never
? []
: U["length"] extends S
? T
: T extends [infer First, ...infer Rest]
? Rest extends readonly any[]
? SliceStart<Rest, S, [...U, First]>
: never
: never;
type SliceEnd<
T extends readonly any[],
S extends number,
U extends any[] = []
> = Subtract<Add<T["length"], U["length"]>, S> extends never
? []
: U["length"] extends S
? T
: T extends [...infer Rest, infer Last]
? Rest extends readonly any[]
? SliceEnd<Rest, S, [Last, ...U]>
: never
: U;
export type Slice<
T extends readonly any[],
S extends number = 0,
E = Length<T>
> = Length<T> extends never
? T
: E extends number
? SliceStart<SliceEnd<T, Subtract<T["length"], E>>, S>
: [];