type-plus 4.4.2 → 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.
Files changed (116) hide show
  1. package/README.md +1 -0
  2. package/cjs/ComposableTypes.d.ts +0 -6
  3. package/cjs/JSONTypes.js +0 -1
  4. package/cjs/JSONTypes.js.map +1 -1
  5. package/cjs/UnionKeys.d.ts +0 -4
  6. package/cjs/array/CommonPropKeys.d.ts +0 -7
  7. package/cjs/array/CreateTuple.d.ts +10 -8
  8. package/cjs/array/Filter.d.ts +1 -1
  9. package/cjs/array/FindFirst.d.ts +0 -3
  10. package/cjs/array/IntersectOfProps.d.ts +0 -7
  11. package/cjs/array/Last.d.ts +0 -3
  12. package/cjs/array/Tail.d.ts +0 -3
  13. package/cjs/array/UnionOfProps.d.ts +0 -7
  14. package/cjs/array/UnionOfValues.d.ts +0 -7
  15. package/cjs/assertion/assertType.d.ts +0 -4
  16. package/cjs/assertion/assertType.js +0 -8
  17. package/cjs/assertion/assertType.js.map +1 -1
  18. package/cjs/functional/ChainFn.d.ts +0 -3
  19. package/cjs/functional/compose.d.ts +0 -3
  20. package/cjs/functional/compose.js +0 -3
  21. package/cjs/functional/compose.js.map +1 -1
  22. package/cjs/index.js +0 -2
  23. package/cjs/index.js.map +1 -1
  24. package/cjs/math/Add.d.ts +0 -6
  25. package/cjs/math/Digit.d.ts +0 -3
  26. package/cjs/math/IsPositive.d.ts +0 -5
  27. package/cjs/math/IsWhole.d.ts +0 -5
  28. package/cjs/math/Subtract.d.ts +0 -3
  29. package/cjs/nodejs/isNodeError.d.ts +0 -5
  30. package/cjs/nodejs/isNodeError.js +0 -5
  31. package/cjs/nodejs/isNodeError.js.map +1 -1
  32. package/cjs/nominal-types/Brand.d.ts +0 -10
  33. package/cjs/nominal-types/Brand.js +0 -3
  34. package/cjs/nominal-types/Brand.js.map +1 -1
  35. package/cjs/nominal-types/Flavor.d.ts +0 -12
  36. package/cjs/nominal-types/Flavor.js +0 -3
  37. package/cjs/nominal-types/Flavor.js.map +1 -1
  38. package/cjs/object/ExcludePropType.d.ts +0 -3
  39. package/cjs/object/IsDisjoint.d.ts +0 -4
  40. package/cjs/object/KeyTypes.d.ts +0 -5
  41. package/cjs/object/KeyofOptional.d.ts +0 -3
  42. package/cjs/object/KnownKeys.js +0 -3
  43. package/cjs/object/KnownKeys.js.map +1 -1
  44. package/cjs/object/Partial.d.ts +0 -9
  45. package/cjs/object/RecursiveIntersect.d.ts +0 -11
  46. package/cjs/object/Required.js +0 -1
  47. package/cjs/object/Required.js.map +1 -1
  48. package/cjs/object/facade.d.ts +0 -3
  49. package/cjs/object/facade.js +0 -3
  50. package/cjs/object/facade.js.map +1 -1
  51. package/cjs/object/index.d.ts +1 -0
  52. package/cjs/object/index.js +1 -0
  53. package/cjs/object/index.js.map +1 -1
  54. package/cjs/object/mapProperties.d.ts +0 -8
  55. package/cjs/object/mapProperties.js +0 -8
  56. package/cjs/object/mapProperties.js.map +1 -1
  57. package/cjs/object/omit.d.ts +0 -3
  58. package/cjs/object/pick.d.ts +0 -7
  59. package/cjs/object/record.d.ts +3 -0
  60. package/cjs/object/record.js +9 -0
  61. package/cjs/object/record.js.map +1 -0
  62. package/cjs/object/reduceKey.d.ts +0 -3
  63. package/cjs/object/reduceKey.js +0 -3
  64. package/cjs/object/reduceKey.js.map +1 -1
  65. package/cjs/object/split.d.ts +0 -4
  66. package/cjs/predicates/CanAssign.d.ts +0 -3
  67. package/cjs/predicates/Equal.d.ts +0 -6
  68. package/cjs/predicates/isType.js +0 -6
  69. package/cjs/predicates/isType.js.map +1 -1
  70. package/cjs/promise/PromiseValue.d.ts +0 -3
  71. package/cjs/promise/PromiseValueMerge.d.ts +0 -3
  72. package/cjs/promise/isPromise.js +0 -1
  73. package/cjs/promise/isPromise.js.map +1 -1
  74. package/cjs/utils/Widen.d.ts +0 -4
  75. package/esm/JSONTypes.js +0 -1
  76. package/esm/JSONTypes.js.map +1 -1
  77. package/esm/assertion/assertType.js +0 -8
  78. package/esm/assertion/assertType.js.map +1 -1
  79. package/esm/functional/compose.js +0 -3
  80. package/esm/functional/compose.js.map +1 -1
  81. package/esm/index.js +0 -2
  82. package/esm/index.js.map +1 -1
  83. package/esm/nodejs/isNodeError.js +0 -5
  84. package/esm/nodejs/isNodeError.js.map +1 -1
  85. package/esm/nominal-types/Brand.js +0 -3
  86. package/esm/nominal-types/Brand.js.map +1 -1
  87. package/esm/nominal-types/Flavor.js +0 -3
  88. package/esm/nominal-types/Flavor.js.map +1 -1
  89. package/esm/object/KnownKeys.js +0 -3
  90. package/esm/object/KnownKeys.js.map +1 -1
  91. package/esm/object/Required.js +0 -1
  92. package/esm/object/Required.js.map +1 -1
  93. package/esm/object/facade.js +0 -3
  94. package/esm/object/facade.js.map +1 -1
  95. package/esm/object/index.js +1 -0
  96. package/esm/object/index.js.map +1 -1
  97. package/esm/object/mapProperties.js +0 -8
  98. package/esm/object/mapProperties.js.map +1 -1
  99. package/esm/object/record.js +5 -0
  100. package/esm/object/record.js.map +1 -0
  101. package/esm/object/reduceKey.js +0 -3
  102. package/esm/object/reduceKey.js.map +1 -1
  103. package/esm/predicates/isType.js +0 -6
  104. package/esm/predicates/isType.js.map +1 -1
  105. package/esm/promise/isPromise.js +0 -1
  106. package/esm/promise/isPromise.js.map +1 -1
  107. package/package.json +1 -1
  108. package/ts/array/CreateTuple.spec.ts +32 -21
  109. package/ts/array/CreateTuple.ts +22 -7
  110. package/ts/array/Filter.spec.ts +54 -21
  111. package/ts/array/Filter.ts +17 -12
  112. package/ts/math/Add.spec.ts +82 -82
  113. package/ts/math/Digit.spec.ts +184 -185
  114. package/ts/object/index.ts +1 -0
  115. package/ts/object/record.spec.ts +54 -0
  116. package/ts/object/record.ts +10 -0
