Skip to content

Commit b38bf15

Browse files
author
chengyifan
committedMay 22, 2022
regexp
1 parent 6244dc9 commit b38bf15

File tree

2 files changed

+140
-6
lines changed

2 files changed

+140
-6
lines changed
 

‎core.ts

+25-6
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ type _NArrayNumber<L extends number> = _NArray<number, L>;
3535
type $CastType<X, Y, Default extends Y> = X extends Y ? X : Default;
3636

3737
// 遍历数组
38-
type _ArrayStuct<T, Head extends T, Tail extends T[]> = [Head, ...Tail];
38+
type $ArrayStuct<T, Head extends T, Tail extends T[]> = [Head, ...Tail];
3939

4040
type $Bool = 1 | 0; // True & False
4141

@@ -74,9 +74,9 @@ type $Join<
7474
Result extends string = ""
7575
> = Arr extends []
7676
? Result
77-
: Arr extends _ArrayStuct<Arr[0], infer Word, []>
77+
: Arr extends $ArrayStuct<Arr[0], infer Word, []>
7878
? `${Result}${Word}`
79-
: Arr extends _ArrayStuct<Arr[0], infer Word, infer Tail>
79+
: Arr extends $ArrayStuct<Arr[0], infer Word, infer Tail>
8080
? $Join<Tail, Sp, `${Result}${Word}${Sp}`>
8181
: never;
8282

@@ -227,9 +227,14 @@ type $Subtract<
227227
Y1 extends $Number = Y extends $Number ? Y : $$Number<$CastType<Y, number, 0>>
228228
> = $Add<X1, $ReverseSign<Y1>>;
229229

230-
type $EQ<X extends $Number, Y extends $Number> = X["value"] extends Y["value"]
231-
? 1
232-
: 0;
230+
type $EQ<
231+
X extends $Number | number,
232+
Y extends $Number | number,
233+
X1 extends $Number = X extends $Number
234+
? X
235+
: $$Number<$CastType<X, number, 0>>,
236+
Y1 extends $Number = Y extends $Number ? Y : $$Number<$CastType<Y, number, 0>>
237+
> = X1["value"] extends Y1["value"] ? 1 : 0;
233238

234239
type $GT<
235240
X extends $Number | number,
@@ -249,6 +254,20 @@ type $LT<
249254
Y1 extends $Number = Y extends $Number ? Y : $$Number<$CastType<Y, number, 0>>
250255
> = $LTZ<$CastType<$Subtract<X1, Y1>, $Number, $$Number<0>>>;
251256

257+
type $Max<X extends $Number | number, Y extends $Number | number> = $LT<
258+
X,
259+
Y
260+
> extends 1
261+
? Y
262+
: X;
263+
264+
type $Min<X extends $Number | number, Y extends $Number | number> = $LT<
265+
X,
266+
Y
267+
> extends 1
268+
? X
269+
: Y;
270+
252271
// 乘法
253272
type $Multiply<
254273
X extends $Number | number,

‎regexp.ts

+115
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
type $Digital = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
2+
type _Al = "abcdefghijklmnopqrstvuwxyz";
3+
type _Au = "ABCDEFGHIJKLMNOPQRSTVUWXYZ";
4+
type _Aa = `${_Al}${_Au}`;
5+
type $Alphabets_lower = $Split<_Al>[number];
6+
type $Alphabets_upper = $Split<_Au>[number];
7+
type $Alphabets = $Alphabets_lower | $Alphabets_upper;
8+
type $Words = $Digital | $Alphabets | "_";
9+
10+
type $Split<Str extends string, Result extends string[] = []> = Str extends ""
11+
? Result
12+
: Str extends `${infer Head}${infer Tail}`
13+
? $Split<Tail, [...Result, Head]>
14+
: [];
15+
16+
type $Slice<
17+
Str extends string,
18+
From extends number,
19+
To extends number,
20+
I extends number = 0,
21+
Arr extends string[] = $Split<Str>,
22+
ToBound extends number = $Min<Arr["length"], To>,
23+
Result extends [string, string, string] = ["", "", ""]
24+
> = $LT<I, From> extends 1
25+
? $Slice<
26+
Str,
27+
From,
28+
To,
29+
$Add<I, 1>["value"],
30+
Arr,
31+
ToBound,
32+
[`${Result[0]}${Arr[I]}`, Result[1], Result[2]]
33+
>
34+
: $LT<I, ToBound> extends 1
35+
? $Slice<
36+
Str,
37+
From,
38+
To,
39+
$Add<I, 1>["value"],
40+
Arr,
41+
ToBound,
42+
[Result[0], `${Result[1]}${Arr[I]}`, Result[2]]
43+
>
44+
: $LT<I, Arr["length"]> extends 1
45+
? $Slice<
46+
Str,
47+
From,
48+
To,
49+
$Add<I, 1>["value"],
50+
Arr,
51+
ToBound,
52+
[Result[0], Result[1], `${Result[2]}${Arr[I]}`]
53+
>
54+
: Result;
55+
56+
type $SliceToCharArray<
57+
Str extends string,
58+
From extends number,
59+
To extends number,
60+
I extends number = 0,
61+
Arr extends string[] = $Split<Str>,
62+
ToBound extends number = $Min<Arr["length"], To>,
63+
Result extends string[] = []
64+
> = $LT<I, From> extends 1
65+
? $SliceToCharArray<Str, From, To, $Add<I, 1>["value"], Arr, ToBound, Result>
66+
: $LT<I, ToBound> extends 1
67+
? $SliceToCharArray<
68+
Str,
69+
From,
70+
To,
71+
$Add<I, 1>["value"],
72+
Arr,
73+
ToBound,
74+
[...Result, Arr[I]]
75+
>
76+
: $LT<I, Arr["length"]> extends 1
77+
? $SliceToCharArray<Str, From, To, $Add<I, 1>["value"], Arr, ToBound, Result>
78+
: Result;
79+
80+
type $Repeat<
81+
Str extends string,
82+
N extends number,
83+
Result extends string = ""
84+
> = N extends 0
85+
? Result
86+
: $Repeat<Str, $Subtract<N, 1>["value"], `${Result}${Str}`>;
87+
88+
type _RepeatRange<
89+
Str extends string,
90+
M extends number,
91+
N extends number,
92+
Result extends string[] = []
93+
> = $LT<M, $Add<N, 1>["value"]> extends 1
94+
? _RepeatRange<Str, $Add<M, 1>["value"], N, [...Result, $Repeat<Str, M>]>
95+
: Result;
96+
97+
type $RepeatRange<
98+
Str extends string,
99+
M extends number,
100+
N extends number
101+
> = $ArrayToUnion<_RepeatRange<Str, M, N>>;
102+
103+
type $ArrayToUnion<T extends any[]> = number extends keyof T
104+
? T[number]
105+
: never;
106+
107+
type Color = `#${$RepeatRange<"a" | "b", 3, 6>}`;
108+
109+
const c: Color = "#aba";
110+
111+
type $AlphaRange<From extends number, To extends number> = $ArrayToUnion<
112+
$SliceToCharArray<_Aa, From, To>
113+
>;
114+
115+
type a = $AlphaRange<3, 7>;

0 commit comments

Comments
 (0)
Please sign in to comment.