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.
- package/README.md +1 -0
- package/cjs/ComposableTypes.d.ts +0 -6
- package/cjs/JSONTypes.js +0 -1
- package/cjs/JSONTypes.js.map +1 -1
- package/cjs/UnionKeys.d.ts +0 -4
- package/cjs/array/CommonPropKeys.d.ts +0 -7
- package/cjs/array/CreateTuple.d.ts +10 -8
- package/cjs/array/Filter.d.ts +1 -1
- package/cjs/array/FindFirst.d.ts +0 -3
- package/cjs/array/IntersectOfProps.d.ts +0 -7
- package/cjs/array/Last.d.ts +0 -3
- package/cjs/array/Tail.d.ts +0 -3
- package/cjs/array/UnionOfProps.d.ts +0 -7
- package/cjs/array/UnionOfValues.d.ts +0 -7
- package/cjs/assertion/assertType.d.ts +0 -4
- package/cjs/assertion/assertType.js +0 -8
- package/cjs/assertion/assertType.js.map +1 -1
- package/cjs/functional/ChainFn.d.ts +0 -3
- package/cjs/functional/compose.d.ts +0 -3
- package/cjs/functional/compose.js +0 -3
- package/cjs/functional/compose.js.map +1 -1
- package/cjs/index.js +0 -2
- package/cjs/index.js.map +1 -1
- package/cjs/math/Add.d.ts +0 -6
- package/cjs/math/Digit.d.ts +0 -3
- package/cjs/math/IsPositive.d.ts +0 -5
- package/cjs/math/IsWhole.d.ts +0 -5
- package/cjs/math/Subtract.d.ts +0 -3
- package/cjs/nodejs/isNodeError.d.ts +0 -5
- package/cjs/nodejs/isNodeError.js +0 -5
- package/cjs/nodejs/isNodeError.js.map +1 -1
- package/cjs/nominal-types/Brand.d.ts +0 -10
- package/cjs/nominal-types/Brand.js +0 -3
- package/cjs/nominal-types/Brand.js.map +1 -1
- package/cjs/nominal-types/Flavor.d.ts +0 -12
- package/cjs/nominal-types/Flavor.js +0 -3
- package/cjs/nominal-types/Flavor.js.map +1 -1
- package/cjs/object/ExcludePropType.d.ts +0 -3
- package/cjs/object/IsDisjoint.d.ts +0 -4
- package/cjs/object/KeyTypes.d.ts +0 -5
- package/cjs/object/KeyofOptional.d.ts +0 -3
- package/cjs/object/KnownKeys.js +0 -3
- package/cjs/object/KnownKeys.js.map +1 -1
- package/cjs/object/Partial.d.ts +0 -9
- package/cjs/object/RecursiveIntersect.d.ts +0 -11
- package/cjs/object/Required.js +0 -1
- package/cjs/object/Required.js.map +1 -1
- package/cjs/object/facade.d.ts +0 -3
- package/cjs/object/facade.js +0 -3
- package/cjs/object/facade.js.map +1 -1
- package/cjs/object/index.d.ts +1 -0
- package/cjs/object/index.js +1 -0
- package/cjs/object/index.js.map +1 -1
- package/cjs/object/mapProperties.d.ts +0 -8
- package/cjs/object/mapProperties.js +0 -8
- package/cjs/object/mapProperties.js.map +1 -1
- package/cjs/object/omit.d.ts +0 -3
- package/cjs/object/pick.d.ts +0 -7
- package/cjs/object/record.d.ts +3 -0
- package/cjs/object/record.js +9 -0
- package/cjs/object/record.js.map +1 -0
- package/cjs/object/reduceKey.d.ts +0 -3
- package/cjs/object/reduceKey.js +0 -3
- package/cjs/object/reduceKey.js.map +1 -1
- package/cjs/object/split.d.ts +0 -4
- package/cjs/predicates/CanAssign.d.ts +0 -3
- package/cjs/predicates/Equal.d.ts +0 -6
- package/cjs/predicates/isType.js +0 -6
- package/cjs/predicates/isType.js.map +1 -1
- package/cjs/promise/PromiseValue.d.ts +0 -3
- package/cjs/promise/PromiseValueMerge.d.ts +0 -3
- package/cjs/promise/isPromise.js +0 -1
- package/cjs/promise/isPromise.js.map +1 -1
- package/cjs/utils/Widen.d.ts +0 -4
- package/esm/JSONTypes.js +0 -1
- package/esm/JSONTypes.js.map +1 -1
- package/esm/assertion/assertType.js +0 -8
- package/esm/assertion/assertType.js.map +1 -1
- package/esm/functional/compose.js +0 -3
- package/esm/functional/compose.js.map +1 -1
- package/esm/index.js +0 -2
- package/esm/index.js.map +1 -1
- package/esm/nodejs/isNodeError.js +0 -5
- package/esm/nodejs/isNodeError.js.map +1 -1
- package/esm/nominal-types/Brand.js +0 -3
- package/esm/nominal-types/Brand.js.map +1 -1
- package/esm/nominal-types/Flavor.js +0 -3
- package/esm/nominal-types/Flavor.js.map +1 -1
- package/esm/object/KnownKeys.js +0 -3
- package/esm/object/KnownKeys.js.map +1 -1
- package/esm/object/Required.js +0 -1
- package/esm/object/Required.js.map +1 -1
- package/esm/object/facade.js +0 -3
- package/esm/object/facade.js.map +1 -1
- package/esm/object/index.js +1 -0
- package/esm/object/index.js.map +1 -1
- package/esm/object/mapProperties.js +0 -8
- package/esm/object/mapProperties.js.map +1 -1
- package/esm/object/record.js +5 -0
- package/esm/object/record.js.map +1 -0
- package/esm/object/reduceKey.js +0 -3
- package/esm/object/reduceKey.js.map +1 -1
- package/esm/predicates/isType.js +0 -6
- package/esm/predicates/isType.js.map +1 -1
- package/esm/promise/isPromise.js +0 -1
- package/esm/promise/isPromise.js.map +1 -1
- package/package.json +1 -1
- package/ts/array/CreateTuple.spec.ts +32 -21
- package/ts/array/CreateTuple.ts +22 -7
- package/ts/array/Filter.spec.ts +54 -21
- package/ts/array/Filter.ts +17 -12
- package/ts/math/Add.spec.ts +82 -82
- package/ts/math/Digit.spec.ts +184 -185
- package/ts/object/index.ts +1 -0
- package/ts/object/record.spec.ts +54 -0
- package/ts/object/record.ts +10 -0
package/ts/array/Filter.spec.ts
CHANGED
|
@@ -1,21 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
+
})
|
package/ts/array/Filter.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
export type Filter<A extends Array<any>, Criteria> =
|
|
2
|
-
number extends A['length']
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
?
|
|
6
|
-
: (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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))
|
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
|
+
})
|