Skip to content

Commit 349b7db

Browse files
author
chengyifan
committed
update
1 parent 468c6e8 commit 349b7db

File tree

3 files changed

+124
-229
lines changed

3 files changed

+124
-229
lines changed

collection.ts

+28-217
Original file line numberDiff line numberDiff line change
@@ -1,236 +1,47 @@
1-
type _Dd = "0123456789";
2-
type _Al = "abcdefghijklmnopqrstvuwxyz";
3-
type _Au = "ABCDEFGHIJKLMNOPQRSTVUWXYZ";
4-
type _Aa = `${_Al}${_Au}`;
5-
type $Digital = $Split<_Dd>[number];
6-
type $Alphabets_lower = $Split<_Al>[number];
7-
type $Alphabets_upper = $Split<_Au>[number];
8-
type $Alphabets = $Alphabets_lower | $Alphabets_upper;
9-
type $Words = $Digital | $Alphabets | "_";
1+
import type { $Add, $Min, $LT, $GT } from "./core";
102

11-
type $FindCharIndex<
12-
Target extends $Alphabets,
13-
Str extends string = _Aa,
14-
Result extends number = 0
15-
> = Str extends ""
16-
? -1
17-
: Str extends `${infer U}${infer Tail}`
18-
? U extends Target
19-
? Result
20-
: $FindCharIndex<Target, Tail, $Add<Result, 1>["value"]>
21-
: Result;
22-
23-
type $FindDigitalIndex<
24-
Target extends $Digital,
25-
Str extends string = _Dd,
26-
Result extends number = 0
3+
export type $Split<
4+
Str extends string,
5+
Result extends string[] = []
276
> = Str extends ""
28-
? -1
29-
: Str extends `${infer U}${infer Tail}`
30-
? U extends Target
31-
? Result
32-
: $FindDigitalIndex<Target, Tail, $Add<Result, 1>["value"]>
33-
: Result;
34-
35-
type $Split<Str extends string, Result extends string[] = []> = Str extends ""
367
? Result
378
: Str extends `${infer Head}${infer Tail}`
389
? $Split<Tail, [...Result, Head]>
3910
: [];
4011

41-
type $Slice<
12+
export type $SplitByChar<
4213
Str extends string,
43-
From extends number,
44-
To extends number,
14+
Char extends string,
4515
I extends number = 0,
46-
Arr extends string[] = $Split<Str>,
47-
ToBound extends number = $Min<Arr["length"], To>,
48-
Result extends [string, string, string] = ["", "", ""]
49-
> = $LT<I, From> extends 1
50-
? $Slice<
51-
Str,
52-
From,
53-
To,
54-
$Add<I, 1>["value"],
55-
Arr,
56-
ToBound,
57-
[`${Result[0]}${Arr[I]}`, Result[1], Result[2]]
58-
>
59-
: $LT<I, ToBound> extends 1
60-
? $Slice<
61-
Str,
62-
From,
63-
To,
64-
$Add<I, 1>["value"],
65-
Arr,
66-
ToBound,
67-
[Result[0], `${Result[1]}${Arr[I]}`, Result[2]]
68-
>
69-
: $LT<I, Arr["length"]> extends 1
70-
? $Slice<
16+
SP extends string[] = $Split<Str>,
17+
TO extends number = SP["length"],
18+
CUM extends string = "",
19+
Result extends string[] = []
20+
> = $LT<I, TO> extends 0
21+
? [...Result, CUM]
22+
: SP[I] extends Char
23+
? $SplitByChar<Str, Char, $Add<I, 1>["value"], SP, TO, "", [...Result, CUM]>
24+
: $SplitByChar<
7125
Str,
72-
From,
73-
To,
26+
Char,
7427
$Add<I, 1>["value"],
75-
Arr,
76-
ToBound,
77-
[Result[0], Result[1], `${Result[2]}${Arr[I]}`]
78-
>
79-
: Result;
28+
SP,
29+
TO,
30+
`${CUM}${SP[I]}`,
31+
Result
32+
>;
8033

