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.
- package/cjs/array/CreateTuple.d.ts +10 -5
- package/package.json +1 -1
- package/ts/array/CreateTuple.spec.ts +32 -21
- package/ts/array/CreateTuple.ts +22 -7
- package/ts/math/Add.spec.ts +82 -82
- package/ts/math/Digit.spec.ts +184 -185
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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,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
|
+
})
|
package/ts/array/CreateTuple.ts
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
import
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
package/ts/math/Add.spec.ts
CHANGED
|
@@ -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
|
+
})
|
package/ts/math/Digit.spec.ts
CHANGED
|
@@ -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
|
-
|
|
62
|
-
|
|
63
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
64
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
65
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
66
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
67
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
68
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
69
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
70
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
71
|
-
isType.equal<true, false, Digit.GreaterThan<
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
76
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
77
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
78
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
79
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
80
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
81
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
82
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
86
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
87
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
88
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
89
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
90
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
91
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
95
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
96
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
97
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
98
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
99
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
103
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
104
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
105
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
106
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
110
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
111
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
112
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
116
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
117
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
121
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
isType.equal<true, true, Digit.GreaterThan<
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
132
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
133
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
134
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
135
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
136
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
137
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
138
|
-
isType.equal<true, false, Digit.GreaterThan<0,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
isType.equal<true, false, Digit.GreaterThan<1,
|
|
142
|
-
isType.equal<true, false, Digit.GreaterThan<1,
|
|
143
|
-
isType.equal<true, false, Digit.GreaterThan<1,
|
|
144
|
-
isType.equal<true, false, Digit.GreaterThan<1,
|
|
145
|
-
isType.equal<true, false, Digit.GreaterThan<1,
|
|
146
|
-
isType.equal<true, false, Digit.GreaterThan<1,
|
|
147
|
-
isType.equal<true, false, Digit.GreaterThan<1,
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
isType.equal<true, false, Digit.GreaterThan<2,
|
|
151
|
-
isType.equal<true, false, Digit.GreaterThan<2,
|
|
152
|
-
isType.equal<true, false, Digit.GreaterThan<2,
|
|
153
|
-
isType.equal<true, false, Digit.GreaterThan<2,
|
|
154
|
-
isType.equal<true, false, Digit.GreaterThan<2,
|
|
155
|
-
isType.equal<true, false, Digit.GreaterThan<2,
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
isType.equal<true, false, Digit.GreaterThan<3,
|
|
159
|
-
isType.equal<true, false, Digit.GreaterThan<3,
|
|
160
|
-
isType.equal<true, false, Digit.GreaterThan<3,
|
|
161
|
-
isType.equal<true, false, Digit.GreaterThan<3,
|
|
162
|
-
isType.equal<true, false, Digit.GreaterThan<3,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
isType.equal<true, false, Digit.GreaterThan<4,
|
|
166
|
-
isType.equal<true, false, Digit.GreaterThan<4,
|
|
167
|
-
isType.equal<true, false, Digit.GreaterThan<4,
|
|
168
|
-
isType.equal<true, false, Digit.GreaterThan<4,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
isType.equal<true, false, Digit.GreaterThan<5,
|
|
172
|
-
isType.equal<true, false, Digit.GreaterThan<5,
|
|
173
|
-
isType.equal<true, false, Digit.GreaterThan<5,
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
isType.equal<true, false, Digit.GreaterThan<6,
|
|
177
|
-
isType.equal<true, false, Digit.GreaterThan<6,
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
isType.equal<true, false, Digit.GreaterThan<7,
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
+
})
|