type-plus 4.5.1 → 4.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,10 @@
1
- import type { IsPositive } from '../math';
2
- export declare type CreateTuple<L extends number, T = any> = IsPositive<L> extends true ? CreateTuple.Device<[], L, T> : never;
3
- export declare namespace CreateTuple {
4
- type Device<R extends any[], L extends number, T> = R['length'] extends L ? R : Device<[T, ...R], L, T>;
5
- }
1
+ import { IsPositive } from '../math';
2
+ declare type BuildPowersOf2LengthArrays<N extends number, R extends never[][]> = R[0][N] extends never ? R : BuildPowersOf2LengthArrays<N, [[...R[0], ...R[0]], ...R]>;
3
+ declare type ConcatLargestUntilDone<N extends number, R extends never[][], B extends never[]> = B['length'] extends N ? B : [...R[0], ...B][N] extends never ? ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, B> : ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, [...R[0], ...B]>;
4
+ declare type Replace<R extends any[], T> = {
5
+ [K in keyof R]: T;
6
+ };
7
+ export declare type CreateTuple<L extends number, T = any> = number extends L ? T[] : IsPositive<L> extends true ? {
8
+ [K in L]: BuildPowersOf2LengthArrays<K, [[never]]> extends infer U ? (U extends never[][] ? Replace<ConcatLargestUntilDone<K, U, []>, T> : never) : never;
9
+ }[L] : never;
10
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "4.5.1",
3
+ "version": "4.5.2",
4
4
  "description": "Provides additional types for TypeScript.",
5
5
  "homepage": "https://github.com/unional/type-plus",
