ts-data-forge 11.0.0 → 12.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/number/branded-types/finite-number.d.mts +47 -61
- package/dist/number/branded-types/finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/finite-number.mjs +37 -41
- package/dist/number/branded-types/finite-number.mjs.map +1 -1
- package/dist/number/branded-types/int.d.mts +40 -46
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int.mjs +29 -31
- package/dist/number/branded-types/int.mjs.map +1 -1
- package/dist/number/branded-types/int16.d.mts +71 -59
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int16.mjs +56 -47
- package/dist/number/branded-types/int16.mjs.map +1 -1
- package/dist/number/branded-types/int32.d.mts +71 -59
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/int32.mjs +56 -47
- package/dist/number/branded-types/int32.mjs.map +1 -1
- package/dist/number/branded-types/negative-finite-number.d.mts +76 -60
- package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/negative-finite-number.mjs +62 -49
- package/dist/number/branded-types/negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/negative-int.d.mts +66 -49
- package/dist/number/branded-types/negative-int.d.mts.map +1 -1
- package/dist/number/branded-types/negative-int.mjs +48 -39
- package/dist/number/branded-types/negative-int.mjs.map +1 -1
- package/dist/number/branded-types/negative-safe-int.d.mts +64 -57
- package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/negative-safe-int.mjs +49 -44
- package/dist/number/branded-types/negative-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.d.mts +80 -65
- package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.mjs +65 -53
- package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +71 -58
- package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int16.mjs +55 -45
- package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +71 -59
- package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int32.mjs +55 -46
- package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-finite-number.d.mts +70 -55
- package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-finite-number.mjs +55 -43
- package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-int.d.mts +46 -146
- package/dist/number/branded-types/non-positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-int.mjs +33 -108
- package/dist/number/branded-types/non-positive-int.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-safe-int.d.mts +62 -54
- package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-positive-safe-int.mjs +46 -41
- package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.d.mts +62 -49
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +46 -37
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +51 -38
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +31 -27
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +59 -54
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +44 -41
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +59 -55
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +44 -42
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +60 -55
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +44 -42
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +59 -54
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +43 -41
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +59 -54
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +43 -41
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +82 -64
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-finite-number.mjs +67 -52
- package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +53 -70
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.mjs +42 -52
- package/dist/number/branded-types/positive-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +68 -58
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.mjs +52 -45
- package/dist/number/branded-types/positive-int16.mjs.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +68 -58
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.mjs +52 -45
- package/dist/number/branded-types/positive-int32.mjs.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +72 -61
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.mjs +56 -48
- package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +68 -58
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.mjs +52 -45
- package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +68 -59
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.mjs +52 -46
- package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +52 -66
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.mjs +45 -47
- package/dist/number/branded-types/safe-int.mjs.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +68 -58
- package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
- package/dist/number/branded-types/safe-uint.mjs +53 -46
- package/dist/number/branded-types/safe-uint.mjs.map +1 -1
- package/dist/number/branded-types/uint.d.mts +72 -55
- package/dist/number/branded-types/uint.d.mts.map +1 -1
- package/dist/number/branded-types/uint.mjs +52 -45
- package/dist/number/branded-types/uint.mjs.map +1 -1
- package/dist/number/branded-types/uint16.d.mts +66 -59
- package/dist/number/branded-types/uint16.d.mts.map +1 -1
- package/dist/number/branded-types/uint16.mjs +51 -45
- package/dist/number/branded-types/uint16.mjs.map +1 -1
- package/dist/number/branded-types/uint32.d.mts +66 -57
- package/dist/number/branded-types/uint32.d.mts.map +1 -1
- package/dist/number/branded-types/uint32.mjs +50 -45
- package/dist/number/branded-types/uint32.mjs.map +1 -1
- package/dist/number/enum/int8.d.mts +62 -66
- package/dist/number/enum/int8.d.mts.map +1 -1
- package/dist/number/enum/int8.mjs +57 -51
- package/dist/number/enum/int8.mjs.map +1 -1
- package/dist/number/enum/uint8.d.mts +66 -59
- package/dist/number/enum/uint8.d.mts.map +1 -1
- package/dist/number/enum/uint8.mjs +57 -51
- package/dist/number/enum/uint8.mjs.map +1 -1
- package/dist/number/refined-number-utils.d.mts +9 -9
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs +7 -7
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/package.json +2 -1
- package/src/number/branded-types/finite-number.mts +47 -61
- package/src/number/branded-types/int.mts +40 -46
- package/src/number/branded-types/int16.mts +72 -60
- package/src/number/branded-types/int32.mts +72 -60
- package/src/number/branded-types/negative-finite-number.mts +78 -71
- package/src/number/branded-types/negative-finite-number.test.mts +4 -4
- package/src/number/branded-types/negative-int.mts +68 -60
- package/src/number/branded-types/negative-int.test.mts +5 -5
- package/src/number/branded-types/negative-safe-int.mts +66 -68
- package/src/number/branded-types/negative-safe-int.test.mts +4 -4
- package/src/number/branded-types/non-negative-finite-number.mts +81 -66
- package/src/number/branded-types/non-negative-int16.mts +72 -59
- package/src/number/branded-types/non-negative-int32.mts +72 -60
- package/src/number/branded-types/non-positive-finite-number.mts +71 -56
- package/src/number/branded-types/non-positive-finite-number.test.mts +7 -7
- package/src/number/branded-types/non-positive-int.mts +47 -147
- package/src/number/branded-types/non-positive-int.test.mts +7 -7
- package/src/number/branded-types/non-positive-safe-int.mts +63 -55
- package/src/number/branded-types/non-positive-safe-int.test.mts +7 -7
- package/src/number/branded-types/non-zero-finite-number.mts +62 -51
- package/src/number/branded-types/non-zero-int.mts +51 -38
- package/src/number/branded-types/non-zero-int16.mts +60 -55
- package/src/number/branded-types/non-zero-int32.mts +60 -56
- package/src/number/branded-types/non-zero-safe-int.mts +61 -56
- package/src/number/branded-types/non-zero-uint16.mts +60 -55
- package/src/number/branded-types/non-zero-uint32.mts +60 -55
- package/src/number/branded-types/positive-finite-number.mts +83 -65
- package/src/number/branded-types/positive-int.mts +54 -71
- package/src/number/branded-types/positive-int16.mts +69 -59
- package/src/number/branded-types/positive-int32.mts +69 -59
- package/src/number/branded-types/positive-safe-int.mts +73 -62
- package/src/number/branded-types/positive-uint16.mts +69 -59
- package/src/number/branded-types/positive-uint32.mts +69 -60
- package/src/number/branded-types/safe-int.mts +53 -67
- package/src/number/branded-types/safe-uint.mts +69 -59
- package/src/number/branded-types/uint.mts +73 -56
- package/src/number/branded-types/uint16.mts +67 -60
- package/src/number/branded-types/uint32.mts +67 -58
- package/src/number/enum/int8.mts +70 -73
- package/src/number/enum/int8.test.mts +7 -4
- package/src/number/enum/uint8.mts +74 -66
- package/src/number/enum/uint8.test.mts +7 -4
- package/src/number/refined-number-utils.mts +22 -19
|
@@ -17,8 +17,8 @@ const {
|
|
|
17
17
|
abs,
|
|
18
18
|
add,
|
|
19
19
|
castType,
|
|
20
|
-
clamp,
|
|
21
20
|
div,
|
|
21
|
+
fromNumber,
|
|
22
22
|
is,
|
|
23
23
|
max: max_,
|
|
24
24
|
min: min_,
|
|
@@ -42,8 +42,7 @@ const {
|
|
|
42
42
|
/**
|
|
43
43
|
* Type guard that checks if a value is a safe integer.
|
|
44
44
|
*
|
|
45
|
-
*
|
|
46
|
-
* without precision loss. The range is [±(2^53 - 1)].
|
|
45
|
+
* Returns `true` for a safe integer — a value with no fractional component.
|
|
47
46
|
*
|
|
48
47
|
* @example
|
|
49
48
|
*
|
|
@@ -61,11 +60,10 @@ const {
|
|
|
61
60
|
export const isSafeInt = is;
|
|
62
61
|
|
|
63
62
|
/**
|
|
64
|
-
* Casts a number to
|
|
63
|
+
* Casts a `number` to the `SafeInt` branded type.
|
|
65
64
|
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* operations that require precise integer arithmetic.
|
|
65
|
+
* Validates that the value is a safe integer and returns it with the `SafeInt`
|
|
66
|
+
* brand. Throws a `TypeError` otherwise.
|
|
69
67
|
*
|
|
70
68
|
* @example
|
|
71
69
|
*
|
|
@@ -78,26 +76,16 @@ export const isSafeInt = is;
|
|
|
78
76
|
* ```
|
|
79
77
|
*
|
|
80
78
|
* @param value - The value to cast
|
|
81
|
-
* @returns The value as a SafeInt
|
|
79
|
+
* @returns The value as a `SafeInt`
|
|
82
80
|
* @throws {TypeError} If the value is not a safe integer
|
|
83
81
|
*/
|
|
84
82
|
export const asSafeInt = castType;
|
|
85
83
|
|
|
86
84
|
/**
|
|
87
|
-
* Namespace providing type-safe operations for SafeInt branded
|
|
85
|
+
* Namespace providing type-safe operations for the `SafeInt` branded type.
|
|
88
86
|
*
|
|
89
|
-
* SafeInt represents
|
|
90
|
-
*
|
|
91
|
-
* approximately ±9 quadrillion.
|
|
92
|
-
*
|
|
93
|
-
* All operations automatically clamp results to stay within the safe range,
|
|
94
|
-
* preventing precision loss that occurs with larger integers. This makes
|
|
95
|
-
* SafeInt ideal for:
|
|
96
|
-
*
|
|
97
|
-
* - Financial calculations requiring exact cents
|
|
98
|
-
* - Database IDs and counters
|
|
99
|
-
* - Array indices and sizes
|
|
100
|
-
* - Any integer arithmetic requiring precision guarantees
|
|
87
|
+
* The `SafeInt` type represents a safe integer. Division (`div`) uses floor
|
|
88
|
+
* division.
|
|
101
89
|
*/
|
|
102
90
|
export const SafeInt = {
|
|
103
91
|
/**
|
|
@@ -120,24 +108,21 @@ export const SafeInt = {
|
|
|
120
108
|
is,
|
|
121
109
|
|
|
122
110
|
/**
|
|
123
|
-
* The
|
|
124
|
-
*
|
|
125
|
-
* @readonly
|
|
111
|
+
* The smallest value representable as `SafeInt` (the lower saturation target
|
|
112
|
+
* of `fromNumber`).
|
|
126
113
|
*/
|
|
127
114
|
MIN_VALUE,
|
|
128
115
|
|
|
129
116
|
/**
|
|
130
|
-
* The
|
|
131
|
-
*
|
|
132
|
-
* @readonly
|
|
117
|
+
* The largest value representable as `SafeInt` (the upper saturation target
|
|
118
|
+
* of `fromNumber`).
|
|
133
119
|
*/
|
|
134
120
|
MAX_VALUE,
|
|
135
121
|
|
|
136
122
|
/**
|
|
137
123
|
* Returns the absolute value of a safe integer.
|
|
138
124
|
*
|
|
139
|
-
*
|
|
140
|
-
* function clamps the result to maintain the safe integer guarantee.
|
|
125
|
+
* The result is non-negative and keeps the `SafeInt` brand.
|
|
141
126
|
*
|
|
142
127
|
* @example
|
|
143
128
|
*
|
|
@@ -152,12 +137,12 @@ export const SafeInt = {
|
|
|
152
137
|
* ```
|
|
153
138
|
*
|
|
154
139
|
* @param a - The safe integer value
|
|
155
|
-
* @returns The absolute value as a SafeInt
|
|
140
|
+
* @returns The absolute value as a non-negative `SafeInt`
|
|
156
141
|
*/
|
|
157
142
|
abs,
|
|
158
143
|
|
|
159
144
|
/**
|
|
160
|
-
* Returns the
|
|
145
|
+
* Returns the smallest of the given safe integers.
|
|
161
146
|
*
|
|
162
147
|
* @example
|
|
163
148
|
*
|
|
@@ -168,12 +153,12 @@ export const SafeInt = {
|
|
|
168
153
|
* ```
|
|
169
154
|
*
|
|
170
155
|
* @param values - The safe integers to compare (at least one required)
|
|
171
|
-
* @returns The smallest value as a SafeInt
|
|
156
|
+
* @returns The smallest value as a `SafeInt`
|
|
172
157
|
*/
|
|
173
158
|
min: min_,
|
|
174
159
|
|
|
175
160
|
/**
|
|
176
|
-
* Returns the
|
|
161
|
+
* Returns the largest of the given safe integers.
|
|
177
162
|
*
|
|
178
163
|
* @example
|
|
179
164
|
*
|
|
@@ -184,21 +169,25 @@ export const SafeInt = {
|
|
|
184
169
|
* ```
|
|
185
170
|
*
|
|
186
171
|
* @param values - The safe integers to compare (at least one required)
|
|
187
|
-
* @returns The largest value as a SafeInt
|
|
172
|
+
* @returns The largest value as a `SafeInt`
|
|
188
173
|
*/
|
|
189
174
|
max: max_,
|
|
190
175
|
|
|
191
176
|
/**
|
|
192
|
-
*
|
|
177
|
+
* Converts an arbitrary `number` into a `SafeInt`, rounding to the nearest
|
|
178
|
+
* integer and saturating the result into the range `[MIN_VALUE, MAX_VALUE]`.
|
|
179
|
+
*
|
|
180
|
+
* Unlike `asSafeInt`, this is total: out-of-range inputs are clamped to the
|
|
181
|
+
* nearest representable `SafeInt` instead of throwing.
|
|
193
182
|
*
|
|
194
183
|
* @example
|
|
195
184
|
*
|
|
196
185
|
* ```ts
|
|
197
|
-
* const aboveRange = SafeInt.
|
|
186
|
+
* const aboveRange = SafeInt.fromNumber(1e20);
|
|
198
187
|
*
|
|
199
|
-
* const withinRange = SafeInt.
|
|
188
|
+
* const withinRange = SafeInt.fromNumber(123);
|
|
200
189
|
*
|
|
201
|
-
* const belowRange = SafeInt.
|
|
190
|
+
* const belowRange = SafeInt.fromNumber(-1e20);
|
|
202
191
|
*
|
|
203
192
|
* assert.isTrue(aboveRange === Number.MAX_SAFE_INTEGER);
|
|
204
193
|
*
|
|
@@ -207,17 +196,15 @@ export const SafeInt = {
|
|
|
207
196
|
* assert.isTrue(belowRange === Number.MIN_SAFE_INTEGER);
|
|
208
197
|
* ```
|
|
209
198
|
*
|
|
210
|
-
* @param value The
|
|
211
|
-
* @returns The value
|
|
212
|
-
* SafeInt.
|
|
199
|
+
* @param value - The value to convert
|
|
200
|
+
* @returns The value as a `SafeInt`
|
|
213
201
|
*/
|
|
214
|
-
|
|
202
|
+
fromNumber,
|
|
215
203
|
|
|
216
204
|
/**
|
|
217
|
-
* Generates a random
|
|
205
|
+
* Generates a random `SafeInt` within the given range.
|
|
218
206
|
*
|
|
219
|
-
* The range is inclusive on both ends.
|
|
220
|
-
* swapped.
|
|
207
|
+
* The range is inclusive on both ends.
|
|
221
208
|
*
|
|
222
209
|
* @example
|
|
223
210
|
*
|
|
@@ -235,12 +222,13 @@ export const SafeInt = {
|
|
|
235
222
|
*
|
|
236
223
|
* @param min - The minimum value (inclusive)
|
|
237
224
|
* @param max - The maximum value (inclusive)
|
|
238
|
-
* @returns A random SafeInt in
|
|
225
|
+
* @returns A random `SafeInt` in `[min, max]`
|
|
239
226
|
*/
|
|
240
227
|
random,
|
|
241
228
|
|
|
242
229
|
/**
|
|
243
|
-
* Raises a
|
|
230
|
+
* Raises `a` to the power `b`, returning `a ** b` as a `SafeInt` (floored to
|
|
231
|
+
* an integer).
|
|
244
232
|
*
|
|
245
233
|
* @example
|
|
246
234
|
*
|
|
@@ -256,14 +244,14 @@ export const SafeInt = {
|
|
|
256
244
|
* assert.isTrue(SafeInt.is(power));
|
|
257
245
|
* ```
|
|
258
246
|
*
|
|
259
|
-
* @param a The base
|
|
260
|
-
* @param b The exponent
|
|
261
|
-
* @returns `a ** b`
|
|
247
|
+
* @param a - The base safe integer
|
|
248
|
+
* @param b - The exponent safe integer
|
|
249
|
+
* @returns `a ** b` as a `SafeInt`
|
|
262
250
|
*/
|
|
263
251
|
pow,
|
|
264
252
|
|
|
265
253
|
/**
|
|
266
|
-
* Adds two SafeInt
|
|
254
|
+
* Adds two safe integers, returning `a + b` as a `SafeInt`.
|
|
267
255
|
*
|
|
268
256
|
* @example
|
|
269
257
|
*
|
|
@@ -275,14 +263,14 @@ export const SafeInt = {
|
|
|
275
263
|
* assert.isTrue(SafeInt.is(sum));
|
|
276
264
|
* ```
|
|
277
265
|
*
|
|
278
|
-
* @param a The first
|
|
279
|
-
* @param b The second
|
|
280
|
-
* @returns `a
|
|
266
|
+
* @param a - The first safe integer
|
|
267
|
+
* @param b - The second safe integer
|
|
268
|
+
* @returns The sum of `a` and `b` as a `SafeInt`
|
|
281
269
|
*/
|
|
282
270
|
add,
|
|
283
271
|
|
|
284
272
|
/**
|
|
285
|
-
* Subtracts
|
|
273
|
+
* Subtracts two safe integers, returning `a - b` as a `SafeInt`.
|
|
286
274
|
*
|
|
287
275
|
* @example
|
|
288
276
|
*
|
|
@@ -294,14 +282,14 @@ export const SafeInt = {
|
|
|
294
282
|
* assert.isTrue(SafeInt.is(difference));
|
|
295
283
|
* ```
|
|
296
284
|
*
|
|
297
|
-
* @param a The
|
|
298
|
-
* @param b The
|
|
299
|
-
* @returns `a
|
|
285
|
+
* @param a - The first safe integer
|
|
286
|
+
* @param b - The second safe integer
|
|
287
|
+
* @returns The difference of `a` and `b` as a `SafeInt`
|
|
300
288
|
*/
|
|
301
289
|
sub,
|
|
302
290
|
|
|
303
291
|
/**
|
|
304
|
-
* Multiplies two SafeInt
|
|
292
|
+
* Multiplies two safe integers, returning `a * b` as a `SafeInt`.
|
|
305
293
|
*
|
|
306
294
|
* @example
|
|
307
295
|
*
|
|
@@ -313,17 +301,15 @@ export const SafeInt = {
|
|
|
313
301
|
* assert.isTrue(SafeInt.is(product));
|
|
314
302
|
* ```
|
|
315
303
|
*
|
|
316
|
-
* @param a The first
|
|
317
|
-
* @param b The second
|
|
318
|
-
* @returns `a
|
|
304
|
+
* @param a - The first safe integer
|
|
305
|
+
* @param b - The second safe integer
|
|
306
|
+
* @returns The product of `a` and `b` as a `SafeInt`
|
|
319
307
|
*/
|
|
320
308
|
mul,
|
|
321
309
|
|
|
322
310
|
/**
|
|
323
|
-
* Divides
|
|
324
|
-
*
|
|
325
|
-
* Performs mathematical floor division: `⌊a / b⌋`. The divisor must be
|
|
326
|
-
* non-zero (enforced by type constraints).
|
|
311
|
+
* Divides two safe integers using floor division (`⌊a / b⌋`): the result is
|
|
312
|
+
* `a / b` rounded toward negative infinity, as a `SafeInt`.
|
|
327
313
|
*
|
|
328
314
|
* @example
|
|
329
315
|
*
|
|
@@ -337,7 +323,7 @@ export const SafeInt = {
|
|
|
337
323
|
*
|
|
338
324
|
* @param a - The dividend
|
|
339
325
|
* @param b - The divisor (must be non-zero)
|
|
340
|
-
* @returns The
|
|
326
|
+
* @returns The floored quotient as a `SafeInt`
|
|
341
327
|
*/
|
|
342
328
|
div,
|
|
343
329
|
} as const;
|
|
@@ -13,8 +13,8 @@ const {
|
|
|
13
13
|
MIN_VALUE,
|
|
14
14
|
add,
|
|
15
15
|
castType,
|
|
16
|
-
clamp,
|
|
17
16
|
div,
|
|
17
|
+
fromNumber,
|
|
18
18
|
is,
|
|
19
19
|
max: max_,
|
|
20
20
|
min: min_,
|
|
@@ -35,131 +35,141 @@ const {
|
|
|
35
35
|
} as const);
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Type guard that checks if a value is a non-negative safe integer.
|
|
39
39
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
40
|
+
* Returns `true` for a non-negative safe integer — a value with no fractional
|
|
41
|
+
* component.
|
|
42
|
+
*
|
|
43
|
+
* @param value - The value to check
|
|
44
|
+
* @returns `true` if the value is a non-negative safe integer, `false` otherwise
|
|
42
45
|
*/
|
|
43
46
|
export const isSafeUint = is;
|
|
44
47
|
|
|
45
48
|
/**
|
|
46
|
-
* Casts a number to
|
|
49
|
+
* Casts a `number` to the `SafeUint` branded type.
|
|
50
|
+
*
|
|
51
|
+
* Validates that the value is a non-negative safe integer and returns it with
|
|
52
|
+
* the `SafeUint` brand. Throws a `TypeError` otherwise.
|
|
47
53
|
*
|
|
48
|
-
* @param value The value to cast
|
|
49
|
-
* @returns The value as a SafeUint
|
|
50
|
-
* @throws {TypeError} If the value is not a non-negative safe integer
|
|
54
|
+
* @param value - The value to cast
|
|
55
|
+
* @returns The value as a `SafeUint`
|
|
56
|
+
* @throws {TypeError} If the value is not a non-negative safe integer
|
|
51
57
|
*/
|
|
52
58
|
export const asSafeUint = castType;
|
|
53
59
|
|
|
54
60
|
/**
|
|
55
|
-
* Namespace providing type-safe
|
|
56
|
-
* integers.
|
|
61
|
+
* Namespace providing type-safe operations for the `SafeUint` branded type.
|
|
57
62
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* non-negative constraint and IEEE 754 precision guarantees, preventing
|
|
61
|
-
* precision loss while ensuring results are never negative.
|
|
63
|
+
* The `SafeUint` type represents a non-negative safe integer. Division (`div`)
|
|
64
|
+
* uses floor division.
|
|
62
65
|
*/
|
|
63
66
|
export const SafeUint = {
|
|
64
67
|
/**
|
|
65
|
-
* Type guard
|
|
68
|
+
* Type guard that checks if a value is a non-negative safe integer.
|
|
66
69
|
*
|
|
67
|
-
* @param value The value to check
|
|
68
|
-
* @returns `true` if the value is a non-negative safe integer, `false`
|
|
69
|
-
*
|
|
70
|
+
* @param value - The value to check
|
|
71
|
+
* @returns `true` if the value is a non-negative safe integer, `false` otherwise
|
|
72
|
+
* @see {@link isSafeUint} for usage examples
|
|
70
73
|
*/
|
|
71
74
|
is,
|
|
72
75
|
|
|
73
76
|
/**
|
|
74
|
-
* The
|
|
75
|
-
*
|
|
76
|
-
* @readonly
|
|
77
|
+
* The smallest value representable as `SafeUint` (the lower saturation target
|
|
78
|
+
* of `fromNumber`).
|
|
77
79
|
*/
|
|
78
80
|
MIN_VALUE,
|
|
79
81
|
|
|
80
82
|
/**
|
|
81
|
-
* The
|
|
82
|
-
*
|
|
83
|
-
* @readonly
|
|
83
|
+
* The largest value representable as `SafeUint` (the upper saturation target
|
|
84
|
+
* of `fromNumber`).
|
|
84
85
|
*/
|
|
85
86
|
MAX_VALUE,
|
|
86
87
|
|
|
87
88
|
/**
|
|
88
|
-
* Returns the
|
|
89
|
+
* Returns the smallest of the given non-negative safe integers.
|
|
89
90
|
*
|
|
90
|
-
* @param
|
|
91
|
-
* @
|
|
92
|
-
* @returns The minimum value as a SafeUint.
|
|
91
|
+
* @param values - The non-negative safe integers to compare (at least one required)
|
|
92
|
+
* @returns The smallest value as a `SafeUint`
|
|
93
93
|
*/
|
|
94
94
|
min: min_,
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
|
-
* Returns the
|
|
97
|
+
* Returns the largest of the given non-negative safe integers.
|
|
98
98
|
*
|
|
99
|
-
* @param
|
|
100
|
-
* @
|
|
101
|
-
* @returns The maximum value as a SafeUint.
|
|
99
|
+
* @param values - The non-negative safe integers to compare (at least one required)
|
|
100
|
+
* @returns The largest value as a `SafeUint`
|
|
102
101
|
*/
|
|
103
102
|
max: max_,
|
|
104
103
|
|
|
105
104
|
/**
|
|
106
|
-
*
|
|
105
|
+
* Converts an arbitrary `number` into a `SafeUint`, rounding to the nearest
|
|
106
|
+
* integer and saturating the result into the range `[MIN_VALUE, MAX_VALUE]`.
|
|
107
|
+
*
|
|
108
|
+
* Unlike `asSafeUint`, this is total: out-of-range inputs are clamped to the
|
|
109
|
+
* nearest representable `SafeUint` instead of throwing.
|
|
107
110
|
*
|
|
108
|
-
* @param value The
|
|
109
|
-
* @returns The value
|
|
111
|
+
* @param value - The value to convert
|
|
112
|
+
* @returns The value as a `SafeUint`
|
|
110
113
|
*/
|
|
111
|
-
|
|
114
|
+
fromNumber,
|
|
112
115
|
|
|
113
116
|
/**
|
|
114
|
-
* Generates a random SafeUint
|
|
117
|
+
* Generates a random `SafeUint` within the given range.
|
|
118
|
+
*
|
|
119
|
+
* The range is inclusive on both ends.
|
|
115
120
|
*
|
|
116
|
-
* @
|
|
121
|
+
* @param min - The minimum value (inclusive)
|
|
122
|
+
* @param max - The maximum value (inclusive)
|
|
123
|
+
* @returns A random `SafeUint` in `[min, max]`
|
|
117
124
|
*/
|
|
118
125
|
random,
|
|
119
126
|
|
|
120
127
|
/**
|
|
121
|
-
* Raises a
|
|
128
|
+
* Raises `a` to the power `b`, returning `a ** b` as a `SafeUint` (floored to
|
|
129
|
+
* an integer).
|
|
122
130
|
*
|
|
123
|
-
* @param a The base
|
|
124
|
-
* @param b The exponent
|
|
125
|
-
* @returns `a ** b`
|
|
131
|
+
* @param a - The base non-negative safe integer
|
|
132
|
+
* @param b - The exponent non-negative safe integer
|
|
133
|
+
* @returns `a ** b` as a `SafeUint`
|
|
126
134
|
*/
|
|
127
135
|
pow,
|
|
128
136
|
|
|
129
137
|
/**
|
|
130
|
-
* Adds two SafeUint
|
|
138
|
+
* Adds two non-negative safe integers, returning `a + b` as a `SafeUint`.
|
|
131
139
|
*
|
|
132
|
-
* @param a The first
|
|
133
|
-
* @param b The second
|
|
134
|
-
* @returns `a
|
|
140
|
+
* @param a - The first non-negative safe integer
|
|
141
|
+
* @param b - The second non-negative safe integer
|
|
142
|
+
* @returns The sum of `a` and `b` as a `SafeUint`
|
|
135
143
|
*/
|
|
136
144
|
add,
|
|
137
145
|
|
|
138
146
|
/**
|
|
139
|
-
* Subtracts
|
|
147
|
+
* Subtracts two non-negative safe integers, returning `a - b` as a
|
|
148
|
+
* `SafeUint`.
|
|
140
149
|
*
|
|
141
|
-
* @param a The
|
|
142
|
-
* @param b The
|
|
143
|
-
* @returns `a
|
|
144
|
-
* 0).
|
|
150
|
+
* @param a - The first non-negative safe integer
|
|
151
|
+
* @param b - The second non-negative safe integer
|
|
152
|
+
* @returns The difference of `a` and `b` as a `SafeUint`
|
|
145
153
|
*/
|
|
146
154
|
sub,
|
|
147
155
|
|
|
148
156
|
/**
|
|
149
|
-
* Multiplies two
|
|
157
|
+
* Multiplies two non-negative safe integers, returning `a * b` as a
|
|
158
|
+
* `SafeUint`.
|
|
150
159
|
*
|
|
151
|
-
* @param a The first
|
|
152
|
-
* @param b The second
|
|
153
|
-
* @returns `a
|
|
160
|
+
* @param a - The first non-negative safe integer
|
|
161
|
+
* @param b - The second non-negative safe integer
|
|
162
|
+
* @returns The product of `a` and `b` as a `SafeUint`
|
|
154
163
|
*/
|
|
155
164
|
mul,
|
|
156
165
|
|
|
157
166
|
/**
|
|
158
|
-
* Divides
|
|
167
|
+
* Divides two non-negative safe integers using floor division (`⌊a / b⌋`):
|
|
168
|
+
* the result is `a / b` rounded toward negative infinity, as a `SafeUint`.
|
|
159
169
|
*
|
|
160
|
-
* @param a The dividend
|
|
161
|
-
* @param b The divisor
|
|
162
|
-
* @returns
|
|
170
|
+
* @param a - The dividend
|
|
171
|
+
* @param b - The divisor (must be non-zero)
|
|
172
|
+
* @returns The floored quotient as a `SafeUint`
|
|
163
173
|
*/
|
|
164
174
|
div,
|
|
165
175
|
} as const;
|