ts-data-forge 6.13.1 → 7.0.1
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-creation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-creation.mjs +1 -1
- package/dist/array/impl/array-utils-creation.mjs.map +1 -1
- package/dist/array/impl/array-utils-iterators.mjs +7 -1
- 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.d.mts +1 -1
- package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.mjs +6 -1
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
- package/dist/array/impl/array-utils-search.d.mts +0 -2
- package/dist/array/impl/array-utils-search.d.mts.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-set-op.d.mts.map +1 -1
- package/dist/array/impl/array-utils-set-op.mjs +0 -1
- package/dist/array/impl/array-utils-set-op.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.d.mts +1 -1
- package/dist/array/impl/array-utils-transformation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-transformation.mjs +8 -4
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
- package/dist/array/impl/array-utils-validation.d.mts.map +1 -1
- package/dist/array/impl/array-utils-validation.mjs +9 -9
- package/dist/array/impl/array-utils-validation.mjs.map +1 -1
- package/dist/collections/imap-mapped.d.mts +622 -3
- package/dist/collections/imap-mapped.d.mts.map +1 -1
- package/dist/collections/imap-mapped.mjs +117 -18
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.d.mts +3 -3
- package/dist/collections/imap.d.mts.map +1 -1
- package/dist/collections/imap.mjs +12 -5
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.d.mts +4 -4
- package/dist/collections/iset-mapped.d.mts.map +1 -1
- package/dist/collections/iset-mapped.mjs +14 -4
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.d.mts +2 -2
- package/dist/collections/iset.d.mts.map +1 -1
- package/dist/collections/iset.mjs +11 -2
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.mjs +26 -20
- package/dist/collections/queue.mjs.map +1 -1
- package/dist/collections/stack.mjs +23 -17
- 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/functional/optional/impl/optional-flat-map.d.mts +2 -2
- package/dist/functional/pipe.d.mts.map +1 -1
- package/dist/functional/pipe.mjs.map +1 -1
- package/dist/functional/result/impl/result-flat-map.d.mts +2 -2
- package/dist/functional/ternary-result/impl/ternary-result-flat-map.d.mts +5 -3
- package/dist/functional/ternary-result/impl/ternary-result-flat-map.d.mts.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs.map +1 -1
- package/dist/guard/has-key.d.mts.map +1 -1
- package/dist/guard/has-key.mjs +1 -3
- package/dist/guard/has-key.mjs.map +1 -1
- package/dist/guard/is-non-null-object.d.mts.map +1 -1
- package/dist/guard/is-non-null-object.mjs +1 -3
- package/dist/guard/is-non-null-object.mjs.map +1 -1
- package/dist/guard/key-is-in.d.mts.map +1 -1
- package/dist/guard/key-is-in.mjs +1 -3
- package/dist/guard/key-is-in.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 +11 -7
- 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 +7 -30
- 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-safe-int.mjs +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-int.mjs +2 -2
- package/dist/number/branded-types/safe-uint.d.mts +1 -1
- package/dist/number/branded-types/safe-uint.mjs +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 +67 -15
- 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 +7 -1
- package/dist/object/object.mjs.map +1 -1
- package/dist/others/fast-deep-equal.d.mts.map +1 -1
- package/dist/others/fast-deep-equal.mjs +0 -1
- package/dist/others/fast-deep-equal.mjs.map +1 -1
- package/dist/others/unknown-to-string.mjs +2 -2
- package/dist/others/unknown-to-string.mjs.map +1 -1
- package/package.json +6 -6
- package/src/array/impl/array-utils-creation.mts +1 -1
- package/src/array/impl/array-utils-iterators.mts +1 -1
- package/src/array/impl/array-utils-reducing-value.mts +1 -2
- package/src/array/impl/array-utils-search.mts +0 -2
- package/src/array/impl/array-utils-set-op.mts +0 -1
- package/src/array/impl/array-utils-transformation.mts +8 -6
- package/src/array/impl/array-utils-validation.mts +1 -5
- package/src/collections/imap-mapped.mts +696 -34
- package/src/collections/imap-mapped.test.mts +61 -13
- package/src/collections/imap.mts +20 -9
- package/src/collections/imap.test.mts +9 -8
- package/src/collections/iset-mapped.mts +18 -10
- package/src/collections/iset-mapped.test.mts +6 -1
- package/src/collections/iset.mts +11 -4
- package/src/collections/iset.test.mts +6 -8
- package/src/collections/queue.mts +32 -32
- package/src/collections/stack.mts +26 -26
- package/src/functional/optional/impl/optional-flat-map.mts +2 -2
- package/src/functional/optional.test.mts +6 -4
- package/src/functional/pipe.mts +0 -1
- package/src/functional/pipe.test.mts +2 -1
- package/src/functional/result/impl/result-flat-map.mts +2 -2
- package/src/functional/result.test.mts +3 -2
- package/src/functional/ternary-result/impl/ternary-result-flat-map.mts +5 -3
- package/src/functional/ternary-result.test.mts +8 -3
- package/src/guard/has-key.mts +1 -3
- package/src/guard/is-non-null-object.mts +0 -1
- package/src/guard/key-is-in.mts +1 -3
- package/src/json/json.mts +5 -8
- package/src/json/json.test.mts +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 +10 -37
- 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/branded-types/positive-safe-int.mts +1 -1
- package/src/number/branded-types/safe-int.mts +2 -2
- package/src/number/branded-types/safe-uint.mts +1 -1
- package/src/number/index.mts +1 -0
- package/src/number/num-arithmetic-types.mts +265 -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 +99 -18
- package/src/number/num.test.mts +2 -2
- package/src/number/refined-number-utils.mts +19 -9
- package/src/object/object.mts +2 -2
- package/src/others/fast-deep-equal.mts +0 -2
- package/src/others/map-nullable.test.mts +4 -3
- package/src/others/unknown-to-string.mts +2 -2
|
@@ -16,17 +16,14 @@ const {
|
|
|
16
16
|
MAX_VALUE,
|
|
17
17
|
MIN_VALUE,
|
|
18
18
|
abs,
|
|
19
|
-
add,
|
|
20
19
|
castType,
|
|
21
20
|
clamp,
|
|
22
|
-
div,
|
|
23
21
|
is,
|
|
24
22
|
max: max_,
|
|
25
23
|
min: min_,
|
|
26
24
|
mul,
|
|
27
25
|
pow,
|
|
28
26
|
randomNonZero: random,
|
|
29
|
-
sub,
|
|
30
27
|
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
|
|
31
28
|
ElementType,
|
|
32
29
|
SafeInt,
|
|
@@ -34,9 +31,9 @@ const {
|
|
|
34
31
|
>({
|
|
35
32
|
integerOrSafeInteger: 'SafeInteger',
|
|
36
33
|
nonZero: true,
|
|
37
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-min-safe-integer
|
|
34
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-min-safe-integer
|
|
38
35
|
MIN_VALUE: Number.MIN_SAFE_INTEGER as SafeInt,
|
|
39
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
36
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
40
37
|
MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
|
|
41
38
|
typeNameInMessage,
|
|
42
39
|
} as const);
|
|
@@ -144,52 +141,27 @@ export const NonZeroSafeInt = {
|
|
|
144
141
|
*/
|
|
145
142
|
pow,
|
|
146
143
|
|
|
147
|
-
/**
|
|
148
|
-
* Adds two NonZeroSafeInt values.
|
|
149
|
-
*
|
|
150
|
-
* @param a The first NonZeroSafeInt.
|
|
151
|
-
* @param b The second NonZeroSafeInt.
|
|
152
|
-
* @returns `a + b` clamped to non-zero safe integer range as a
|
|
153
|
-
* NonZeroSafeInt.
|
|
154
|
-
*/
|
|
155
|
-
add,
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Subtracts one NonZeroSafeInt from another.
|
|
159
|
-
*
|
|
160
|
-
* @param a The minuend NonZeroSafeInt.
|
|
161
|
-
* @param b The subtrahend NonZeroSafeInt.
|
|
162
|
-
* @returns `a - b` clamped to non-zero safe integer range as a
|
|
163
|
-
* NonZeroSafeInt.
|
|
164
|
-
*/
|
|
165
|
-
sub,
|
|
166
|
-
|
|
167
144
|
/**
|
|
168
145
|
* Multiplies two NonZeroSafeInt values.
|
|
169
146
|
*
|
|
147
|
+
* The product of two non-zero safe integers is always non-zero, so this stays
|
|
148
|
+
* closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
|
|
149
|
+
* be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
|
|
150
|
+
*
|
|
170
151
|
* @param a The first NonZeroSafeInt.
|
|
171
152
|
* @param b The second NonZeroSafeInt.
|
|
172
153
|
* @returns `a * b` clamped to non-zero safe integer range as a
|
|
173
154
|
* NonZeroSafeInt.
|
|
174
155
|
*/
|
|
175
156
|
mul,
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Divides one NonZeroSafeInt by another using floor division.
|
|
179
|
-
*
|
|
180
|
-
* @param a The dividend NonZeroSafeInt.
|
|
181
|
-
* @param b The divisor NonZeroSafeInt.
|
|
182
|
-
* @returns `⌊a / b⌋` clamped to non-zero safe integer range as a
|
|
183
|
-
* NonZeroSafeInt.
|
|
184
|
-
*/
|
|
185
|
-
div,
|
|
186
157
|
} as const;
|
|
187
158
|
|
|
188
159
|
expectType<
|
|
189
160
|
keyof typeof NonZeroSafeInt,
|
|
190
161
|
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
191
162
|
ElementType,
|
|
192
|
-
'int' | 'range'
|
|
163
|
+
'int' | 'range',
|
|
164
|
+
'mul'
|
|
193
165
|
>
|
|
194
166
|
>('=');
|
|
195
167
|
|
|
@@ -197,6 +169,7 @@ expectType<
|
|
|
197
169
|
typeof NonZeroSafeInt,
|
|
198
170
|
TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
199
171
|
ElementType,
|
|
200
|
-
'int' | 'range'
|
|
172
|
+
'int' | 'range',
|
|
173
|
+
'mul'
|
|
201
174
|
>
|
|
202
175
|
>('<=');
|
|
@@ -170,26 +170,6 @@ describe('NonZeroSafeInt test', () => {
|
|
|
170
170
|
expect(NonZeroSafeInt.max(a, c)).toBe(5);
|
|
171
171
|
});
|
|
172
172
|
|
|
173
|
-
test('add (with clamping to safe integer range)', () => {
|
|
174
|
-
const largeValue = asNonZeroSafeInt(Number.MAX_SAFE_INTEGER - 1);
|
|
175
|
-
|
|
176
|
-
const result = NonZeroSafeInt.add(largeValue, asNonZeroSafeInt(10));
|
|
177
|
-
|
|
178
|
-
expect(result).toBe(Number.MAX_SAFE_INTEGER); // clamped to max
|
|
179
|
-
|
|
180
|
-
expect(NonZeroSafeInt.add(a, b)).toBe(7);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
test('sub (with clamping to safe integer range)', () => {
|
|
184
|
-
const smallValue = asNonZeroSafeInt(Number.MIN_SAFE_INTEGER + 1);
|
|
185
|
-
|
|
186
|
-
const result = NonZeroSafeInt.sub(smallValue, asNonZeroSafeInt(10));
|
|
187
|
-
|
|
188
|
-
expect(result).toBe(Number.MIN_SAFE_INTEGER); // clamped to min
|
|
189
|
-
|
|
190
|
-
expect(NonZeroSafeInt.sub(a, b)).toBe(3);
|
|
191
|
-
});
|
|
192
|
-
|
|
193
173
|
test('mul (with clamping to safe integer range)', () => {
|
|
194
174
|
const largeValue = asNonZeroSafeInt(
|
|
195
175
|
Math.floor(Math.sqrt(Number.MAX_SAFE_INTEGER)),
|
|
@@ -204,18 +184,6 @@ describe('NonZeroSafeInt test', () => {
|
|
|
204
184
|
).toBe(50);
|
|
205
185
|
});
|
|
206
186
|
|
|
207
|
-
test('div (floor division with clamping)', () => {
|
|
208
|
-
expect(NonZeroSafeInt.div(a, b)).toBe(2);
|
|
209
|
-
|
|
210
|
-
expect(NonZeroSafeInt.div(asNonZeroSafeInt(7), asNonZeroSafeInt(3))).toBe(
|
|
211
|
-
2,
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
expect(
|
|
215
|
-
NonZeroSafeInt.div(asNonZeroSafeInt(-7), asNonZeroSafeInt(3)),
|
|
216
|
-
).toBe(-3);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
187
|
test('pow (with clamping to safe integer range)', () => {
|
|
220
188
|
const result = NonZeroSafeInt.pow(
|
|
221
189
|
asNonZeroSafeInt(1000),
|
|
@@ -14,14 +14,12 @@ const {
|
|
|
14
14
|
add,
|
|
15
15
|
castType,
|
|
16
16
|
clamp,
|
|
17
|
-
div,
|
|
18
17
|
is,
|
|
19
18
|
max: max_,
|
|
20
19
|
min: min_,
|
|
21
20
|
mul,
|
|
22
21
|
pow,
|
|
23
22
|
randomNonZero: random,
|
|
24
|
-
sub,
|
|
25
23
|
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
|
|
26
24
|
ElementType,
|
|
27
25
|
1,
|
|
@@ -136,39 +134,26 @@ export const NonZeroUint16 = {
|
|
|
136
134
|
*/
|
|
137
135
|
add,
|
|
138
136
|
|
|
139
|
-
/**
|
|
140
|
-
* Subtracts one NonZeroUint16 from another.
|
|
141
|
-
*
|
|
142
|
-
* @param a The minuend NonZeroUint16.
|
|
143
|
-
* @param b The subtrahend NonZeroUint16.
|
|
144
|
-
* @returns `a - b` clamped to [1, 65535] as a NonZeroUint16 (minimum 1).
|
|
145
|
-
*/
|
|
146
|
-
sub,
|
|
147
|
-
|
|
148
137
|
/**
|
|
149
138
|
* Multiplies two NonZeroUint16 values.
|
|
150
139
|
*
|
|
140
|
+
* Both `add` and `mul` stay within `[1, 65535]`. For the non-closed
|
|
141
|
+
* operations (`sub`/`div`, whose result may be `0`) use {@link Num.sub} /
|
|
142
|
+
* {@link Num.divInt}.
|
|
143
|
+
*
|
|
151
144
|
* @param a The first NonZeroUint16.
|
|
152
145
|
* @param b The second NonZeroUint16.
|
|
153
146
|
* @returns `a * b` clamped to [1, 65535] as a NonZeroUint16.
|
|
154
147
|
*/
|
|
155
148
|
mul,
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Divides one NonZeroUint16 by another using floor division.
|
|
159
|
-
*
|
|
160
|
-
* @param a The dividend NonZeroUint16.
|
|
161
|
-
* @param b The divisor NonZeroUint16.
|
|
162
|
-
* @returns `⌊a / b⌋` clamped to [1, 65535] as a NonZeroUint16.
|
|
163
|
-
*/
|
|
164
|
-
div,
|
|
165
149
|
} as const;
|
|
166
150
|
|
|
167
151
|
expectType<
|
|
168
152
|
keyof typeof NonZeroUint16,
|
|
169
153
|
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
170
154
|
ElementType,
|
|
171
|
-
'int' | 'positive' | 'range'
|
|
155
|
+
'int' | 'positive' | 'range',
|
|
156
|
+
'add' | 'mul'
|
|
172
157
|
>
|
|
173
158
|
>('=');
|
|
174
159
|
|
|
@@ -176,6 +161,7 @@ expectType<
|
|
|
176
161
|
typeof NonZeroUint16,
|
|
177
162
|
TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
178
163
|
ElementType,
|
|
179
|
-
'int' | 'positive' | 'range'
|
|
164
|
+
'int' | 'positive' | 'range',
|
|
165
|
+
'add' | 'mul'
|
|
180
166
|
>
|
|
181
167
|
>('<=');
|
|
@@ -159,12 +159,6 @@ describe('NonZeroUint16 test', () => {
|
|
|
159
159
|
expect(NonZeroUint16.add(a, b)).toBe(150);
|
|
160
160
|
});
|
|
161
161
|
|
|
162
|
-
test('sub (never goes below 1)', () => {
|
|
163
|
-
expect(NonZeroUint16.sub(a, b)).toBe(50);
|
|
164
|
-
|
|
165
|
-
expect(NonZeroUint16.sub(b, a)).toBe(1); // clamped to 1
|
|
166
|
-
});
|
|
167
|
-
|
|
168
162
|
test('mul (with clamping to non-zero uint16 range)', () => {
|
|
169
163
|
const result = NonZeroUint16.mul(
|
|
170
164
|
asNonZeroUint16(1000),
|
|
@@ -178,16 +172,6 @@ describe('NonZeroUint16 test', () => {
|
|
|
178
172
|
);
|
|
179
173
|
});
|
|
180
174
|
|
|
181
|
-
test('div (floor division, never goes below 1)', () => {
|
|
182
|
-
expect(NonZeroUint16.div(a, asNonZeroUint16(50))).toBe(2);
|
|
183
|
-
|
|
184
|
-
expect(NonZeroUint16.div(asNonZeroUint16(7), asNonZeroUint16(3))).toBe(2);
|
|
185
|
-
|
|
186
|
-
expect(NonZeroUint16.div(asNonZeroUint16(50), asNonZeroUint16(100))).toBe(
|
|
187
|
-
1,
|
|
188
|
-
); // floor(50/100) = 0, clamped to 1
|
|
189
|
-
});
|
|
190
|
-
|
|
191
175
|
test('pow (with clamping to non-zero uint16 range)', () => {
|
|
192
176
|
const result = NonZeroUint16.pow(
|
|
193
177
|
asNonZeroUint16(256),
|
|
@@ -14,14 +14,12 @@ const {
|
|
|
14
14
|
add,
|
|
15
15
|
castType,
|
|
16
16
|
clamp,
|
|
17
|
-
div,
|
|
18
17
|
is,
|
|
19
18
|
max: max_,
|
|
20
19
|
min: min_,
|
|
21
20
|
mul,
|
|
22
21
|
pow,
|
|
23
22
|
randomNonZero: random,
|
|
24
|
-
sub,
|
|
25
23
|
} = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
|
|
26
24
|
ElementType,
|
|
27
25
|
1,
|
|
@@ -136,39 +134,26 @@ export const NonZeroUint32 = {
|
|
|
136
134
|
*/
|
|
137
135
|
add,
|
|
138
136
|
|
|
139
|
-
/**
|
|
140
|
-
* Subtracts one NonZeroUint32 from another.
|
|
141
|
-
*
|
|
142
|
-
* @param a The minuend NonZeroUint32.
|
|
143
|
-
* @param b The subtrahend NonZeroUint32.
|
|
144
|
-
* @returns `a - b` clamped to [1, 4294967295] as a NonZeroUint32 (minimum 1).
|
|
145
|
-
*/
|
|
146
|
-
sub,
|
|
147
|
-
|
|
148
137
|
/**
|
|
149
138
|
* Multiplies two NonZeroUint32 values.
|
|
150
139
|
*
|
|
140
|
+
* Both `add` and `mul` stay within `[1, 4294967295]`. For the non-closed
|
|
141
|
+
* operations (`sub`/`div`, whose result may be `0`) use {@link Num.sub} /
|
|
142
|
+
* {@link Num.divInt}.
|
|
143
|
+
*
|
|
151
144
|
* @param a The first NonZeroUint32.
|
|
152
145
|
* @param b The second NonZeroUint32.
|
|
153
146
|
* @returns `a * b` clamped to [1, 4294967295] as a NonZeroUint32.
|
|
154
147
|
*/
|
|
155
148
|
mul,
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Divides one NonZeroUint32 by another using floor division.
|
|
159
|
-
*
|
|
160
|
-
* @param a The dividend NonZeroUint32.
|
|
161
|
-
* @param b The divisor NonZeroUint32.
|
|
162
|
-
* @returns `⌊a / b⌋` clamped to [1, 4294967295] as a NonZeroUint32.
|
|
163
|
-
*/
|
|
164
|
-
div,
|
|
165
149
|
} as const;
|
|
166
150
|
|
|
167
151
|
expectType<
|
|
168
152
|
keyof typeof NonZeroUint32,
|
|
169
153
|
keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
170
154
|
ElementType,
|
|
171
|
-
'int' | 'positive' | 'range'
|
|
155
|
+
'int' | 'positive' | 'range',
|
|
156
|
+
'add' | 'mul'
|
|
172
157
|
>
|
|
173
158
|
>('=');
|
|
174
159
|
|
|
@@ -176,6 +161,7 @@ expectType<
|
|
|
176
161
|
typeof NonZeroUint32,
|
|
177
162
|
TsDataForgeInternals.RefinedNumberUtils.NumberClass<
|
|
178
163
|
ElementType,
|
|
179
|
-
'int' | 'positive' | 'range'
|
|
164
|
+
'int' | 'positive' | 'range',
|
|
165
|
+
'add' | 'mul'
|
|
180
166
|
>
|
|
181
167
|
>('<=');
|
|
@@ -159,12 +159,6 @@ describe('NonZeroUint32 test', () => {
|
|
|
159
159
|
expect(NonZeroUint32.add(a, b)).toBe(1_500_000);
|
|
160
160
|
});
|
|
161
161
|
|
|
162
|
-
test('sub (never goes below 1)', () => {
|
|
163
|
-
expect(NonZeroUint32.sub(a, b)).toBe(500_000);
|
|
164
|
-
|
|
165
|
-
expect(NonZeroUint32.sub(b, a)).toBe(1); // clamped to 1
|
|
166
|
-
});
|
|
167
|
-
|
|
168
162
|
test('mul (with clamping to non-zero uint32 range)', () => {
|
|
169
163
|
const result = NonZeroUint32.mul(
|
|
170
164
|
asNonZeroUint32(100_000),
|
|
@@ -178,16 +172,6 @@ describe('NonZeroUint32 test', () => {
|
|
|
178
172
|
);
|
|
179
173
|
});
|
|
180
174
|
|
|
181
|
-
test('div (floor division, never goes below 1)', () => {
|
|
182
|
-
expect(NonZeroUint32.div(a, asNonZeroUint32(500_000))).toBe(2);
|
|
183
|
-
|
|
184
|
-
expect(NonZeroUint32.div(asNonZeroUint32(7), asNonZeroUint32(3))).toBe(2);
|
|
185
|
-
|
|
186
|
-
expect(
|
|
187
|
-
NonZeroUint32.div(asNonZeroUint32(500_000), asNonZeroUint32(1_000_000)),
|
|
188
|
-
).toBe(1); // floor(500000/1000000) = 0, clamped to 1
|
|
189
|
-
});
|
|
190
|
-
|
|
191
175
|
test('pow (with clamping to non-zero uint32 range)', () => {
|
|
192
176
|
const result = NonZeroUint32.pow(
|
|
193
177
|
asNonZeroUint32(10_000),
|
|
@@ -32,7 +32,7 @@ const {
|
|
|
32
32
|
>({
|
|
33
33
|
integerOrSafeInteger: 'SafeInteger',
|
|
34
34
|
MIN_VALUE: 1,
|
|
35
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
35
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
36
36
|
MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
|
|
37
37
|
typeNameInMessage,
|
|
38
38
|
} as const);
|
|
@@ -32,9 +32,9 @@ const {
|
|
|
32
32
|
SafeUint
|
|
33
33
|
>({
|
|
34
34
|
integerOrSafeInteger: 'SafeInteger',
|
|
35
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-min-safe-integer
|
|
35
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-min-safe-integer
|
|
36
36
|
MIN_VALUE: Number.MIN_SAFE_INTEGER as SafeInt,
|
|
37
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
37
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
38
38
|
MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
|
|
39
39
|
typeNameInMessage,
|
|
40
40
|
} as const);
|
|
@@ -29,7 +29,7 @@ const {
|
|
|
29
29
|
>({
|
|
30
30
|
integerOrSafeInteger: 'SafeInteger',
|
|
31
31
|
MIN_VALUE: 0,
|
|
32
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
32
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
|
|
33
33
|
MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
|
|
34
34
|
typeNameInMessage,
|
|
35
35
|
} as const);
|
package/src/number/index.mts
CHANGED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type FiniteNumber,
|
|
3
|
+
type Int,
|
|
4
|
+
type NegativeFiniteNumber,
|
|
5
|
+
type NegativeInt,
|
|
6
|
+
type NegativeNumber,
|
|
7
|
+
type NegativeSafeInt,
|
|
8
|
+
type NonNegativeFiniteNumber,
|
|
9
|
+
type NonNegativeNumber,
|
|
10
|
+
type NonPositiveFiniteNumber,
|
|
11
|
+
type NonPositiveInt,
|
|
12
|
+
type NonPositiveNumber,
|
|
13
|
+
type NonPositiveSafeInt,
|
|
14
|
+
type NonZeroFiniteNumber,
|
|
15
|
+
type NonZeroInt,
|
|
16
|
+
type NonZeroNumber,
|
|
17
|
+
type NonZeroSafeInt,
|
|
18
|
+
type PositiveFiniteNumber,
|
|
19
|
+
type PositiveInt,
|
|
20
|
+
type PositiveNumber,
|
|
21
|
+
type PositiveSafeInt,
|
|
22
|
+
type SafeInt,
|
|
23
|
+
type SafeUint,
|
|
24
|
+
type Uint,
|
|
25
|
+
} from 'ts-type-forge';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Internal type-level arithmetic for {@link Num}'s `add`/`sub`/`mul`/`div`.
|
|
29
|
+
*
|
|
30
|
+
* The result type of a binary operation is computed from two independent axes of
|
|
31
|
+
* each operand:
|
|
32
|
+
*
|
|
33
|
+
* - **Sign** — `pos | neg | nonneg | nonpos | nonzero | any`, derived from the
|
|
34
|
+
* brand's sign keys and combined with a small boolean algebra over the facts
|
|
35
|
+
* `>= 0`, `<= 0`, `!= 0`.
|
|
36
|
+
* - **Level** — `safeint | int | finite | number`, derived from the brand's
|
|
37
|
+
* level keys.
|
|
38
|
+
*
|
|
39
|
+
* The sign is always computed exactly (so e.g. `neg * neg` becomes `pos`). The
|
|
40
|
+
* level widens on possible overflow (`safeint` results of `+`/`-`/`*` become
|
|
41
|
+
* `int`, since the magnitude may exceed the safe-integer range). No runtime
|
|
42
|
+
* clamping is performed — saturating "stay in the type" behavior is provided by
|
|
43
|
+
* the branded namespaces instead.
|
|
44
|
+
*
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
/** Sign classification of a numeric brand. */
|
|
49
|
+
type Sign = 'any' | 'neg' | 'nonneg' | 'nonpos' | 'nonzero' | 'pos';
|
|
50
|
+
|
|
51
|
+
/** Level (integer/finite) classification of a numeric brand. */
|
|
52
|
+
type Level = 'finite' | 'int' | 'number' | 'safeint';
|
|
53
|
+
|
|
54
|
+
/** Classifies a numeric type's sign. */
|
|
55
|
+
export type SignOf<N> = [N] extends [PositiveNumber]
|
|
56
|
+
? 'pos'
|
|
57
|
+
: [N] extends [NegativeNumber]
|
|
58
|
+
? 'neg'
|
|
59
|
+
: [N] extends [NonNegativeNumber]
|
|
60
|
+
? 'nonneg'
|
|
61
|
+
: [N] extends [NonPositiveNumber]
|
|
62
|
+
? 'nonpos'
|
|
63
|
+
: [N] extends [NonZeroNumber]
|
|
64
|
+
? 'nonzero'
|
|
65
|
+
: 'any';
|
|
66
|
+
|
|
67
|
+
/** Classifies a numeric type's level. */
|
|
68
|
+
export type LevelOf<N> = [N] extends [SafeInt]
|
|
69
|
+
? 'safeint'
|
|
70
|
+
: [N] extends [Int]
|
|
71
|
+
? 'int'
|
|
72
|
+
: [N] extends [FiniteNumber]
|
|
73
|
+
? 'finite'
|
|
74
|
+
: 'number';
|
|
75
|
+
|
|
76
|
+
// --- boolean fact algebra over a sign ----------------------------------------
|
|
77
|
+
|
|
78
|
+
type And<A extends boolean, B extends boolean> = [A, B] extends [true, true]
|
|
79
|
+
? true
|
|
80
|
+
: false;
|
|
81
|
+
|
|
82
|
+
type Or<A extends boolean, B extends boolean> = true extends A | B
|
|
83
|
+
? true
|
|
84
|
+
: false;
|
|
85
|
+
|
|
86
|
+
/** Whether the value is guaranteed `>= 0`. */
|
|
87
|
+
type Ge0<S extends Sign> = S extends 'pos' | 'nonneg' ? true : false;
|
|
88
|
+
|
|
89
|
+
/** Whether the value is guaranteed `<= 0`. */
|
|
90
|
+
type Le0<S extends Sign> = S extends 'neg' | 'nonpos' ? true : false;
|
|
91
|
+
|
|
92
|
+
/** Whether the value is guaranteed `!= 0`. */
|
|
93
|
+
type Ne0<S extends Sign> = S extends 'pos' | 'neg' | 'nonzero' ? true : false;
|
|
94
|
+
|
|
95
|
+
/** Rebuilds a {@link Sign} from the three facts. */
|
|
96
|
+
type FromFacts<
|
|
97
|
+
ge0 extends boolean,
|
|
98
|
+
le0 extends boolean,
|
|
99
|
+
ne0 extends boolean,
|
|
100
|
+
> = ge0 extends true
|
|
101
|
+
? ne0 extends true
|
|
102
|
+
? 'pos'
|
|
103
|
+
: 'nonneg'
|
|
104
|
+
: le0 extends true
|
|
105
|
+
? ne0 extends true
|
|
106
|
+
? 'neg'
|
|
107
|
+
: 'nonpos'
|
|
108
|
+
: ne0 extends true
|
|
109
|
+
? 'nonzero'
|
|
110
|
+
: 'any';
|
|
111
|
+
|
|
112
|
+
type NegateSign<S extends Sign> = FromFacts<Le0<S>, Ge0<S>, Ne0<S>>;
|
|
113
|
+
|
|
114
|
+
// --- sign combination per operation ------------------------------------------
|
|
115
|
+
|
|
116
|
+
type AddSign<A extends Sign, B extends Sign> = FromFacts<
|
|
117
|
+
And<Ge0<A>, Ge0<B>>,
|
|
118
|
+
And<Le0<A>, Le0<B>>,
|
|
119
|
+
Or<
|
|
120
|
+
And<And<Ge0<A>, Ge0<B>>, Or<Ne0<A>, Ne0<B>>>,
|
|
121
|
+
And<And<Le0<A>, Le0<B>>, Or<Ne0<A>, Ne0<B>>>
|
|
122
|
+
>
|
|
123
|
+
>;
|
|
124
|
+
|
|
125
|
+
type SubSign<A extends Sign, B extends Sign> = AddSign<A, NegateSign<B>>;
|
|
126
|
+
|
|
127
|
+
/** Sign of a product/quotient, parameterized by the `!= 0` fact of the result. */
|
|
128
|
+
type MulSignWithNe0<
|
|
129
|
+
A extends Sign,
|
|
130
|
+
B extends Sign,
|
|
131
|
+
ne0 extends boolean,
|
|
132
|
+
> = FromFacts<
|
|
133
|
+
Or<And<Ge0<A>, Ge0<B>>, And<Le0<A>, Le0<B>>>,
|
|
134
|
+
Or<And<Ge0<A>, Le0<B>>, And<Le0<A>, Ge0<B>>>,
|
|
135
|
+
ne0
|
|
136
|
+
>;
|
|
137
|
+
|
|
138
|
+
type MulSign<A extends Sign, B extends Sign> = MulSignWithNe0<
|
|
139
|
+
A,
|
|
140
|
+
B,
|
|
141
|
+
And<Ne0<A>, Ne0<B>>
|
|
142
|
+
>;
|
|
143
|
+
|
|
144
|
+
/** Exact division: nonzero dividend over nonzero divisor stays nonzero. */
|
|
145
|
+
type DivSign<A extends Sign, B extends Sign> = MulSignWithNe0<A, B, Ne0<A>>;
|
|
146
|
+
|
|
147
|
+
/** Floor division: flooring can land on `0`, so the result is never `!= 0`. */
|
|
148
|
+
type DivIntSign<A extends Sign, B extends Sign> = MulSignWithNe0<A, B, false>;
|
|
149
|
+
|
|
150
|
+
// --- level combination per operation -----------------------------------------
|
|
151
|
+
|
|
152
|
+
/** Looser of two levels (number > finite > int > safeint). */
|
|
153
|
+
type LooserLevel<LA extends Level, LB extends Level> = 'number' extends LA | LB
|
|
154
|
+
? 'number'
|
|
155
|
+
: 'finite' extends LA | LB
|
|
156
|
+
? 'finite'
|
|
157
|
+
: 'int' extends LA | LB
|
|
158
|
+
? 'int'
|
|
159
|
+
: 'safeint';
|
|
160
|
+
|
|
161
|
+
/** `+`/`-`/`*`: looser level, widening `safeint -> int` (overflow may occur). */
|
|
162
|
+
type AddMulLevel<LA extends Level, LB extends Level> =
|
|
163
|
+
LooserLevel<LA, LB> extends 'safeint' ? 'int' : LooserLevel<LA, LB>;
|
|
164
|
+
|
|
165
|
+
/** Exact division yields a (possibly fractional) finite number. */
|
|
166
|
+
type DivLevel<LA extends Level, LB extends Level> = 'number' extends LA | LB
|
|
167
|
+
? 'number'
|
|
168
|
+
: 'finite';
|
|
169
|
+
|
|
170
|
+
/** Floor division yields an integer; the safe range is preserved. */
|
|
171
|
+
type DivIntLevel<LA extends Level, LB extends Level> = 'number' extends LA | LB
|
|
172
|
+
? 'number'
|
|
173
|
+
: [LA, LB] extends ['safeint', 'safeint']
|
|
174
|
+
? 'safeint'
|
|
175
|
+
: 'int';
|
|
176
|
+
|
|
177
|
+
// --- reconstruction (sign, level) -> canonical brand -------------------------
|
|
178
|
+
|
|
179
|
+
type ReconstructNumber<S extends Sign> = S extends 'pos'
|
|
180
|
+
? PositiveNumber
|
|
181
|
+
: S extends 'neg'
|
|
182
|
+
? NegativeNumber
|
|
183
|
+
: S extends 'nonneg'
|
|
184
|
+
? NonNegativeNumber
|
|
185
|
+
: S extends 'nonpos'
|
|
186
|
+
? NonPositiveNumber
|
|
187
|
+
: S extends 'nonzero'
|
|
188
|
+
? NonZeroNumber
|
|
189
|
+
: number;
|
|
190
|
+
|
|
191
|
+
type ReconstructFinite<S extends Sign> = S extends 'pos'
|
|
192
|
+
? PositiveFiniteNumber
|
|
193
|
+
: S extends 'neg'
|
|
194
|
+
? NegativeFiniteNumber
|
|
195
|
+
: S extends 'nonneg'
|
|
196
|
+
? NonNegativeFiniteNumber
|
|
197
|
+
: S extends 'nonpos'
|
|
198
|
+
? NonPositiveFiniteNumber
|
|
199
|
+
: S extends 'nonzero'
|
|
200
|
+
? NonZeroFiniteNumber
|
|
201
|
+
: FiniteNumber;
|
|
202
|
+
|
|
203
|
+
type ReconstructInt<S extends Sign> = S extends 'pos'
|
|
204
|
+
? PositiveInt
|
|
205
|
+
: S extends 'neg'
|
|
206
|
+
? NegativeInt
|
|
207
|
+
: S extends 'nonneg'
|
|
208
|
+
? Uint
|
|
209
|
+
: S extends 'nonpos'
|
|
210
|
+
? NonPositiveInt
|
|
211
|
+
: S extends 'nonzero'
|
|
212
|
+
? NonZeroInt
|
|
213
|
+
: Int;
|
|
214
|
+
|
|
215
|
+
type ReconstructSafeInt<S extends Sign> = S extends 'pos'
|
|
216
|
+
? PositiveSafeInt
|
|
217
|
+
: S extends 'neg'
|
|
218
|
+
? NegativeSafeInt
|
|
219
|
+
: S extends 'nonneg'
|
|
220
|
+
? SafeUint
|
|
221
|
+
: S extends 'nonpos'
|
|
222
|
+
? NonPositiveSafeInt
|
|
223
|
+
: S extends 'nonzero'
|
|
224
|
+
? NonZeroSafeInt
|
|
225
|
+
: SafeInt;
|
|
226
|
+
|
|
227
|
+
type Reconstruct<S extends Sign, L extends Level> = L extends 'safeint'
|
|
228
|
+
? ReconstructSafeInt<S>
|
|
229
|
+
: L extends 'int'
|
|
230
|
+
? ReconstructInt<S>
|
|
231
|
+
: L extends 'finite'
|
|
232
|
+
? ReconstructFinite<S>
|
|
233
|
+
: ReconstructNumber<S>;
|
|
234
|
+
|
|
235
|
+
// --- public result types -----------------------------------------------------
|
|
236
|
+
|
|
237
|
+
/** Result type of {@link Num.add} applied to operands of type `A` and `B`. */
|
|
238
|
+
export type AddResult<A, B> = Reconstruct<
|
|
239
|
+
AddSign<SignOf<A>, SignOf<B>>,
|
|
240
|
+
AddMulLevel<LevelOf<A>, LevelOf<B>>
|
|
241
|
+
>;
|
|
242
|
+
|
|
243
|
+
/** Result type of {@link Num.sub} applied to operands of type `A` and `B`. */
|
|
244
|
+
export type SubResult<A, B> = Reconstruct<
|
|
245
|
+
SubSign<SignOf<A>, SignOf<B>>,
|
|
246
|
+
AddMulLevel<LevelOf<A>, LevelOf<B>>
|
|
247
|
+
>;
|
|
248
|
+
|
|
249
|
+
/** Result type of {@link Num.mul} applied to operands of type `A` and `B`. */
|
|
250
|
+
export type MulResult<A, B> = Reconstruct<
|
|
251
|
+
MulSign<SignOf<A>, SignOf<B>>,
|
|
252
|
+
AddMulLevel<LevelOf<A>, LevelOf<B>>
|
|
253
|
+
>;
|
|
254
|
+
|
|
255
|
+
/** Result type of {@link Num.div} (exact) applied to operands of type `A` and `B`. */
|
|
256
|
+
export type DivResult<A, B> = Reconstruct<
|
|
257
|
+
DivSign<SignOf<A>, SignOf<B>>,
|
|
258
|
+
DivLevel<LevelOf<A>, LevelOf<B>>
|
|
259
|
+
>;
|
|
260
|
+
|
|
261
|
+
/** Result type of {@link Num.divInt} (floor) applied to operands of type `A` and `B`. */
|
|
262
|
+
export type DivIntResult<A, B> = Reconstruct<
|
|
263
|
+
DivIntSign<SignOf<A>, SignOf<B>>,
|
|
264
|
+
DivIntLevel<LevelOf<A>, LevelOf<B>>
|
|
265
|
+
>;
|