6
6
  "bugs": {
@@ -1,21 +1,32 @@
1
- import { CreateTuple, isType } from '..'
2
-
3
- test('create empty tuple', () => {
4
- isType.equal<true, [], CreateTuple<0>>()
5
- })
6
-
7
- test('single element', () => {
8
- isType.equal<true, [any], CreateTuple<1>>()
9
- })
10
-
11
- test('multiple elements', () => {
12
- isType.equal<true, [any, any, any], CreateTuple<3>>()
13
- })
14
-
15
- test('override element type', () => {
16
- isType.equal<true, [1, 1, 1, 1, 1], CreateTuple<5, 1>>()
17
- })
18
-
19
- test('negative length gets never', () => {
20
- isType.equal<true, never, CreateTuple<-1>>()
21
- })
1
+ import { CreateTuple, isType } from '..'
2
+
3
+ test('create empty tuple', () => {
4
+ isType.equal<true, [], CreateTuple<0>>()
5
+ })
6
+
7
+ test('single element', () => {
8
+ isType.equal<true, [any], CreateTuple<1>>()
9
+ })
10
+
11
+ test('multiple elements', () => {
12
+ isType.equal<true, [any, any, any], CreateTuple<3>>()
13
+ })
14
+
15
+ test('override element type', () => {
16
+ isType.equal<true, [1, 1, 1, 1, 1], CreateTuple<5, 1>>()
17
+ })
18
+
19
+ test('negative length gets never', () => {
20
+ isType.equal<true, never, CreateTuple<-1>>()
21
+ })
22
+
23
+ test('Can create tuple up to 7000', () => {
24
+ type A = CreateTuple<7000>['length']
25
+
26
+ isType.equal<true, 7000, A>()
27
+ })
28
+
29
+ test('L = number gets array', () => {
30
+ type A = CreateTuple<number, 1>
31
+ isType.equal<true, 1[], A>()
32
+ })
@@ -1,12 +1,27 @@
1
- import type { IsPositive } from '../math'
1
+ import { IsPositive } from '../math'
2
+
3
+ type BuildPowersOf2LengthArrays<N extends number, R extends never[][]> =
4
+ R[0][N] extends never ? R : BuildPowersOf2LengthArrays<N, [[...R[0], ...R[0]], ...R]>
5
+
6
+ type ConcatLargestUntilDone<N extends number, R extends never[][], B extends never[]> =
7
+ B['length'] extends N ? B : [...R[0], ...B][N] extends never
8
+ ? ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, B>
9
+ : ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, [...R[0], ...B]>
10
+
11
+ type Replace<R extends any[], T> = { [K in keyof R]: T }
2
12
 
3
13
  /**
4
14
  * Creates `Tuple<T>` with `L` number of elements.
15
+ * @note The original implementation hits recursive limit.
16
+ * Updated implementation based on below by @lazytype
17
+ * @see https://github.com/microsoft/TypeScript/issues/26223#issuecomment-674514787
18
+ * @see https://github.com/microsoft/TypeScript/issues/47874#issuecomment-1039157322
5
19
  */
6
20
  export type CreateTuple<L extends number, T = any> =
7
- IsPositive<L> extends true ? CreateTuple.Device<[], L, T> : never
8
-
9
- export namespace CreateTuple {
10
- export type Device<R extends any[], L extends number, T> =
11
- R['length'] extends L ? R : Device<[T, ...R], L, T>
12
- }
21
+ number extends L ? T[] : IsPositive<L> extends true
22
+ ? {
23
+ [K in L]: BuildPowersOf2LengthArrays<K, [[never]]> extends infer U
24
+ ? (U extends never[][] ? Replace<ConcatLargestUntilDone<K, U, []>, T> : never)
25
+ : never
26
+ }[L]
27
+ : never
@@ -1,82 +1,82 @@
1
- import { Add, Increment, isType } from '..'
2
-
3
- describe('Add<A, B>', () => {
4
- test('fractional A gets never', () => {
5
- isType.equal<true, never, Add<1.1, 1>>()
6
- })
7
-
8
- test('negative A gets never', () => {
9
- isType.equal<true, never, Add<-1, 1>>()
10
- })
11
-
12
- test('fractional B gets never', () => {
13
- isType.equal<true, never, Add<1, 1.2>>()
14
- })
15
-
16
- test('negative B gets never', () => {
17
- isType.equal<true, never, Add<1, -1>>()
18
- })
19
-
20
- test('number gets Fail', () => {
21
- isType.equal<true, never, Add<number, 1>>()
22
- isType.equal<true, never, Add<1, number>>()
23
-
24
- isType.equal<true, number, Add<number, 1, number>>()
25
- isType.equal<true, number, Add<1, number, number>>()
26
- })
27
-
28
- describe('single digit', () => {
29
- test('0 + n = n', () => {
30
- isType.equal<true, 0, Add<0, 0>>()
31
- isType.equal<true, 1, Add<0, 1>>()
32
- isType.equal<true, 2, Add<0, 2>>()
33
- isType.equal<true, 3, Add<0, 3>>()
34
- isType.equal<true, 4, Add<0, 4>>()
35
- isType.equal<true, 5, Add<0, 5>>()
36
- isType.equal<true, 6, Add<0, 6>>()
37
- isType.equal<true, 7, Add<0, 7>>()
38
- isType.equal<true, 8, Add<0, 8>>()
39
- isType.equal<true, 9, Add<0, 9>>()
40
- })
41
- test('9 + n', () => {
42
- isType.equal<true, 9, Add<9, 0>>()
43
- isType.equal<true, 10, Add<9, 1>>()
44
- isType.equal<true, 11, Add<9, 2>>()
45
- isType.equal<true, 12, Add<9, 3>>()
46
- isType.equal<true, 13, Add<9, 4>>()
47
- isType.equal<true, 14, Add<9, 5>>()
48
- isType.equal<true, 15, Add<9, 6>>()
49
- isType.equal<true, 16, Add<9, 7>>()
50
- isType.equal<true, 17, Add<9, 8>>()
51
- isType.equal<true, 18, Add<9, 9>>()
52
- })
53
- })
54
-
55
- test('1 + 2 digits', () => {
56
- isType.equal<true, 16, Add<3, 13>>()
57
- isType.equal<true, 108, Add<9, 99>>()
58
- })
59
-
60
- test('2 + 1 digits', () => {
61
- isType.equal<true, 16, Add<13, 3>>()
62
- isType.equal<true, 108, Add<99, 9>>()
63
- })
64
-
65
- test('2 + 2 digits', () => {
66
- isType.equal<true, 20, Add<10, 10>>()
67
- isType.equal<true, 38, Add<19, 19>>()
68
- })
69
-
70
- test('n + n digits', () => {
71
- isType.equal<true, 7777, Add<1234, 6543>>()
72
- })
73
- })
74
-
75
- describe('Increment<A>', () => {
76
- test('add 1', () => {
77
- isType.equal<true, 1, Increment<0>>()
78
- })
79
- test('work with large number', () => {
80
- isType.equal<true, 7777, Increment<7776>>()
81
- })
82
- })
1
+ import { Add, Increment, isType } from '..'
2
+
3
+ describe('Add<A, B>', () => {
4
+ test('fractional A gets never', () => {
5
+ isType.equal<true, never, Add<1.1, 1>>()
6
+ })
7
+
8
+ test('negative A gets never', () => {
9
+ isType.equal<true, never, Add<-1, 1>>()
10
+ })
11
+
12
+ test('fractional B gets never', () => {
13
+ isType.equal<true, never, Add<1, 1.2>>()
14
+ })
15
+
16
+ test('negative B gets never', () => {
17
+ isType.equal<true, never, Add<1, -1>>()
18
+ })
19
+
20
+ test('number gets Fail', () => {
21
+ isType.equal<true, never, Add<number, 1>>()
22
+ isType.equal<true, never, Add<1, number>>()
23
+
24
+ isType.equal<true, number, Add<number, 1, number>>()
25
+ isType.equal<true, number, Add<1, number, number>>()
26
+ })
27
+
28
+ describe('single digit', () => {
29
+ test('0 + n = n', () => {
30
+ isType.equal<true, 0, Add<0, 0>>()
31
+ isType.equal<true, 1, Add<0, 1>>()
32
+ isType.equal<true, 2, Add<0, 2>>()
33
+ isType.equal<true, 3, Add<0, 3>>()
34
+ isType.equal<true, 4, Add<0, 4>>()
35
+ isType.equal<true, 5, Add<0, 5>>()
36
+ isType.equal<true, 6, Add<0, 6>>()
37
+ isType.equal<true, 7, Add<0, 7>>()
38
+ isType.equal<true, 8, Add<0, 8>>()
39
+ isType.equal<true, 9, Add<0, 9>>()
40
+ })
41
+ test('9 + n', () => {
42
+ isType.equal<true, 9, Add<9, 0>>()
43
+ isType.equal<true, 10, Add<9, 1>>()
44
+ isType.equal<true, 11, Add<9, 2>>()
45
+ isType.equal<true, 12, Add<9, 3>>()
46
+ isType.equal<true, 13, Add<9, 4>>()
47
+ isType.equal<true, 14, Add<9, 5>>()
48
+ isType.equal<true, 15, Add<9, 6>>()
49
+ isType.equal<true, 16, Add<9, 7>>()
50
+ isType.equal<true, 17, Add<9, 8>>()
51
+ isType.equal<true, 18, Add<9, 9>>()
52
+ })
53
+ })
54
+
55
+ test('1 + 2 digits', () => {
56
+ isType.equal<true, 16, Add<3, 13>>()
57
+ isType.equal<true, 108, Add<9, 99>>()
58
+ })
59
+
60
+ test('2 + 1 digits', () => {
61
+ isType.equal<true, 16, Add<13, 3>>()
62
+ isType.equal<true, 108, Add<99, 9>>()
63
+ })
64
+
65
+ test('2 + 2 digits', () => {
66
+ isType.equal<true, 20, Add<10, 10>>()
67
+ isType.equal<true, 38, Add<19, 19>>()
68
+ })
69
+
70
+ test('n + n digits', () => {
71
+ isType.equal<true, 7777, Add<1234, 6543>>()
72
+ })
73
+ })
74
+
75
+ describe('Increment<A>', () => {
76
+ test('add 1', () => {
77
+ isType.equal<true, 1, Increment<0>>()
78
+ })
79
+ test('work with large number', () => {
80
+ isType.equal<true, 7777, Increment<7776>>()
81
+ })
82
+ })
@@ -1,185 +1,184 @@
1
- import { Equal, isType } from '..'
2
- import { Digit, DigitArray } from './Digit'
3
-
4
- describe('DigitArray.ToNumber<DA>', () => {
5
- test('no digit gets 0', () => {
6
- type A = DigitArray.ToNumber<[]>
7
- isType.t<Equal<A, 0>>()
8
- })
9
-
10
- test('single digit', () => {
11
- isType.t<Equal<DigitArray.ToNumber<[0]>, 0>>()
12
- isType.t<Equal<DigitArray.ToNumber<[1]>, 1>>()
13
- isType.t<Equal<DigitArray.ToNumber<[2]>, 2>>()
14
- isType.t<Equal<DigitArray.ToNumber<[3]>, 3>>()
15
- isType.t<Equal<DigitArray.ToNumber<[4]>, 4>>()
16
- isType.t<Equal<DigitArray.ToNumber<[5]>, 5>>()
17
- isType.t<Equal<DigitArray.ToNumber<[6]>, 6>>()
18
- isType.t<Equal<DigitArray.ToNumber<[7]>, 7>>()
19
- isType.t<Equal<DigitArray.ToNumber<[8]>, 8>>()
20
- isType.t<Equal<DigitArray.ToNumber<[9]>, 9>>()
21
-
22
- })
23
-
24
- test('two digits', () => {
25
- isType.t<Equal<DigitArray.ToNumber<[1, 0]>, 10>>()
26
- isType.t<Equal<DigitArray.ToNumber<[1, 0]>, 10>>()
27
- isType.t<Equal<DigitArray.ToNumber<[3, 1]>, 31>>()
28
- isType.t<Equal<DigitArray.ToNumber<[13, 1]>, 131>>()
29
- isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 4]>, 1234>>()
30
- })
31
-
32
- test('multi digits', () => {
33
- isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 4]>, 1234>>()
34
- isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 5]>, 1235>>()
35
- })
36
- })
37
-
38
- describe('DigitArray.Shift10<DA>', () => {
39
- test('zero digit gets the same', () => {
40
- isType.equal<true, [], DigitArray.Shift10<[]>>()
41
- })
42
-
43
- test('single digit gets the same', () => {
44
- isType.equal<true, [5], DigitArray.Shift10<[5]>>()
45
- })
46
-
47
- test('two digits with leading 0 get trimmed', () => {
48
- isType.equal<true, [5], DigitArray.Shift10<[0, 5]>>()
49
- })
50
- test('two digits gets value shifted', () => {
51
- isType.equal<true, [15], DigitArray.Shift10<[1, 5]>>()
52
- isType.equal<true, [8, 10], DigitArray.Shift10<[9, 0]>>()
53
- isType.equal<true, [8, 19], DigitArray.Shift10<[9, 9]>>()
54
- })
55
- test('multiple digits', () => {
56
- isType.equal<true, [11, 12, 14], DigitArray.Shift10<[0, 1, 2, 3, 4]>>()
57
- })
58
- })
59
-
60
-
61
- describe('Digit.GreaterThan<A, B>', () => {
62
- test('n > n is false', () => {
63
- isType.equal<true, false, Digit.GreaterThan<0, 0>>()
64
- isType.equal<true, false, Digit.GreaterThan<1, 1>>()
65
- isType.equal<true, false, Digit.GreaterThan<2, 2>>()
66
- isType.equal<true, false, Digit.GreaterThan<3, 3>>()
67
- isType.equal<true, false, Digit.GreaterThan<4, 4>>()
68
- isType.equal<true, false, Digit.GreaterThan<5, 5>>()
69
- isType.equal<true, false, Digit.GreaterThan<6, 6>>()
70
- isType.equal<true, false, Digit.GreaterThan<7, 7>>()
71
- isType.equal<true, false, Digit.GreaterThan<8, 8>>()
72
- isType.equal<true, false, Digit.GreaterThan<9, 9>>()
73
- })
74
- test('N > m is true', () => {
75
- isType.equal<true, true, Digit.GreaterThan<1, 0>>()
76
- isType.equal<true, true, Digit.GreaterThan<2, 0>>()
77
- isType.equal<true, true, Digit.GreaterThan<3, 0>>()
78
- isType.equal<true, true, Digit.GreaterThan<4, 0>>()
79
- isType.equal<true, true, Digit.GreaterThan<5, 0>>()
80
- isType.equal<true, true, Digit.GreaterThan<6, 0>>()
81
- isType.equal<true, true, Digit.GreaterThan<7, 0>>()
82
- isType.equal<true, true, Digit.GreaterThan<8, 0>>()
83
- isType.equal<true, true, Digit.GreaterThan<9, 0>>()
84
-
85
- isType.equal<true, true, Digit.GreaterThan<2, 1>>()
86
- isType.equal<true, true, Digit.GreaterThan<3, 1>>()
87
- isType.equal<true, true, Digit.GreaterThan<4, 1>>()
88
- isType.equal<true, true, Digit.GreaterThan<5, 1>>()
89
- isType.equal<true, true, Digit.GreaterThan<6, 1>>()
90
- isType.equal<true, true, Digit.GreaterThan<7, 1>>()
91
- isType.equal<true, true, Digit.GreaterThan<8, 1>>()
92
- isType.equal<true, true, Digit.GreaterThan<9, 1>>()
93
-
94
- isType.equal<true, true, Digit.GreaterThan<3, 2>>()
95
- isType.equal<true, true, Digit.GreaterThan<4, 2>>()
96
- isType.equal<true, true, Digit.GreaterThan<5, 2>>()
97
- isType.equal<true, true, Digit.GreaterThan<6, 2>>()
98
- isType.equal<true, true, Digit.GreaterThan<7, 2>>()
99
- isType.equal<true, true, Digit.GreaterThan<8, 2>>()
100
- isType.equal<true, true, Digit.GreaterThan<9, 2>>()
101
-
102
- isType.equal<true, true, Digit.GreaterThan<4, 3>>()
103
- isType.equal<true, true, Digit.GreaterThan<5, 3>>()
104
- isType.equal<true, true, Digit.GreaterThan<6, 3>>()
105
- isType.equal<true, true, Digit.GreaterThan<7, 3>>()
106
- isType.equal<true, true, Digit.GreaterThan<8, 3>>()
107
- isType.equal<true, true, Digit.GreaterThan<9, 3>>()
108
-
109
- isType.equal<true, true, Digit.GreaterThan<5, 4>>()
110
- isType.equal<true, true, Digit.GreaterThan<6, 4>>()
111
- isType.equal<true, true, Digit.GreaterThan<7, 4>>()
112
- isType.equal<true, true, Digit.GreaterThan<8, 4>>()
113
- isType.equal<true, true, Digit.GreaterThan<9, 4>>()
114
-
115
- isType.equal<true, true, Digit.GreaterThan<6, 5>>()
116
- isType.equal<true, true, Digit.GreaterThan<7, 5>>()
117
- isType.equal<true, true, Digit.GreaterThan<8, 5>>()
118
- isType.equal<true, true, Digit.GreaterThan<9, 5>>()
119
-
120
- isType.equal<true, true, Digit.GreaterThan<7, 6>>()
121
- isType.equal<true, true, Digit.GreaterThan<8, 6>>()
122
- isType.equal<true, true, Digit.GreaterThan<9, 6>>()
123
-
124
- isType.equal<true, true, Digit.GreaterThan<8, 7>>()
125
- isType.equal<true, true, Digit.GreaterThan<9, 7>>()
126
-
127
- isType.equal<true, true, Digit.GreaterThan<9, 8>>()
128
- })
129
-
130
- test('n > M is false', () => {
131
- isType.equal<true, false, Digit.GreaterThan<0, 1>>()
132
- isType.equal<true, false, Digit.GreaterThan<0, 2>>()
133
- isType.equal<true, false, Digit.GreaterThan<0, 3>>()
134
- isType.equal<true, false, Digit.GreaterThan<0, 4>>()
135
- isType.equal<true, false, Digit.GreaterThan<0, 5>>()
136
- isType.equal<true, false, Digit.GreaterThan<0, 6>>()
137
- isType.equal<true, false, Digit.GreaterThan<0, 7>>()
138
- isType.equal<true, false, Digit.GreaterThan<0, 8>>()
139
- isType.equal<true, false, Digit.GreaterThan<0, 9>>()
140
-
141
- isType.equal<true, false, Digit.GreaterThan<1, 2>>()
142
- isType.equal<true, false, Digit.GreaterThan<1, 3>>()
143
- isType.equal<true, false, Digit.GreaterThan<1, 4>>()
144
- isType.equal<true, false, Digit.GreaterThan<1, 5>>()
145
- isType.equal<true, false, Digit.GreaterThan<1, 6>>()
146
- isType.equal<true, false, Digit.GreaterThan<1, 7>>()
147
- isType.equal<true, false, Digit.GreaterThan<1, 8>>()
148
- isType.equal<true, false, Digit.GreaterThan<1, 9>>()
149
-
150
- isType.equal<true, false, Digit.GreaterThan<2, 3>>()
151
- isType.equal<true, false, Digit.GreaterThan<2, 4>>()
152
- isType.equal<true, false, Digit.GreaterThan<2, 5>>()
153
- isType.equal<true, false, Digit.GreaterThan<2, 6>>()
154
- isType.equal<true, false, Digit.GreaterThan<2, 7>>()
155
- isType.equal<true, false, Digit.GreaterThan<2, 8>>()
156
- isType.equal<true, false, Digit.GreaterThan<2, 9>>()
157
-
158
- isType.equal<true, false, Digit.GreaterThan<3, 4>>()
159
- isType.equal<true, false, Digit.GreaterThan<3, 5>>()
160
- isType.equal<true, false, Digit.GreaterThan<3, 6>>()
161
- isType.equal<true, false, Digit.GreaterThan<3, 7>>()
162
- isType.equal<true, false, Digit.GreaterThan<3, 8>>()
163
- isType.equal<true, false, Digit.GreaterThan<3, 9>>()
164
-
165
- isType.equal<true, false, Digit.GreaterThan<4, 5>>()
166
- isType.equal<true, false, Digit.GreaterThan<4, 6>>()
167
- isType.equal<true, false, Digit.GreaterThan<4, 7>>()
168
- isType.equal<true, false, Digit.GreaterThan<4, 8>>()
169
- isType.equal<true, false, Digit.GreaterThan<4, 9>>()
170
-
171
- isType.equal<true, false, Digit.GreaterThan<5, 6>>()
172
- isType.equal<true, false, Digit.GreaterThan<5, 7>>()
173
- isType.equal<true, false, Digit.GreaterThan<5, 8>>()
174
- isType.equal<true, false, Digit.GreaterThan<5, 9>>()
175
-
176
- isType.equal<true, false, Digit.GreaterThan<6, 7>>()
177
- isType.equal<true, false, Digit.GreaterThan<6, 8>>()
178
- isType.equal<true, false, Digit.GreaterThan<6, 9>>()
179
-
180
- isType.equal<true, false, Digit.GreaterThan<7, 8>>()
181
- isType.equal<true, false, Digit.GreaterThan<7, 9>>()
182
-
183
- isType.equal<true, false, Digit.GreaterThan<8, 9>>()
184
- })
185
- })
1
+ import { Equal, isType } from '..'
2
+ import { Digit, DigitArray } from './Digit'
3
+
4
+ describe('DigitArray.ToNumber<DA>', () => {
5
+ test('no digit gets 0', () => {
6
+ type A = DigitArray.ToNumber<[]>
7
+ isType.t<Equal<A, 0>>()
8
+ })
9
+
10
+ test('single digit', () => {
11
+ isType.t<Equal<DigitArray.ToNumber<[0]>, 0>>()
12
+ isType.t<Equal<DigitArray.ToNumber<[1]>, 1>>()
13
+ isType.t<Equal<DigitArray.ToNumber<[2]>, 2>>()
14
+ isType.t<Equal<DigitArray.ToNumber<[3]>, 3>>()
15
+ isType.t<Equal<DigitArray.ToNumber<[4]>, 4>>()
16
+ isType.t<Equal<DigitArray.ToNumber<[5]>, 5>>()
17
+ isType.t<Equal<DigitArray.ToNumber<[6]>, 6>>()
18
+ isType.t<Equal<DigitArray.ToNumber<[7]>, 7>>()
19
+ isType.t<Equal<DigitArray.ToNumber<[8]>, 8>>()
20
+ isType.t<Equal<DigitArray.ToNumber<[9]>, 9>>()
21
+
22
+ })
23
+
24
+ test('two digits', () => {
25
+ isType.t<Equal<DigitArray.ToNumber<[1, 0]>, 10>>()
26
+ isType.t<Equal<DigitArray.ToNumber<[1, 0]>, 10>>()
27
+ isType.t<Equal<DigitArray.ToNumber<[3, 1]>, 31>>()
28
+ isType.t<Equal<DigitArray.ToNumber<[13, 1]>, 131>>()
29
+ isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 4]>, 1234>>()
30
+ })
31
+
32
+ test('multi digits', () => {
33
+ isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 4]>, 1234>>()
34
+ isType.t<Equal<DigitArray.ToNumber<[1, 2, 3, 5]>, 1235>>()
35
+ })
36
+ })
37
+
38
+ describe('DigitArray.Shift10<DA>', () => {
39
+ test('zero digit gets the same', () => {
40
+ isType.equal<true, [], DigitArray.Shift10<[]>>()
41
+ })
42
+
43
+ test('single digit gets the same', () => {
44
+ isType.equal<true, [5], DigitArray.Shift10<[5]>>()
45
+ })
46
+
47
+ test('two digits with leading 0 get trimmed', () => {
48
+ isType.equal<true, [5], DigitArray.Shift10<[0, 5]>>()
49
+ })
50
+ test('two digits gets value shifted', () => {
51
+ isType.equal<true, [15], DigitArray.Shift10<[1, 5]>>()
52
+ isType.equal<true, [8, 10], DigitArray.Shift10<[9, 0]>>()
53
+ isType.equal<true, [8, 19], DigitArray.Shift10<[9, 9]>>()
54
+ })
55
+ test('multiple digits', () => {
56
+ isType.equal<true, [11, 12, 14], DigitArray.Shift10<[0, 1, 2, 3, 4]>>()
57
+ })
58
+ })
59
+
60
+ describe('Digit.GreaterThan<A, B>', () => {
61
+ test('n > n is false', () => {
62
+ isType.equal<true, false, Digit.GreaterThan<0, 0>>()
63
+ isType.equal<true, false, Digit.GreaterThan<1, 1>>()
64
+ isType.equal<true, false, Digit.GreaterThan<2, 2>>()
65
+ isType.equal<true, false, Digit.GreaterThan<3, 3>>()
66
+ isType.equal<true, false, Digit.GreaterThan<4, 4>>()
67
+ isType.equal<true, false, Digit.GreaterThan<5, 5>>()
68
+ isType.equal<true, false, Digit.GreaterThan<6, 6>>()
69
+ isType.equal<true, false, Digit.GreaterThan<7, 7>>()
70
+ isType.equal<true, false, Digit.GreaterThan<8, 8>>()
71
+ isType.equal<true, false, Digit.GreaterThan<9, 9>>()
72
+ })
73
+ test('N > m is true', () => {
74
+ isType.equal<true, true, Digit.GreaterThan<1, 0>>()
75
+ isType.equal<true, true, Digit.GreaterThan<2, 0>>()
76
+ isType.equal<true, true, Digit.GreaterThan<3, 0>>()
77
+ isType.equal<true, true, Digit.GreaterThan<4, 0>>()
78
+ isType.equal<true, true, Digit.GreaterThan<5, 0>>()
79
+ isType.equal<true, true, Digit.GreaterThan<6, 0>>()
80
+ isType.equal<true, true, Digit.GreaterThan<7, 0>>()
81
+ isType.equal<true, true, Digit.GreaterThan<8, 0>>()
82
+ isType.equal<true, true, Digit.GreaterThan<9, 0>>()
83
+
84
+ isType.equal<true, true, Digit.GreaterThan<2, 1>>()
85
+ isType.equal<true, true, Digit.GreaterThan<3, 1>>()
86
+ isType.equal<true, true, Digit.GreaterThan<4, 1>>()
87
+ isType.equal<true, true, Digit.GreaterThan<5, 1>>()
88
+ isType.equal<true, true, Digit.GreaterThan<6, 1>>()
89
+ isType.equal<true, true, Digit.GreaterThan<7, 1>>()
90
+ isType.equal<true, true, Digit.GreaterThan<8, 1>>()
91
+ isType.equal<true, true, Digit.GreaterThan<9, 1>>()
92
+
93
+ isType.equal<true, true, Digit.GreaterThan<3, 2>>()
94
+ isType.equal<true, true, Digit.GreaterThan<4, 2>>()
95
+ isType.equal<true, true, Digit.GreaterThan<5, 2>>()
96
+ isType.equal<true, true, Digit.GreaterThan<6, 2>>()
97
+ isType.equal<true, true, Digit.GreaterThan<7, 2>>()
98
+ isType.equal<true, true, Digit.GreaterThan<8, 2>>()
99
+ isType.equal<true, true, Digit.GreaterThan<9, 2>>()
100
+
101
+ isType.equal<true, true, Digit.GreaterThan<4, 3>>()
102
+ isType.equal<true, true, Digit.GreaterThan<5, 3>>()
103
+ isType.equal<true, true, Digit.GreaterThan<6, 3>>()
104
+ isType.equal<true, true, Digit.GreaterThan<7, 3>>()
105
+ isType.equal<true, true, Digit.GreaterThan<8, 3>>()
106
+ isType.equal<true, true, Digit.GreaterThan<9, 3>>()
107
+
108
+ isType.equal<true, true, Digit.GreaterThan<5, 4>>()
109
+ isType.equal<true, true, Digit.GreaterThan<6, 4>>()
110
+ isType.equal<true, true, Digit.GreaterThan<7, 4>>()
111
+ isType.equal<true, true, Digit.GreaterThan<8, 4>>()
112
+ isType.equal<true, true, Digit.GreaterThan<9, 4>>()
113
+
114
+ isType.equal<true, true, Digit.GreaterThan<6, 5>>()
115
+ isType.equal<true, true, Digit.GreaterThan<7, 5>>()
116
+ isType.equal<true, true, Digit.GreaterThan<8, 5>>()
117
+ isType.equal<true, true, Digit.GreaterThan<9, 5>>()
118
+
119
+ isType.equal<true, true, Digit.GreaterThan<7, 6>>()
120
+ isType.equal<true, true, Digit.GreaterThan<8, 6>>()
121
+ isType.equal<true, true, Digit.GreaterThan<9, 6>>()
122
+
123
+ isType.equal<true, true, Digit.GreaterThan<8, 7>>()
124
+ isType.equal<true, true, Digit.GreaterThan<9, 7>>()
125
+
126
+ isType.equal<true, true, Digit.GreaterThan<9, 8>>()
127
+ })
128
+
129
+ test('n > M is false', () => {
130
+ isType.equal<true, false, Digit.GreaterThan<0, 1>>()
131
+ isType.equal<true, false, Digit.GreaterThan<0, 2>>()
132
+ isType.equal<true, false, Digit.GreaterThan<0, 3>>()
133
+ isType.equal<true, false, Digit.GreaterThan<0, 4>>()
134
+ isType.equal<true, false, Digit.GreaterThan<0, 5>>()
135
+ isType.equal<true, false, Digit.GreaterThan<0, 6>>()
136
+ isType.equal<true, false, Digit.GreaterThan<0, 7>>()
137
+ isType.equal<true, false, Digit.GreaterThan<0, 8>>()
138
+ isType.equal<true, false, Digit.GreaterThan<0, 9>>()
139
+
140
+ isType.equal<true, false, Digit.GreaterThan<1, 2>>()
141
+ isType.equal<true, false, Digit.GreaterThan<1, 3>>()
142
+ isType.equal<true, false, Digit.GreaterThan<1, 4>>()
143
+ isType.equal<true, false, Digit.GreaterThan<1, 5>>()
144
+ isType.equal<true, false, Digit.GreaterThan<1, 6>>()
145
+ isType.equal<true, false, Digit.GreaterThan<1, 7>>()
146
+ isType.equal<true, false, Digit.GreaterThan<1, 8>>()
147
+ isType.equal<true, false, Digit.GreaterThan<1, 9>>()
148
+
149
+ isType.equal<true, false, Digit.GreaterThan<2, 3>>()
150
+ isType.equal<true, false, Digit.GreaterThan<2, 4>>()
151
+ isType.equal<true, false, Digit.GreaterThan<2, 5>>()
152
+ isType.equal<true, false, Digit.GreaterThan<2, 6>>()
153
+ isType.equal<true, false, Digit.GreaterThan<2, 7>>()
154
+ isType.equal<true, false, Digit.GreaterThan<2, 8>>()
155
+ isType.equal<true, false, Digit.GreaterThan<2, 9>>()
156
+
157
+ isType.equal<true, false, Digit.GreaterThan<3, 4>>()
158
+ isType.equal<true, false, Digit.GreaterThan<3, 5>>()
159
+ isType.equal<true, false, Digit.GreaterThan<3, 6>>()
160
+ isType.equal<true, false, Digit.GreaterThan<3, 7>>()
161
+ isType.equal<true, false, Digit.GreaterThan<3, 8>>()
162
+ isType.equal<true, false, Digit.GreaterThan<3, 9>>()
163
+
164
+ isType.equal<true, false, Digit.GreaterThan<4, 5>>()
165
+ isType.equal<true, false, Digit.GreaterThan<4, 6>>()
166
+ isType.equal<true, false, Digit.GreaterThan<4, 7>>()
167
+ isType.equal<true, false, Digit.GreaterThan<4, 8>>()
168
+ isType.equal<true, false, Digit.GreaterThan<4, 9>>()
169
+
170
+ isType.equal<true, false, Digit.GreaterThan<5, 6>>()
171
+ isType.equal<true, false, Digit.GreaterThan<5, 7>>()
172
+ isType.equal<true, false, Digit.GreaterThan<5, 8>>()
173
+ isType.equal<true, false, Digit.GreaterThan<5, 9>>()
174
+
175
+ isType.equal<true, false, Digit.GreaterThan<6, 7>>()
176
+ isType.equal<true, false, Digit.GreaterThan<6, 8>>()
177
+ isType.equal<true, false, Digit.GreaterThan<6, 9>>()
178
+
179
+ isType.equal<true, false, Digit.GreaterThan<7, 8>>()
180
+ isType.equal<true, false, Digit.GreaterThan<7, 9>>()
181
+
182
+ isType.equal<true, false, Digit.GreaterThan<8, 9>>()
183
+ })
184
+ })