@@ -1,21 +1,54 @@
1
- import { assertType, Equal, Filter } from '..'
2
-
3
- test('array matching criteria gets itself', () => {
4
- type Actual = Filter<string[], string>
5
- assertType.isTrue(true as Equal<string[], Actual>)
6
- })
7
-
8
- test('array not matching criteria gets never[]', () => {
9
- type Actual = Filter<string[], number>
10
- assertType.isTrue(true as Equal<never[], Actual>)
11
- })
12
-
13
- test('tuple filters to those matching criteria', () => {
14
- type Actual = Filter<[1, 2, 3, 4], 2 | 4>
15
- assertType.isTrue(true as Equal<[2, 4], Actual>)
16
- })
17
-
18
- test('tuple not value match criteria gets never[]', () => {
19
- type Actual = Filter<[1, 2, 3, 4], 5>
20
- assertType.isTrue(true as Equal<never[], Actual>)
21
- })
1
+ import { Filter, isType } from '..'
2
+
3
+ describe('Filter<A, C>', () => {
4
+ describe('A is array', () => {
5
+ test('array matching criteria gets itself', () => {
6
+ type Actual = Filter<string[], string>
7
+ isType.equal<true, string[], Actual>()
8
+ })
9
+
10
+ test('array not matching criteria gets never[]', () => {
11
+ type Actual = Filter<string[], number>
12
+ isType.equal<true, never[], Actual>()
13
+ })
14
+
15
+ test('remove unmatched type form array', () => {
16
+ type Actual = Filter<Array<string | number>, string>
17
+
18
+ isType.equal<true, string[], Actual>()
19
+ })
20
+
21
+ test('remove undefined and null', () => {
22
+ type Actual = Filter<Array<string | undefined | null>, string>
23
+ isType.equal<true, string[], Actual>()
24
+ })
25
+
26
+ test('can filter with undefined and null', () => {
27
+ type Actual = Filter<Array<string | undefined | null>, undefined | null>
28
+ // Array<undefined | null> is destructured to undefined[] | null[] by TypeScript
29
+ isType.equal<true, undefined[] | null[], Actual>()
30
+ })
31
+
32
+ test('work with never[]', () => {
33
+ type Actual = Filter<never[], undefined>
34
+ isType.equal<true, never[], Actual>()
35
+ })
36
+ })
37
+
38
+ describe(`A is Tuple`, () => {
39
+ test('matching criteria', () => {
40
+ type Actual = Filter<[1, 2, 3, 4], 2 | 4>
41
+ isType.equal<true, [2, 4], Actual>()
42
+ })
43
+
44
+ test('no match gets never[]', () => {
45
+ type Actual = Filter<[1, 2, 3, 4], 5>
46
+ isType.equal<true, never[], Actual>()
47
+ })
48
+
49
+ test('matching undefined and null', () => {
50
+ type Actual = Filter<[1, undefined, 3, null], undefined | null>
51
+ isType.equal<true, [undefined, null], Actual>()
52
+ })
53
+ })
54
+ })
@@ -1,12 +1,17 @@
1
- export type Filter<A extends Array<any>, Criteria> =
2
- number extends A['length']
3
- ? (A[0] extends Criteria ? A : never[])
4
- : (A['length'] extends 0
5
- ? never
6
- : (A extends [infer Head, ...infer Tail]
7
- ? (Tail['length'] extends 0
8
- ? (Head extends Criteria ? [Head] : never[])
9
- : (Head extends Criteria
10
- ? [Head, ...Filter<Tail, Criteria>]
11
- : Filter<Tail, Criteria>))
12
- : never))
1
+ export type Filter<A extends Array<any>, Criteria> =
2
+ number extends A['length']
3
+ // array
4
+ ? (A[0] extends Criteria
5
+ ? A
6
+ : (Criteria extends A[0] ? Array<Criteria> : never[])
7
+ )
8
+ // tuple
9
+ : (A['length'] extends 0
10
+ ? never
11
+ : (A extends [infer Head, ...infer Tail]
12
+ ? (Tail['length'] extends 0
13
+ ? (Head extends Criteria ? [Head] : never[])
14
+ : (Head extends Criteria
15
+ ? [Head, ...Filter<Tail, Criteria>]
16
+ : Filter<Tail, Criteria>))
17
+ : 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
+ })