81-
type $SliceToCharArray<
34+
export type $Slice<
8235
Str extends string,
8336
From extends number,
8437
To extends number,
85-
I extends number = 0,
86-
Arr extends string[] = $Split<Str>,
87-
ToBound extends number = $Min<Arr["length"], To>,
88-
Result extends string[] = []
89-
> = $LT<I, From> extends 1
90-
? $SliceToCharArray<Str, From, To, $Add<I, 1>["value"], Arr, ToBound, Result>
91-
: $LT<I, ToBound> extends 1
92-
? $SliceToCharArray<
93-
Str,
94-
From,
95-
To,
96-
$Add<I, 1>["value"],
97-
Arr,
98-
ToBound,
99-
[...Result, Arr[I]]
100-
>
101-
: $LT<I, Arr["length"]> extends 1
102-
? $SliceToCharArray<Str, From, To, $Add<I, 1>["value"], Arr, ToBound, Result>
103-
: Result;
104-
105-
type $Repeat<
106-
Str extends string,
107-
N extends number,
108-
Result extends string = ""
109-
> = N extends 0
38+
Result extends string = "",
39+
SP extends string[] = $Split<Str>,
40+
ToBound extends number = $Min<SP["length"], To>
41+
> = $LT<From, ToBound> extends 0
11042
? Result
111-
: $Repeat<Str, $Subtract<N, 1>["value"], `${Result}${Str}`>;
112-
113-
type _RepeatRange<
114-
Str extends string,
115-
M extends number,
116-
N extends number,
117-
Result extends string[] = []
118-
> = $LT<M, $Add<N, 1>["value"]> extends 1
119-
? _RepeatRange<Str, $Add<M, 1>["value"], N, [...Result, $Repeat<Str, M>]>
120-
: Result;
43+
: $Slice<Str, $Add<From, 1>["value"], To, `${Result}${SP[From]}`>;
12144

122-
type $RepeatRange<
123-
Str extends string,
124-
M extends number,
125-
N extends number
126-
> = $ArrayToUnion<_RepeatRange<Str, M, N>>;
127-
128-
type $ArrayToUnion<T extends any[]> = number extends keyof T
45+
export type $ArrayToUnion<T extends any[]> = number extends keyof T
12946
? T[number]
13047
: never;
131-
132-
type $AlphaRange<
133-
From extends $Alphabets,
134-
To extends $Alphabets,
135-
From1 extends number = $FindCharIndex<From>,
136-
To1 extends number = $FindCharIndex<To>
137-
> = $ArrayToUnion<$SliceToCharArray<_Aa, From1, To1>> | To;
138-
139-
type $DigitalRange<
140-
From extends $Digital,
141-
To extends $Digital,
142-
From1 extends number = $FindDigitalIndex<From>,
143-
To1 extends number = $FindDigitalIndex<To>
144-
> = $ArrayToUnion<$SliceToCharArray<_Dd, From1, To1>> | To;
145-
146-
type $ArrayExclude<
147-
Arr extends T[],
148-
P extends T,
149-
T = string,
150-
Result extends T[] = []
151-
> = Arr extends []
152-
? Result
153-
: Arr extends [infer Head, ...infer Tail]
154-
? Head extends T
155-
? Head extends P
156-
? [...Result, ...Tail]
157-
: Tail extends T[]
158-
? $ArrayExclude<Tail, P, T, [...Result, Head]>
159-
: []
160-
: []
161-
: [];
162-
163-
type $Array2InsertHead<
164-
Arr extends T[][],
165-
Insert extends T,
166-
T = string,
167-
Result extends T[][] = []
168-
> = Arr extends []
169-
? Result
170-
: Arr extends [infer Head, ...infer Tail]
171-
? Head extends T[]
172-
? Tail extends T[][]
173-
? $Array2InsertHead<Tail, Insert, T, [...Result, [Insert, ...Head]]>
174-
: []
175-
: []
176-
: [];
177-
178-
type $Arrange<
179-
Coll extends string[],
180-
T extends number = 4,
181-
I extends number = 0,
182-
Result extends string[][] = []
183-
> = T extends 1
184-
? [Coll[0]]
185-
: T extends 2
186-
? [[Coll[1], Coll[0]], [Coll[0], Coll[1]]]
187-
: $LT<I, T> extends 1
188-
? $Arrange<
189-
Coll,
190-
T,
191-
$Add<I, 1>["value"],
192-
[
193-
...Result,
194-
...$Array2InsertHead<
195-
$Arrange<$ArrayExclude<Coll, Coll[I]>, $Subtract<T, 1>["value"]>,
196-
Coll[I]
197-
>
198-
]
199-
>
200-
: Result;
201-
202-
type $Comb2<Coll extends string[]> = [];
203-
204-
// 求子数组(相对顺序不变)
205-
type $Combine<
206-
Coll extends string[],
207-
T extends number = 4,
208-
I extends number = 0,
209-
J extends number = 0,
210-
K extends number = 0,
211-
TempResult extends string[] = [],
212-
Result extends string[][] = []
213-
> = T extends 1
214-
? [[Coll[0]]]
215-
: T extends 2
216-
? [[Coll[0]], [Coll[1]], [Coll[0], Coll[1]]]
217-
: $LT<I, T> extends 1
218-
? $Combine<Coll, T, $Add<I, 1>["value"], I, 0, [], []>
219-
: $LT<J, T> extends 1
220-
? $Combine<Coll, T, I, $Add<J, 1>["value"], I, [], Result>
221-
: Result;
222-
223-
type $MapJoin<
224-
Arr extends string[][],
225-
Sep extends string,
226-
Result extends string[] = []
227-
> = Arr extends []
228-
? Result
229-
: Arr extends [infer Head, ...infer Tail]
230-
? Head extends string[]
231-
? Tail extends string[][]
232-
? $MapJoin<Tail, Sep, [...Result, $Join<Head, Sep>]>
233-
: []
234-
: []
235-
: [];
236-

