-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcollection.ts
47 lines (43 loc) · 1.14 KB
/
collection.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
42
43
44
45
46
47
import type { $Add, $Min, $LT, $GT } from "./core";
export type $Split<
Str extends string,
Result extends string[] = []
> = Str extends ""
? Result
: Str extends `${infer Head}${infer Tail}`
? $Split<Tail, [...Result, Head]>
: [];
export type $SplitByChar<
Str extends string,
Char extends string,
I extends number = 0,
SP extends string[] = $Split<Str>,
TO extends number = SP["length"],
CUM extends string = "",
Result extends string[] = []
> = $LT<I, TO> extends 0
? [...Result, CUM]
: SP[I] extends Char
? $SplitByChar<Str, Char, $Add<I, 1>["value"], SP, TO, "", [...Result, CUM]>
: $SplitByChar<
Str,
Char,
$Add<I, 1>["value"],
SP,
TO,
`${CUM}${SP[I]}`,
Result
>;
export type $Slice<
Str extends string,
From extends number,
To extends number,
Result extends string = "",
SP extends string[] = $Split<Str>,
ToBound extends number = $Min<SP["length"], To>
> = $LT<From, ToBound> extends 0
? Result
: $Slice<Str, $Add<From, 1>["value"], To, `${Result}${SP[From]}`>;
export type $ArrayToUnion<T extends any[]> = number extends keyof T
? T[number]
: never;