-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday22.ts
60 lines (56 loc) · 1.8 KB
/
day22.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
48
49
50
51
52
53
54
55
56
57
58
59
60
type Prettify<T> = { [K in keyof T]: Prettify<T[K]> }
type Trim<
T extends string,
U extends string = ' ' | '\t' | '\n' | ',',
> = T extends `${infer F}${U}` | `${U}${infer F}` ? Trim<F> : T
type Parse<T extends string, _Trimmed extends string = Trim<T>> = Prettify<
_Trimmed extends `{${infer U}}`
? ParseObjectContent<U>
: _Trimmed extends `[${infer U}]`
? ParseArrayContent<U>
: _Trimmed extends `${infer P extends number | boolean | null}`
? P
: ParseString<_Trimmed>
>
type EscapeCharMap = { r: '\r'; n: '\n'; b: '\b'; f: '\f' }
type HandleEscapeChar<
T extends string,
_Res extends string = '',
> = T extends `${infer F}\\${infer Char extends keyof EscapeCharMap}${infer R}`
? HandleEscapeChar<R, `${_Res}${F}${EscapeCharMap[Char]}`>
: `${_Res}${T}`
type ParseString<T extends string> = T extends `"${infer U}"`
? HandleEscapeChar<U>
: T
type ParseArrayContent<
T extends string,
_Acc extends any[] = [],
_Trimmed extends string = Trim<T>,
> = _Trimmed extends `{${infer F}}${infer R}`
? ParseArrayContent<R, [..._Acc, ParseObjectContent<F>]>
: _Trimmed extends `${infer F},${infer R}`
? ParseArrayContent<R, [..._Acc, Parse<F>]>
: Parse<_Trimmed> extends ''
? _Acc
: [..._Acc, Parse<_Trimmed>]
type ParseObjectContent<
T extends string,
_Acc extends Record<PropertyKey, any> = {},
_Trimmed extends string = Trim<T>,
> = _Trimmed extends `${infer K}:${infer V}`
? Trim<V> extends `[${infer V}]${infer R}`
? ParseObjectContent<
R,
_Acc & {
[Key in K as ParseString<Key>]: ParseArrayContent<V>
}
>
: V extends `${infer V},${infer R}`
? ParseObjectContent<
R,
_Acc & { [Key in K as ParseString<Key>]: Parse<V> }
>
: _Acc & {
[Key in K as ParseString<Key>]: Parse<V>
}
: _Acc