-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathindex.ts
62 lines (53 loc) · 1.3 KB
/
index.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
61
62
type HexMap = {
"0": 0;
"1": 1;
"2": 2;
"3": 3;
"4": 4;
"5": 5;
"6": 6;
"7": 7;
"8": 8;
"9": 9;
A: 10;
B: 11;
C: 12;
D: 13;
E: 14;
F: 15;
};
type GetDec<T> = T extends keyof HexMap ? HexMap[T] : never;
type Length<T extends any[]> = T["length"] & number;
type Push<T extends any[], Val> = [...T, Val];
type NTuple<
N extends number,
T extends any[] = []
> = N extends T['length'] ? T : NTuple<N, Push<T, any>>;
type Add<A extends number, B extends number> = Length<
// @ts-ignore
[...NTuple<A>, ...NTuple<B>]
>;
type Subtract<A extends number, B extends number> = NTuple<A> extends [
...infer U,
...NTuple<B>
]
? Length<U>
: never;
type MultiAdd<
N extends number,
A extends number,
I extends number
> = I extends 0 ? A : MultiAdd<N, Add<N, A>, Subtract<I, 1>>;
type Multiply<A extends number, B extends number> = MultiAdd<A, 0, B>;
type HexToRgb<T> =
T extends `${infer R1}${infer R2}${infer G1}${infer G2}${infer B1}${infer B2}`
? [
Add<Multiply<GetDec<R1>, 16>, GetDec<R2>>,
Add<Multiply<GetDec<G1>, 16>, GetDec<G2>>,
Add<Multiply<GetDec<B1>, 16>, GetDec<B2>>
]
: never;
type Demo1 = HexToRgb<`AFDD55`>; // 170,221,85
type Demo2 = HexToRgb<`FF8645`>; // 255,134,69
type Demo3 = HexToRgb<`AF4E85`>; // 175,78,133
export {};