ts-data-forge 6.13.1 → 7.0.0
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 +2 -2
- package/dist/array/impl/array-utils-iterators.mjs +6 -0
- package/dist/array/impl/array-utils-iterators.mjs.map +1 -1
- package/dist/array/impl/array-utils-modification.mjs +6 -0
- package/dist/array/impl/array-utils-modification.mjs.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.mjs +6 -0
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
- package/dist/array/impl/array-utils-search.mjs +6 -0
- package/dist/array/impl/array-utils-search.mjs.map +1 -1
- package/dist/array/impl/array-utils-slice-clamped.mjs +6 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
- package/dist/array/impl/array-utils-slicing.mjs +6 -0
- package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
- package/dist/array/impl/array-utils-transformation.mjs +6 -0
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
- package/dist/array/impl/array-utils-validation.mjs +6 -0
- package/dist/array/impl/array-utils-validation.mjs.map +1 -1
- package/dist/collections/imap-mapped.mjs +6 -0
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.mjs +6 -0
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.mjs +6 -0
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.mjs +6 -0
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.mjs +6 -0
- package/dist/collections/queue.mjs.map +1 -1
- package/dist/collections/stack.mjs +6 -0
- package/dist/collections/stack.mjs.map +1 -1
- package/dist/entry-point.mjs +6 -0
- package/dist/entry-point.mjs.map +1 -1
- package/dist/index.mjs +6 -0
- package/dist/index.mjs.map +1 -1
- package/dist/iterator/range.mjs +6 -0
- package/dist/iterator/range.mjs.map +1 -1
- package/dist/json/json.mjs +6 -0
- package/dist/json/json.mjs.map +1 -1
- package/dist/number/branded-types/finite-number.d.mts +1 -1
- package/dist/number/branded-types/index.d.mts +6 -0
- package/dist/number/branded-types/index.d.mts.map +1 -1
- package/dist/number/branded-types/index.mjs +6 -0
- package/dist/number/branded-types/index.mjs.map +1 -1
- package/dist/number/branded-types/int.d.mts +1 -2
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int16.d.mts +2 -3
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int32.d.mts +2 -3
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/negative-finite-number.d.mts +143 -0
- package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/negative-finite-number.mjs +156 -0
- package/dist/number/branded-types/negative-finite-number.mjs.map +1 -0
- package/dist/number/branded-types/negative-int.d.mts +120 -0
- package/dist/number/branded-types/negative-int.d.mts.map +1 -0
- package/dist/number/branded-types/negative-int.mjs +125 -0
- package/dist/number/branded-types/negative-int.mjs.map +1 -0
- package/dist/number/branded-types/negative-safe-int.d.mts +132 -0
- package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -0
- package/dist/number/branded-types/negative-safe-int.mjs +136 -0
- package/dist/number/branded-types/negative-safe-int.mjs.map +1 -0
- package/dist/number/branded-types/non-negative-finite-number.d.mts +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +1 -1
- package/dist/number/branded-types/non-positive-finite-number.d.mts +130 -0
- package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -0
- package/dist/number/branded-types/non-positive-finite-number.mjs +134 -0
- package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -0
- package/dist/number/branded-types/non-positive-int.d.mts +224 -0
- package/dist/number/branded-types/non-positive-int.d.mts.map +1 -0
- package/dist/number/branded-types/non-positive-int.mjs +222 -0
- package/dist/number/branded-types/non-positive-int.mjs.map +1 -0
- package/dist/number/branded-types/non-positive-safe-int.d.mts +119 -0
- package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -0
- package/dist/number/branded-types/non-positive-safe-int.mjs +116 -0
- package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -0
- package/dist/number/branded-types/non-zero-finite-number.d.mts +5 -17
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +5 -17
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +5 -33
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +5 -25
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +6 -43
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +5 -25
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +6 -39
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +5 -25
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +5 -37
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +5 -28
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +6 -33
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +5 -17
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +6 -31
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +5 -17
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +4 -2
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +4 -2
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +4 -2
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +4 -2
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +4 -2
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +4 -2
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +4 -2
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +1 -2
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +1 -1
- package/dist/number/branded-types/uint.d.mts +1 -1
- package/dist/number/branded-types/uint16.d.mts +1 -1
- package/dist/number/branded-types/uint32.d.mts +1 -1
- package/dist/number/index.d.mts +1 -0
- package/dist/number/index.d.mts.map +1 -1
- package/dist/number/index.mjs +6 -0
- package/dist/number/index.mjs.map +1 -1
- package/dist/number/num-arithmetic-types.d.mts +74 -0
- package/dist/number/num-arithmetic-types.d.mts.map +1 -0
- package/dist/number/num-arithmetic-types.mjs +2 -0
- package/dist/number/num-arithmetic-types.mjs.map +1 -0
- package/dist/number/num.d.mts +53 -9
- package/dist/number/num.d.mts.map +1 -1
- package/dist/number/num.mjs +64 -12
- package/dist/number/num.mjs.map +1 -1
- package/dist/number/refined-number-utils.d.mts +12 -9
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/dist/object/object.mjs +6 -0
- package/dist/object/object.mjs.map +1 -1
- package/package.json +2 -2
- package/src/number/branded-types/index.mts +6 -0
- package/src/number/branded-types/negative-finite-number.mts +210 -0
- package/src/number/branded-types/negative-finite-number.test.mts +172 -0
- package/src/number/branded-types/negative-int.mts +160 -0
- package/src/number/branded-types/negative-int.test.mts +146 -0
- package/src/number/branded-types/negative-safe-int.mts +173 -0
- package/src/number/branded-types/negative-safe-int.test.mts +120 -0
- package/src/number/branded-types/non-positive-finite-number.mts +191 -0
- package/src/number/branded-types/non-positive-finite-number.test.mts +286 -0
- package/src/number/branded-types/non-positive-int.mts +251 -0
- package/src/number/branded-types/non-positive-int.test.mts +197 -0
- package/src/number/branded-types/non-positive-safe-int.mts +147 -0
- package/src/number/branded-types/non-positive-safe-int.test.mts +223 -0
- package/src/number/branded-types/non-zero-finite-number.mts +14 -22
- package/src/number/branded-types/non-zero-finite-number.test.mts +0 -12
- package/src/number/branded-types/non-zero-int.mts +10 -32
- package/src/number/branded-types/non-zero-int.test.mts +0 -20
- package/src/number/branded-types/non-zero-int16.mts +8 -32
- package/src/number/branded-types/non-zero-int16.test.mts +0 -30
- package/src/number/branded-types/non-zero-int32.mts +8 -32
- package/src/number/branded-types/non-zero-int32.test.mts +0 -30
- package/src/number/branded-types/non-zero-safe-int.mts +8 -35
- package/src/number/branded-types/non-zero-safe-int.test.mts +0 -32
- package/src/number/branded-types/non-zero-uint16.mts +8 -22
- package/src/number/branded-types/non-zero-uint16.test.mts +0 -16
- package/src/number/branded-types/non-zero-uint32.mts +8 -22
- package/src/number/branded-types/non-zero-uint32.test.mts +0 -16
- package/src/number/index.mts +1 -0
- package/src/number/num-arithmetic-types.mts +269 -0
- package/src/number/num-arithmetic-types.test.mts +130 -0
- package/src/number/num-arithmetic.test.mts +102 -0
- package/src/number/num.mts +96 -15
- package/src/number/refined-number-utils.mts +19 -9
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { expectType } from '../../expect-type.mjs';
|
|
2
|
+
import { range } from '../../iterator/index.mjs';
|
|
3
|
+
import {
|
|
4
|
+
asNonPositiveSafeInt,
|
|
5
|
+
isNonPositiveSafeInt,
|
|
6
|
+
NonPositiveSafeInt,
|
|
7
|
+
} from './non-positive-safe-int.mjs';
|
|
8
|
+
|
|
9
|
+
describe('NonPositiveSafeInt test', () => {
|
|
10
|
+
describe(asNonPositiveSafeInt, () => {
|
|
11
|
+
test('accepts valid non-positive safe integer values', () => {
|
|
12
|
+
expect(() => asNonPositiveSafeInt(0)).not.toThrow();
|
|
13
|
+
|
|
14
|
+
expect(() => asNonPositiveSafeInt(-1)).not.toThrow();
|
|
15
|
+
|
|
16
|
+
expect(() => asNonPositiveSafeInt(-1000)).not.toThrow();
|
|
17
|
+
|
|
18
|
+
expect(() => asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER)).not.toThrow();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('rejects positive integers', () => {
|
|
22
|
+
expect(() => asNonPositiveSafeInt(1)).toThrow(TypeError);
|
|
23
|
+
|
|
24
|
+
expect(() => asNonPositiveSafeInt(42)).toThrow(TypeError);
|
|
25
|
+
|
|
26
|
+
expect(() => asNonPositiveSafeInt(Number.MAX_SAFE_INTEGER)).toThrow(
|
|
27
|
+
TypeError,
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('rejects values outside safe integer range', () => {
|
|
32
|
+
expect(() => asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER - 1)).toThrow(
|
|
33
|
+
TypeError,
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
expect(() => asNonPositiveSafeInt(Number.MAX_SAFE_INTEGER + 1)).toThrow(
|
|
37
|
+
TypeError,
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('rejects non-integers', () => {
|
|
42
|
+
expect(() => asNonPositiveSafeInt(Number.NaN)).toThrow(TypeError);
|
|
43
|
+
|
|
44
|
+
expect(() => asNonPositiveSafeInt(Number.POSITIVE_INFINITY)).toThrow(
|
|
45
|
+
TypeError,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
expect(() => asNonPositiveSafeInt(Number.NEGATIVE_INFINITY)).toThrow(
|
|
49
|
+
TypeError,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
expect(() => asNonPositiveSafeInt(-1.2)).toThrow(TypeError);
|
|
53
|
+
|
|
54
|
+
expect(() => asNonPositiveSafeInt(3.4)).toThrow(TypeError);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('returns the same value for valid inputs', () => {
|
|
58
|
+
expect(asNonPositiveSafeInt(0)).toBe(0);
|
|
59
|
+
|
|
60
|
+
expect(asNonPositiveSafeInt(-5)).toBe(-5);
|
|
61
|
+
|
|
62
|
+
expect(asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER)).toBe(
|
|
63
|
+
Number.MIN_SAFE_INTEGER,
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('throws TypeError for invalid values', () => {
|
|
68
|
+
expect(() => asNonPositiveSafeInt(1)).toThrow(TypeError);
|
|
69
|
+
|
|
70
|
+
expect(() => asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER - 1)).toThrow(
|
|
71
|
+
TypeError,
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
expect(() => asNonPositiveSafeInt(Number.NaN)).toThrow(TypeError);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe(isNonPositiveSafeInt, () => {
|
|
79
|
+
test('correctly identifies non-positive safe integers', () => {
|
|
80
|
+
assert.isTrue(isNonPositiveSafeInt(0));
|
|
81
|
+
|
|
82
|
+
assert.isTrue(isNonPositiveSafeInt(-1));
|
|
83
|
+
|
|
84
|
+
assert.isTrue(isNonPositiveSafeInt(-1000));
|
|
85
|
+
|
|
86
|
+
assert.isTrue(isNonPositiveSafeInt(Number.MIN_SAFE_INTEGER));
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('correctly identifies positive integers', () => {
|
|
90
|
+
assert.isFalse(isNonPositiveSafeInt(1));
|
|
91
|
+
|
|
92
|
+
assert.isFalse(isNonPositiveSafeInt(42));
|
|
93
|
+
|
|
94
|
+
assert.isFalse(isNonPositiveSafeInt(Number.MAX_SAFE_INTEGER));
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('correctly identifies values outside safe integer range', () => {
|
|
98
|
+
assert.isFalse(isNonPositiveSafeInt(Number.MIN_SAFE_INTEGER - 1));
|
|
99
|
+
|
|
100
|
+
assert.isFalse(isNonPositiveSafeInt(Number.MAX_SAFE_INTEGER + 1));
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('correctly identifies non-integers', () => {
|
|
104
|
+
assert.isFalse(isNonPositiveSafeInt(Number.NaN));
|
|
105
|
+
|
|
106
|
+
assert.isFalse(isNonPositiveSafeInt(Number.POSITIVE_INFINITY));
|
|
107
|
+
|
|
108
|
+
assert.isFalse(isNonPositiveSafeInt(Number.NEGATIVE_INFINITY));
|
|
109
|
+
|
|
110
|
+
assert.isFalse(isNonPositiveSafeInt(-1.2));
|
|
111
|
+
|
|
112
|
+
assert.isFalse(isNonPositiveSafeInt(3.4));
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
describe('NonPositiveSafeInt.is', () => {
|
|
117
|
+
test('works as a type guard', () => {
|
|
118
|
+
const value: number = -42;
|
|
119
|
+
|
|
120
|
+
if (NonPositiveSafeInt.is(value)) {
|
|
121
|
+
expectType<typeof value, typeof value & NonPositiveSafeInt>('=');
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe('NonPositiveSafeInt.MIN_VALUE', () => {
|
|
127
|
+
test('is Number.MIN_SAFE_INTEGER', () => {
|
|
128
|
+
expect(NonPositiveSafeInt.MIN_VALUE).toBe(Number.MIN_SAFE_INTEGER);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe('NonPositiveSafeInt.MAX_VALUE', () => {
|
|
133
|
+
test('is 0', () => {
|
|
134
|
+
expect(NonPositiveSafeInt.MAX_VALUE).toBe(0);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
describe('NonPositiveSafeInt.min', () => {
|
|
139
|
+
test('returns the smaller value', () => {
|
|
140
|
+
expect(NonPositiveSafeInt.min(-5, -10)).toBe(-10);
|
|
141
|
+
|
|
142
|
+
expect(NonPositiveSafeInt.min(0, -1)).toBe(-1);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('clamps to range when necessary', () => {
|
|
146
|
+
expect(NonPositiveSafeInt.min(-5, 10)).toBe(-5);
|
|
147
|
+
|
|
148
|
+
expect(NonPositiveSafeInt.min(5, 10)).toBe(0);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe('NonPositiveSafeInt.max', () => {
|
|
153
|
+
test('returns the larger value', () => {
|
|
154
|
+
expect(NonPositiveSafeInt.max(-5, -10)).toBe(-5);
|
|
155
|
+
|
|
156
|
+
expect(NonPositiveSafeInt.max(-1, 0)).toBe(0);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('clamps to range when necessary', () => {
|
|
160
|
+
expect(NonPositiveSafeInt.max(-5, -10)).toBe(-5);
|
|
161
|
+
|
|
162
|
+
expect(NonPositiveSafeInt.max(-5, 10)).toBe(0);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('NonPositiveSafeInt.clamp', () => {
|
|
167
|
+
test('returns the same value if within range', () => {
|
|
168
|
+
expect(NonPositiveSafeInt.clamp(-5)).toBe(-5);
|
|
169
|
+
|
|
170
|
+
expect(NonPositiveSafeInt.clamp(0)).toBe(0);
|
|
171
|
+
|
|
172
|
+
expect(NonPositiveSafeInt.clamp(-1000)).toBe(-1000);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('clamps positive values to MAX_VALUE (0)', () => {
|
|
176
|
+
expect(NonPositiveSafeInt.clamp(5)).toBe(0);
|
|
177
|
+
|
|
178
|
+
expect(NonPositiveSafeInt.clamp(1000)).toBe(0);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('clamps out-of-range negative values to MIN_VALUE', () => {
|
|
182
|
+
expect(NonPositiveSafeInt.clamp(Number.MIN_SAFE_INTEGER - 1)).toBe(
|
|
183
|
+
Number.MIN_SAFE_INTEGER,
|
|
184
|
+
);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe('NonPositiveSafeInt.add', () => {
|
|
189
|
+
test('adds two non-positive integers', () => {
|
|
190
|
+
expect(NonPositiveSafeInt.add(-5, -3)).toBe(-8);
|
|
191
|
+
|
|
192
|
+
expect(NonPositiveSafeInt.add(0, -10)).toBe(-10);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('clamps result to MAX_VALUE (0) when sum is positive', () => {
|
|
196
|
+
expect(NonPositiveSafeInt.add(-5, 10)).toBe(0);
|
|
197
|
+
|
|
198
|
+
expect(NonPositiveSafeInt.add(0, 0)).toBe(0);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
describe('NonPositiveSafeInt.sub', () => {
|
|
203
|
+
test('subtracts two non-positive integers', () => {
|
|
204
|
+
expect(NonPositiveSafeInt.sub(-10, -3)).toBe(-7);
|
|
205
|
+
|
|
206
|
+
expect(NonPositiveSafeInt.sub(0, -5)).toBe(0);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test('clamps result to MAX_VALUE (0) when result is positive', () => {
|
|
210
|
+
expect(NonPositiveSafeInt.sub(-5, -10)).toBe(0);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
describe('NonPositiveSafeInt.random', () => {
|
|
215
|
+
test('generates values within range', () => {
|
|
216
|
+
for (const _ of range(100)) {
|
|
217
|
+
const value = NonPositiveSafeInt.random();
|
|
218
|
+
|
|
219
|
+
assert.isTrue(isNonPositiveSafeInt(value));
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
});
|
|
@@ -15,7 +15,6 @@ const typeNameInMessage = 'a non-zero finite number';
|
|
|
15
15
|
|
|
16
16
|
const {
|
|
17
17
|
abs,
|
|
18
|
-
add,
|
|
19
18
|
castType,
|
|
20
19
|
div,
|
|
21
20
|
is,
|
|
@@ -24,7 +23,6 @@ const {
|
|
|
24
23
|
mul,
|
|
25
24
|
pow,
|
|
26
25
|
randomNonZero: random,
|
|
27
|
-
sub,
|
|
28
26
|
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForFloat<
|
|
29
27
|
ElementType,
|
|
30
28
|
number,
|
|
@@ -169,24 +167,6 @@ export const NonZeroFiniteNumber = {
|
|
|
169
167
|
*/
|
|
170
168
|
pow,
|
|
171
169
|
|
|
172
|
-
/**
|
|
173
|
-
* Adds two NonZeroFiniteNumber values.
|
|
174
|
-
*
|
|
175
|
-
* @param a The first NonZeroFiniteNumber.
|
|
176
|
-
* @param b The second NonZeroFiniteNumber.
|
|
177
|
-
* @returns `a + b` as a NonZeroFiniteNumber.
|
|
178
|
-
*/
|
|
179
|
-
add,
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Subtracts one NonZeroFiniteNumber from another.
|
|
183
|
-
*
|
|
184
|
-
* @param a The minuend NonZeroFiniteNumber.
|
|
185
|
-
* @param b The subtrahend NonZeroFiniteNumber.
|
|
186
|
-
* @returns `a - b` as a NonZeroFiniteNumber.
|
|
187
|
-
*/
|
|
188
|
-
sub,
|
|
189
|
-
|
|
190
170
|
/**
|
|
191
171
|
* Multiplies two NonZeroFiniteNumber values.
|
|
192
172
|
*
|
|
@@ -199,6 +179,10 @@ export const NonZeroFiniteNumber = {
|
|
|
199
179
|
/**
|
|
200
180
|
* Divides one NonZeroFiniteNumber by another.
|
|
201
181
|
*
|
|
182
|
+
* Exact (non-flooring) division of two non-zero finite numbers is always
|
|
183
|
+
* non-zero, so this stays closed. For the non-closed operations (`add`/`sub`,
|
|
184
|
+
* whose result may be `0`) use {@link Num.add}/{@link Num.sub}.
|
|
185
|
+
*
|
|
202
186
|
* @param a The dividend NonZeroFiniteNumber.
|
|
203
187
|
* @param b The divisor NonZeroFiniteNumber.
|
|
204
188
|
* @returns `a / b` as a NonZeroFiniteNumber.
|
|
@@ -213,10 +197,18 @@ expectType<
|
|
|
213
197
|
|
|
214
198
|
expectType<
|
|
215
199
|
keyof typeof NonZeroFiniteNumber,
|
|
216
|
-
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
200
|
+
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
201
|
+
ElementType,
|
|
202
|
+
never,
|
|
203
|
+
'div' | 'mul'
|
|
204
|
+
>
|
|
217
205
|
>('=');
|
|
218
206
|
|
|
219
207
|
expectType<
|
|
220
208
|
typeof NonZeroFiniteNumber,
|
|
221
|
-
TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
209
|
+
TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
210
|
+
ElementType,
|
|
211
|
+
never,
|
|
212
|
+
'div' | 'mul'
|
|
213
|
+
>
|
|
222
214
|
>('<=');
|
|
@@ -146,18 +146,6 @@ describe('NonZeroFiniteNumber test', () => {
|
|
|
146
146
|
expect(NonZeroFiniteNumber.round(c)).toBe(-3);
|
|
147
147
|
});
|
|
148
148
|
|
|
149
|
-
test('add', () => {
|
|
150
|
-
expect(NonZeroFiniteNumber.add(a, b)).toBe(8);
|
|
151
|
-
|
|
152
|
-
expect(NonZeroFiniteNumber.add(a, c)).toBe(2);
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
test('sub', () => {
|
|
156
|
-
expect(NonZeroFiniteNumber.sub(a, b)).toBe(3);
|
|
157
|
-
|
|
158
|
-
expect(NonZeroFiniteNumber.sub(a, c)).toBe(9);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
149
|
test('mul', () => {
|
|
162
150
|
expect(NonZeroFiniteNumber.mul(a, b)).toBe(13.75);
|
|
163
151
|
|
|
@@ -10,16 +10,13 @@ const typeNameInMessage = 'a non-zero integer';
|
|
|
10
10
|
|
|
11
11
|
const {
|
|
12
12
|
abs,
|
|
13
|
-
add,
|
|
14
13
|
castType,
|
|
15
|
-
div,
|
|
16
14
|
is,
|
|
17
15
|
max: max_,
|
|
18
16
|
min: min_,
|
|
19
17
|
mul,
|
|
20
18
|
pow,
|
|
21
19
|
randomNonZero: random,
|
|
22
|
-
sub,
|
|
23
20
|
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
|
|
24
21
|
ElementType,
|
|
25
22
|
number,
|
|
@@ -107,49 +104,30 @@ export const NonZeroInt = {
|
|
|
107
104
|
*/
|
|
108
105
|
pow,
|
|
109
106
|
|
|
110
|
-
/**
|
|
111
|
-
* Adds two non-zero integers.
|
|
112
|
-
*
|
|
113
|
-
* @param a The first non-zero integer.
|
|
114
|
-
* @param b The second non-zero integer.
|
|
115
|
-
* @returns `a + b` as a NonZeroInt.
|
|
116
|
-
*/
|
|
117
|
-
add,
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Subtracts one non-zero integer from another.
|
|
121
|
-
*
|
|
122
|
-
* @param a The minuend non-zero integer.
|
|
123
|
-
* @param b The subtrahend non-zero integer.
|
|
124
|
-
* @returns `a - b` as a NonZeroInt.
|
|
125
|
-
*/
|
|
126
|
-
sub,
|
|
127
|
-
|
|
128
107
|
/**
|
|
129
108
|
* Multiplies two non-zero integers.
|
|
130
109
|
*
|
|
110
|
+
* The product of two non-zero integers is always non-zero, so this stays
|
|
111
|
+
* closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
|
|
112
|
+
* be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
|
|
113
|
+
*
|
|
131
114
|
* @param a The first non-zero integer.
|
|
132
115
|
* @param b The second non-zero integer.
|
|
133
116
|
* @returns `a * b` as a NonZeroInt.
|
|
134
117
|
*/
|
|
135
118
|
mul,
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Divides one non-zero integer by another using floor division.
|
|
139
|
-
*
|
|
140
|
-
* @param a The dividend non-zero integer.
|
|
141
|
-
* @param b The divisor non-zero integer.
|
|
142
|
-
* @returns `⌊a / b⌋` as a NonZeroInt.
|
|
143
|
-
*/
|
|
144
|
-
div,
|
|
145
119
|
} as const;
|
|
146
120
|
|
|
147
121
|
expectType<
|
|
148
122
|
keyof typeof NonZeroInt,
|
|
149
|
-
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
123
|
+
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
124
|
+
ElementType,
|
|
125
|
+
'int',
|
|
126
|
+
'mul'
|
|
127
|
+
>
|
|
150
128
|
>('=');
|
|
151
129
|
|
|
152
130
|
expectType<
|
|
153
131
|
typeof NonZeroInt,
|
|
154
|
-
TsDataForgeInternals.RefinedNumberUtils.NumberClass<ElementType, 'int'>
|
|
132
|
+
TsDataForgeInternals.RefinedNumberUtils.NumberClass<ElementType, 'int', 'mul'>
|
|
155
133
|
>('<=');
|
|
@@ -127,32 +127,12 @@ describe('NonZeroInt test', () => {
|
|
|
127
127
|
expect(NonZeroInt.max(a, c)).toBe(5);
|
|
128
128
|
});
|
|
129
129
|
|
|
130
|
-
test('add', () => {
|
|
131
|
-
expect(NonZeroInt.add(a, b)).toBe(7);
|
|
132
|
-
|
|
133
|
-
expect(NonZeroInt.add(a, c)).toBe(2);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
test('sub', () => {
|
|
137
|
-
expect(NonZeroInt.sub(a, b)).toBe(3);
|
|
138
|
-
|
|
139
|
-
expect(NonZeroInt.sub(a, c)).toBe(8);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
130
|
test('mul', () => {
|
|
143
131
|
expect(NonZeroInt.mul(a, b)).toBe(10);
|
|
144
132
|
|
|
145
133
|
expect(NonZeroInt.mul(a, c)).toBe(-15);
|
|
146
134
|
});
|
|
147
135
|
|
|
148
|
-
test('div (floor division)', () => {
|
|
149
|
-
expect(NonZeroInt.div(a, b)).toBe(2);
|
|
150
|
-
|
|
151
|
-
expect(NonZeroInt.div(asNonZeroInt(7), asNonZeroInt(3))).toBe(2);
|
|
152
|
-
|
|
153
|
-
expect(NonZeroInt.div(asNonZeroInt(-7), asNonZeroInt(3))).toBe(-3);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
136
|
test('pow', () => {
|
|
157
137
|
expect(NonZeroInt.pow(asNonZeroInt(2), asNonZeroInt(3))).toBe(8);
|
|
158
138
|
|
|
@@ -12,17 +12,14 @@ const {
|
|
|
12
12
|
MAX_VALUE,
|
|
13
13
|
MIN_VALUE,
|
|
14
14
|
abs,
|
|
15
|
-
add,
|
|
16
15
|
castType,
|
|
17
16
|
clamp,
|
|
18
|
-
div,
|
|
19
17
|
is,
|
|
20
18
|
max: max_,
|
|
21
19
|
min: min_,
|
|
22
20
|
mul,
|
|
23
21
|
pow,
|
|
24
22
|
randomNonZero: random,
|
|
25
|
-
sub,
|
|
26
23
|
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
|
|
27
24
|
ElementType,
|
|
28
25
|
number,
|
|
@@ -137,48 +134,26 @@ export const NonZeroInt16 = {
|
|
|
137
134
|
*/
|
|
138
135
|
pow,
|
|
139
136
|
|
|
140
|
-
/**
|
|
141
|
-
* Adds two NonZeroInt16 values.
|
|
142
|
-
*
|
|
143
|
-
* @param a The first NonZeroInt16.
|
|
144
|
-
* @param b The second NonZeroInt16.
|
|
145
|
-
* @returns `a + b` clamped to [-32768, 32767] as a NonZeroInt16.
|
|
146
|
-
*/
|
|
147
|
-
add,
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Subtracts one NonZeroInt16 from another.
|
|
151
|
-
*
|
|
152
|
-
* @param a The minuend NonZeroInt16.
|
|
153
|
-
* @param b The subtrahend NonZeroInt16.
|
|
154
|
-
* @returns `a - b` clamped to [-32768, 32767] as a NonZeroInt16.
|
|
155
|
-
*/
|
|
156
|
-
sub,
|
|
157
|
-
|
|
158
137
|
/**
|
|
159
138
|
* Multiplies two NonZeroInt16 values.
|
|
160
139
|
*
|
|
140
|
+
* The product of two non-zero integers is always non-zero, so this stays
|
|
141
|
+
* closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
|
|
142
|
+
* be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
|
|
143
|
+
*
|
|
161
144
|
* @param a The first NonZeroInt16.
|
|
162
145
|
* @param b The second NonZeroInt16.
|
|
163
146
|
* @returns `a * b` clamped to [-32768, 32767] as a NonZeroInt16.
|
|
164
147
|
*/
|
|
165
148
|
mul,
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Divides one NonZeroInt16 by another using floor division.
|
|
169
|
-
*
|
|
170
|
-
* @param a The dividend NonZeroInt16.
|
|
171
|
-
* @param b The divisor NonZeroInt16.
|
|
172
|
-
* @returns `⌊a / b⌋` clamped to [-32768, 32767] as a NonZeroInt16.
|
|
173
|
-
*/
|
|
174
|
-
div,
|
|
175
149
|
} as const;
|
|
176
150
|
|
|
177
151
|
expectType<
|
|
178
152
|
keyof typeof NonZeroInt16,
|
|
179
153
|
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
180
154
|
ElementType,
|
|
181
|
-
'int' | 'range'
|
|
155
|
+
'int' | 'range',
|
|
156
|
+
'mul'
|
|
182
157
|
>
|
|
183
158
|
>('=');
|
|
184
159
|
|
|
@@ -186,6 +161,7 @@ expectType<
|
|
|
186
161
|
typeof NonZeroInt16,
|
|
187
162
|
TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
188
163
|
ElementType,
|
|
189
|
-
'int' | 'range'
|
|
164
|
+
'int' | 'range',
|
|
165
|
+
'mul'
|
|
190
166
|
>
|
|
191
167
|
>('<=');
|
|
@@ -154,28 +154,6 @@ describe('NonZeroInt16 test', () => {
|
|
|
154
154
|
expect(NonZeroInt16.max(a, c)).toBe(100);
|
|
155
155
|
});
|
|
156
156
|
|
|
157
|
-
test('add (with clamping)', () => {
|
|
158
|
-
const result = NonZeroInt16.add(
|
|
159
|
-
asNonZeroInt16(32_000),
|
|
160
|
-
asNonZeroInt16(1000),
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
expect(result).toBe(32_767); // clamped to max
|
|
164
|
-
|
|
165
|
-
expect(NonZeroInt16.add(a, b)).toBe(150);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
test('sub (with clamping)', () => {
|
|
169
|
-
const result = NonZeroInt16.sub(
|
|
170
|
-
asNonZeroInt16(-32_000),
|
|
171
|
-
asNonZeroInt16(1000),
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
expect(result).toBe(-32_768); // clamped to min
|
|
175
|
-
|
|
176
|
-
expect(NonZeroInt16.sub(a, b)).toBe(50);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
157
|
test('mul (with clamping)', () => {
|
|
180
158
|
const result = NonZeroInt16.mul(
|
|
181
159
|
asNonZeroInt16(1000),
|
|
@@ -187,14 +165,6 @@ describe('NonZeroInt16 test', () => {
|
|
|
187
165
|
expect(NonZeroInt16.mul(asNonZeroInt16(10), asNonZeroInt16(5))).toBe(50);
|
|
188
166
|
});
|
|
189
167
|
|
|
190
|
-
test('div (floor division with clamping)', () => {
|
|
191
|
-
expect(NonZeroInt16.div(a, asNonZeroInt16(50))).toBe(2);
|
|
192
|
-
|
|
193
|
-
expect(NonZeroInt16.div(asNonZeroInt16(7), asNonZeroInt16(3))).toBe(2);
|
|
194
|
-
|
|
195
|
-
expect(NonZeroInt16.div(asNonZeroInt16(-7), asNonZeroInt16(3))).toBe(-3);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
168
|
test('pow (with clamping)', () => {
|
|
199
169
|
const result = NonZeroInt16.pow(asNonZeroInt16(200), asNonZeroInt16(3));
|
|
200
170
|
|
|
@@ -12,17 +12,14 @@ const {
|
|
|
12
12
|
MAX_VALUE,
|
|
13
13
|
MIN_VALUE,
|
|
14
14
|
abs,
|
|
15
|
-
add,
|
|
16
15
|
castType,
|
|
17
16
|
clamp,
|
|
18
|
-
div,
|
|
19
17
|
is,
|
|
20
18
|
max: max_,
|
|
21
19
|
min: min_,
|
|
22
20
|
mul,
|
|
23
21
|
pow,
|
|
24
22
|
randomNonZero: random,
|
|
25
|
-
sub,
|
|
26
23
|
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
|
|
27
24
|
ElementType,
|
|
28
25
|
number,
|
|
@@ -138,48 +135,26 @@ export const NonZeroInt32 = {
|
|
|
138
135
|
*/
|
|
139
136
|
pow,
|
|
140
137
|
|
|
141
|
-
/**
|
|
142
|
-
* Adds two NonZeroInt32 values.
|
|
143
|
-
*
|
|
144
|
-
* @param a The first NonZeroInt32.
|
|
145
|
-
* @param b The second NonZeroInt32.
|
|
146
|
-
* @returns `a + b` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
|
|
147
|
-
*/
|
|
148
|
-
add,
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Subtracts one NonZeroInt32 from another.
|
|
152
|
-
*
|
|
153
|
-
* @param a The minuend NonZeroInt32.
|
|
154
|
-
* @param b The subtrahend NonZeroInt32.
|
|
155
|
-
* @returns `a - b` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
|
|
156
|
-
*/
|
|
157
|
-
sub,
|
|
158
|
-
|
|
159
138
|
/**
|
|
160
139
|
* Multiplies two NonZeroInt32 values.
|
|
161
140
|
*
|
|
141
|
+
* The product of two non-zero integers is always non-zero, so this stays
|
|
142
|
+
* closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
|
|
143
|
+
* be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
|
|
144
|
+
*
|
|
162
145
|
* @param a The first NonZeroInt32.
|
|
163
146
|
* @param b The second NonZeroInt32.
|
|
164
147
|
* @returns `a * b` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
|
|
165
148
|
*/
|
|
166
149
|
mul,
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Divides one NonZeroInt32 by another using floor division.
|
|
170
|
-
*
|
|
171
|
-
* @param a The dividend NonZeroInt32.
|
|
172
|
-
* @param b The divisor NonZeroInt32.
|
|
173
|
-
* @returns `⌊a / b⌋` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
|
|
174
|
-
*/
|
|
175
|
-
div,
|
|
176
150
|
} as const;
|
|
177
151
|
|
|
178
152
|
expectType<
|
|
179
153
|
keyof typeof NonZeroInt32,
|
|
180
154
|
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
181
155
|
ElementType,
|
|
182
|
-
'int' | 'range'
|
|
156
|
+
'int' | 'range',
|
|
157
|
+
'mul'
|
|
183
158
|
>
|
|
184
159
|
>('=');
|
|
185
160
|
|
|
@@ -187,6 +162,7 @@ expectType<
|
|
|
187
162
|
typeof NonZeroInt32,
|
|
188
163
|
TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
189
164
|
ElementType,
|
|
190
|
-
'int' | 'range'
|
|
165
|
+
'int' | 'range',
|
|
166
|
+
'mul'
|
|
191
167
|
>
|
|
192
168
|
>('<=');
|
|
@@ -154,28 +154,6 @@ describe('NonZeroInt32 test', () => {
|
|
|
154
154
|
expect(NonZeroInt32.max(a, c)).toBe(1_000_000);
|
|
155
155
|
});
|
|
156
156
|
|
|
157
|
-
test('add (with clamping)', () => {
|
|
158
|
-
const result = NonZeroInt32.add(
|
|
159
|
-
asNonZeroInt32(2_147_483_000),
|
|
160
|
-
asNonZeroInt32(1000),
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
expect(result).toBe(2_147_483_647); // clamped to max
|
|
164
|
-
|
|
165
|
-
expect(NonZeroInt32.add(a, b)).toBe(1_500_000);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
test('sub (with clamping)', () => {
|
|
169
|
-
const result = NonZeroInt32.sub(
|
|
170
|
-
asNonZeroInt32(-2_147_483_000),
|
|
171
|
-
asNonZeroInt32(1000),
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
expect(result).toBe(-2_147_483_648); // clamped to min
|
|
175
|
-
|
|
176
|
-
expect(NonZeroInt32.sub(a, b)).toBe(500_000);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
157
|
test('mul (with clamping)', () => {
|
|
180
158
|
const result = NonZeroInt32.mul(
|
|
181
159
|
asNonZeroInt32(100_000),
|
|
@@ -189,14 +167,6 @@ describe('NonZeroInt32 test', () => {
|
|
|
189
167
|
);
|
|
190
168
|
});
|
|
191
169
|
|
|
192
|
-
test('div (floor division with clamping)', () => {
|
|
193
|
-
expect(NonZeroInt32.div(a, asNonZeroInt32(500_000))).toBe(2);
|
|
194
|
-
|
|
195
|
-
expect(NonZeroInt32.div(asNonZeroInt32(7), asNonZeroInt32(3))).toBe(2);
|
|
196
|
-
|
|
197
|
-
expect(NonZeroInt32.div(asNonZeroInt32(-7), asNonZeroInt32(3))).toBe(-3);
|
|
198
|
-
});
|
|
199
|
-
|
|
200
170
|
test('pow (with clamping)', () => {
|
|
201
171
|
const result = NonZeroInt32.pow(
|
|
202
172
|
asNonZeroInt32(10_000),
|