color.ts

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import type { $Add, $LT, $Subtract, $ParseInt, $Error } from "./core";
2+
import type { $Split, $ArrayToUnion, $Slice, $SplitByChar } from "./collection";
3+
4+
type VALID_HEX_VALUE = $ArrayToUnion<$Split<"0123456789abcdef">>;
5+
6+
type CharAt<X extends string, I extends number> = $Split<X>[I];
7+
type StrLen<X extends string> = $Split<X>["length"];
8+
9+
type ExtractHex<T extends string> = $LT<StrLen<T>, 9> extends 1
10+
? $Slice<T, 0, 2> extends "0x"
11+
? $Slice<T, 2, StrLen<T>>
12+
: never
13+
: never;
14+
15+
type ExtractRGB<T extends string, L extends number = StrLen<T>> = $Slice<
16+
T,
17+
0,
18+
4
19+
> extends "rgb("
20+
? $Slice<T, $Subtract<L, 1>["value"], L> extends ")"
21+
? $Slice<T, 4, $Subtract<L, 1>["value"]>
22+
: never
23+
: never;
24+
25+
type CheckHex<
26+
X extends string,
27+
I extends number = 0,
28+
E extends number = StrLen<X>
29+
> = I extends E
30+
? 1
31+
: CharAt<X, I> extends VALID_HEX_VALUE
32+
? CheckHex<X, $Add<I, 1>["value"], E>
33+
: 0;
34+
35+
type CheckRGBComponents<
36+
T extends string[],
37+
R extends number = $ParseInt<T[0]>,
38+
G extends number = $ParseInt<T[1]>,
39+
B extends number = $ParseInt<T[2]>
40+
> = T["length"] extends 3
41+
? R extends number
42+
? G extends number
43+
? B extends number
44+
? $LT<R, 256> extends 1
45+
? $LT<G, 256> extends 1
46+
? $LT<B, 256> extends 1
47+
? 1
48+
: 0
49+
: 0
50+
: 0
51+
: 0
52+
: 0
53+
: 0
54+
: 0;
55+
56+
type C_Hex<
57+
X extends string,
58+
Hex extends string | never = ExtractHex<X>,
59+
Check_Hex extends number = CheckHex<Hex>
60+
> = Check_Hex extends 1 ? X : never;
61+
62+
type C_RGB<
63+
X extends string,
64+
RGB extends string | never = ExtractRGB<X>,
65+
R_G_B extends string[] = RGB extends string ? $SplitByChar<RGB, ","> : [],
66+
Check_R_G_B extends number = CheckRGBComponents<R_G_B>
67+
> = Check_R_G_B extends 1 ? X : never;
68+
69+
type C_Color<X extends string> = C_Hex<X> extends string
70+
? X
71+
: C_RGB<X> extends string
72+
? X
73+
: never;
74+
75+
type A = C_Color<"rgb(1,1,1)">;

0 commit comments

Comments
 (0)