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.
Files changed (185) hide show
  1. package/README.md +2 -2
  2. package/dist/number/branded-types/finite-number.d.mts +47 -61
  3. package/dist/number/branded-types/finite-number.d.mts.map +1 -1
  4. package/dist/number/branded-types/finite-number.mjs +37 -41
  5. package/dist/number/branded-types/finite-number.mjs.map +1 -1
  6. package/dist/number/branded-types/int.d.mts +40 -46
  7. package/dist/number/branded-types/int.d.mts.map +1 -1
  8. package/dist/number/branded-types/int.mjs +29 -31
  9. package/dist/number/branded-types/int.mjs.map +1 -1
  10. package/dist/number/branded-types/int16.d.mts +71 -59
  11. package/dist/number/branded-types/int16.d.mts.map +1 -1
  12. package/dist/number/branded-types/int16.mjs +56 -47
  13. package/dist/number/branded-types/int16.mjs.map +1 -1
  14. package/dist/number/branded-types/int32.d.mts +71 -59
  15. package/dist/number/branded-types/int32.d.mts.map +1 -1
  16. package/dist/number/branded-types/int32.mjs +56 -47
  17. package/dist/number/branded-types/int32.mjs.map +1 -1
  18. package/dist/number/branded-types/negative-finite-number.d.mts +76 -60
  19. package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -1
  20. package/dist/number/branded-types/negative-finite-number.mjs +62 -49
  21. package/dist/number/branded-types/negative-finite-number.mjs.map +1 -1
  22. package/dist/number/branded-types/negative-int.d.mts +66 -49
  23. package/dist/number/branded-types/negative-int.d.mts.map +1 -1
  24. package/dist/number/branded-types/negative-int.mjs +48 -39
  25. package/dist/number/branded-types/negative-int.mjs.map +1 -1
  26. package/dist/number/branded-types/negative-safe-int.d.mts +64 -57
  27. package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -1
  28. package/dist/number/branded-types/negative-safe-int.mjs +49 -44
  29. package/dist/number/branded-types/negative-safe-int.mjs.map +1 -1
  30. package/dist/number/branded-types/non-negative-finite-number.d.mts +80 -65
  31. package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
  32. package/dist/number/branded-types/non-negative-finite-number.mjs +65 -53
  33. package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
  34. package/dist/number/branded-types/non-negative-int16.d.mts +71 -58
  35. package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
  36. package/dist/number/branded-types/non-negative-int16.mjs +55 -45
  37. package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
  38. package/dist/number/branded-types/non-negative-int32.d.mts +71 -59
  39. package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
  40. package/dist/number/branded-types/non-negative-int32.mjs +55 -46
  41. package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
  42. package/dist/number/branded-types/non-positive-finite-number.d.mts +70 -55
  43. package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -1
  44. package/dist/number/branded-types/non-positive-finite-number.mjs +55 -43
  45. package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -1
  46. package/dist/number/branded-types/non-positive-int.d.mts +46 -146
  47. package/dist/number/branded-types/non-positive-int.d.mts.map +1 -1
  48. package/dist/number/branded-types/non-positive-int.mjs +33 -108
  49. package/dist/number/branded-types/non-positive-int.mjs.map +1 -1
  50. package/dist/number/branded-types/non-positive-safe-int.d.mts +62 -54
  51. package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -1
  52. package/dist/number/branded-types/non-positive-safe-int.mjs +46 -41
  53. package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -1
  54. package/dist/number/branded-types/non-zero-finite-number.d.mts +62 -49
  55. package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
  56. package/dist/number/branded-types/non-zero-finite-number.mjs +46 -37
  57. package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
  58. package/dist/number/branded-types/non-zero-int.d.mts +51 -38
  59. package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
  60. package/dist/number/branded-types/non-zero-int.mjs +31 -27
  61. package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
  62. package/dist/number/branded-types/non-zero-int16.d.mts +59 -54
  63. package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
  64. package/dist/number/branded-types/non-zero-int16.mjs +44 -41
  65. package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
  66. package/dist/number/branded-types/non-zero-int32.d.mts +59 -55
  67. package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
  68. package/dist/number/branded-types/non-zero-int32.mjs +44 -42
  69. package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
  70. package/dist/number/branded-types/non-zero-safe-int.d.mts +60 -55
  71. package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
  72. package/dist/number/branded-types/non-zero-safe-int.mjs +44 -42
  73. package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
  74. package/dist/number/branded-types/non-zero-uint16.d.mts +59 -54
  75. package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
  76. package/dist/number/branded-types/non-zero-uint16.mjs +43 -41
  77. package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
  78. package/dist/number/branded-types/non-zero-uint32.d.mts +59 -54
  79. package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
  80. package/dist/number/branded-types/non-zero-uint32.mjs +43 -41
  81. package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
  82. package/dist/number/branded-types/positive-finite-number.d.mts +82 -64
  83. package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
  84. package/dist/number/branded-types/positive-finite-number.mjs +67 -52
  85. package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
  86. package/dist/number/branded-types/positive-int.d.mts +53 -70
  87. package/dist/number/branded-types/positive-int.d.mts.map +1 -1
  88. package/dist/number/branded-types/positive-int.mjs +42 -52
  89. package/dist/number/branded-types/positive-int.mjs.map +1 -1
  90. package/dist/number/branded-types/positive-int16.d.mts +68 -58
  91. package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
  92. package/dist/number/branded-types/positive-int16.mjs +52 -45
  93. package/dist/number/branded-types/positive-int16.mjs.map +1 -1
  94. package/dist/number/branded-types/positive-int32.d.mts +68 -58
  95. package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
  96. package/dist/number/branded-types/positive-int32.mjs +52 -45
  97. package/dist/number/branded-types/positive-int32.mjs.map +1 -1
  98. package/dist/number/branded-types/positive-safe-int.d.mts +72 -61
  99. package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
  100. package/dist/number/branded-types/positive-safe-int.mjs +56 -48
  101. package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
  102. package/dist/number/branded-types/positive-uint16.d.mts +68 -58
  103. package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
  104. package/dist/number/branded-types/positive-uint16.mjs +52 -45
  105. package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
  106. package/dist/number/branded-types/positive-uint32.d.mts +68 -59
  107. package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
  108. package/dist/number/branded-types/positive-uint32.mjs +52 -46
  109. package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
  110. package/dist/number/branded-types/safe-int.d.mts +52 -66
  111. package/dist/number/branded-types/safe-int.d.mts.map +1 -1
  112. package/dist/number/branded-types/safe-int.mjs +45 -47
  113. package/dist/number/branded-types/safe-int.mjs.map +1 -1
  114. package/dist/number/branded-types/safe-uint.d.mts +68 -58
  115. package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
  116. package/dist/number/branded-types/safe-uint.mjs +53 -46
  117. package/dist/number/branded-types/safe-uint.mjs.map +1 -1
  118. package/dist/number/branded-types/uint.d.mts +72 -55
  119. package/dist/number/branded-types/uint.d.mts.map +1 -1
  120. package/dist/number/branded-types/uint.mjs +52 -45
  121. package/dist/number/branded-types/uint.mjs.map +1 -1
  122. package/dist/number/branded-types/uint16.d.mts +66 -59
  123. package/dist/number/branded-types/uint16.d.mts.map +1 -1
  124. package/dist/number/branded-types/uint16.mjs +51 -45
  125. package/dist/number/branded-types/uint16.mjs.map +1 -1
  126. package/dist/number/branded-types/uint32.d.mts +66 -57
  127. package/dist/number/branded-types/uint32.d.mts.map +1 -1
  128. package/dist/number/branded-types/uint32.mjs +50 -45
  129. package/dist/number/branded-types/uint32.mjs.map +1 -1
  130. package/dist/number/enum/int8.d.mts +62 -66
  131. package/dist/number/enum/int8.d.mts.map +1 -1
  132. package/dist/number/enum/int8.mjs +57 -51
  133. package/dist/number/enum/int8.mjs.map +1 -1
  134. package/dist/number/enum/uint8.d.mts +66 -59
  135. package/dist/number/enum/uint8.d.mts.map +1 -1
  136. package/dist/number/enum/uint8.mjs +57 -51
  137. package/dist/number/enum/uint8.mjs.map +1 -1
  138. package/dist/number/refined-number-utils.d.mts +9 -9
  139. package/dist/number/refined-number-utils.d.mts.map +1 -1
  140. package/dist/number/refined-number-utils.mjs +7 -7
  141. package/dist/number/refined-number-utils.mjs.map +1 -1
  142. package/package.json +2 -1
  143. package/src/number/branded-types/finite-number.mts +47 -61
  144. package/src/number/branded-types/int.mts +40 -46
  145. package/src/number/branded-types/int16.mts +72 -60
  146. package/src/number/branded-types/int32.mts +72 -60
  147. package/src/number/branded-types/negative-finite-number.mts +78 -71
  148. package/src/number/branded-types/negative-finite-number.test.mts +4 -4
  149. package/src/number/branded-types/negative-int.mts +68 -60
  150. package/src/number/branded-types/negative-int.test.mts +5 -5
  151. package/src/number/branded-types/negative-safe-int.mts +66 -68
  152. package/src/number/branded-types/negative-safe-int.test.mts +4 -4
  153. package/src/number/branded-types/non-negative-finite-number.mts +81 -66
  154. package/src/number/branded-types/non-negative-int16.mts +72 -59
  155. package/src/number/branded-types/non-negative-int32.mts +72 -60
  156. package/src/number/branded-types/non-positive-finite-number.mts +71 -56
  157. package/src/number/branded-types/non-positive-finite-number.test.mts +7 -7
  158. package/src/number/branded-types/non-positive-int.mts +47 -147
  159. package/src/number/branded-types/non-positive-int.test.mts +7 -7
  160. package/src/number/branded-types/non-positive-safe-int.mts +63 -55
  161. package/src/number/branded-types/non-positive-safe-int.test.mts +7 -7
  162. package/src/number/branded-types/non-zero-finite-number.mts +62 -51
  163. package/src/number/branded-types/non-zero-int.mts +51 -38
  164. package/src/number/branded-types/non-zero-int16.mts +60 -55
  165. package/src/number/branded-types/non-zero-int32.mts +60 -56
  166. package/src/number/branded-types/non-zero-safe-int.mts +61 -56
  167. package/src/number/branded-types/non-zero-uint16.mts +60 -55
  168. package/src/number/branded-types/non-zero-uint32.mts +60 -55
  169. package/src/number/branded-types/positive-finite-number.mts +83 -65
  170. package/src/number/branded-types/positive-int.mts +54 -71
  171. package/src/number/branded-types/positive-int16.mts +69 -59
  172. package/src/number/branded-types/positive-int32.mts +69 -59
  173. package/src/number/branded-types/positive-safe-int.mts +73 -62
  174. package/src/number/branded-types/positive-uint16.mts +69 -59
  175. package/src/number/branded-types/positive-uint32.mts +69 -60
  176. package/src/number/branded-types/safe-int.mts +53 -67
  177. package/src/number/branded-types/safe-uint.mts +69 -59
  178. package/src/number/branded-types/uint.mts +73 -56
  179. package/src/number/branded-types/uint16.mts +67 -60
  180. package/src/number/branded-types/uint32.mts +67 -58
  181. package/src/number/enum/int8.mts +70 -73
  182. package/src/number/enum/int8.test.mts +7 -4
  183. package/src/number/enum/uint8.mts +74 -66
  184. package/src/number/enum/uint8.test.mts +7 -4
  185. 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
- * A safe integer is an integer that can be exactly represented in JavaScript
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 a SafeInt branded type.
63
+ * Casts a `number` to the `SafeInt` branded type.
65
64
  *
66
- * This function validates that the input is a safe integer (within ±(2^53 - 1))
67
- * and returns it with the SafeInt brand. This ensures type safety for
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 branded type
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 types.
85
+ * Namespace providing type-safe operations for the `SafeInt` branded type.
88
86
  *
89
- * SafeInt represents integers that can be exactly represented in JavaScript's
90
- * number type without precision loss. The range is [±(2^53 - 1)], which covers
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 minimum safe integer value (-(2^53 - 1)).
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 maximum safe integer value (2^53 - 1).
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
- * Note: `Math.abs(MIN_SAFE_INTEGER)` would exceed `MAX_SAFE_INTEGER`, so this
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, clamped if necessary
140
+ * @returns The absolute value as a non-negative `SafeInt`
156
141
  */
157
142
  abs,
158
143
 
159
144
  /**
160
- * Returns the minimum value from a list of safe integers.
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 maximum value from a list of safe integers.
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
- * Clamps a number to the safe integer range.
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.clamp(1e20);
186
+ * const aboveRange = SafeInt.fromNumber(1e20);
198
187
  *
199
- * const withinRange = SafeInt.clamp(123);
188
+ * const withinRange = SafeInt.fromNumber(123);
200
189
  *
201
- * const belowRange = SafeInt.clamp(-1e20);
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 number to clamp.
211
- * @returns The value clamped to [MIN_SAFE_INTEGER, MAX_SAFE_INTEGER] as a
212
- * SafeInt.
199
+ * @param value - The value to convert
200
+ * @returns The value as a `SafeInt`
213
201
  */
214
- clamp,
202
+ fromNumber,
215
203
 
216
204
  /**
217
- * Generates a random safe integer within the specified range (inclusive).
205
+ * Generates a random `SafeInt` within the given range.
218
206
  *
219
- * The range is inclusive on both ends. If min > max, they are automatically
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 the range [min, max]
225
+ * @returns A random `SafeInt` in `[min, max]`
239
226
  */
240
227
  random,
241
228
 
242
229
  /**
243
- * Raises a SafeInt to the power of another SafeInt.
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 SafeInt.
260
- * @param b The exponent SafeInt.
261
- * @returns `a ** b` clamped to safe integer range as a SafeInt.
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 values.
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 SafeInt.
279
- * @param b The second SafeInt.
280
- * @returns `a + b` clamped to safe integer range as a SafeInt.
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 one SafeInt from another.
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 minuend SafeInt.
298
- * @param b The subtrahend SafeInt.
299
- * @returns `a - b` clamped to safe integer range as a SafeInt.
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 values.
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 SafeInt.
317
- * @param b The second SafeInt.
318
- * @returns `a * b` clamped to safe integer range as a SafeInt.
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 one SafeInt by another using floor division.
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 integer quotient as a SafeInt
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
- * Checks if a number is a SafeUint.
38
+ * Type guard that checks if a value is a non-negative safe integer.
39
39
  *
40
- * @param value The value to check.
41
- * @returns `true` if the value is a SafeUint, `false` otherwise.
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 a SafeUint type.
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 type.
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 arithmetic operations for safe unsigned
56
- * integers.
61
+ * Namespace providing type-safe operations for the `SafeUint` branded type.
57
62
  *
58
- * All operations automatically clamp results to the safe unsigned integer range
59
- * [0, MAX_SAFE_INTEGER]. This ensures that all arithmetic maintains both the
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 to check if a value is a SafeUint.
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
- * otherwise.
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 minimum value for a safe unsigned integer.
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 maximum safe integer value (2^53 - 1).
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 smaller of two SafeUint values.
89
+ * Returns the smallest of the given non-negative safe integers.
89
90
  *
90
- * @param a The first SafeUint.
91
- * @param b The second SafeUint.
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 larger of two SafeUint values.
97
+ * Returns the largest of the given non-negative safe integers.
98
98
  *
99
- * @param a The first SafeUint.
100
- * @param b The second SafeUint.
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
- * Clamps a number to the safe unsigned integer range.
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 number to clamp.
109
- * @returns The value clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
111
+ * @param value - The value to convert
112
+ * @returns The value as a `SafeUint`
110
113
  */
111
- clamp,
114
+ fromNumber,
112
115
 
113
116
  /**
114
- * Generates a random SafeUint value within the valid range.
117
+ * Generates a random `SafeUint` within the given range.
118
+ *
119
+ * The range is inclusive on both ends.
115
120
  *
116
- * @returns A random SafeUint between 0 and MAX_SAFE_INTEGER.
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 SafeUint to the power of another SafeUint.
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 SafeUint.
124
- * @param b The exponent SafeUint.
125
- * @returns `a ** b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
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 values.
138
+ * Adds two non-negative safe integers, returning `a + b` as a `SafeUint`.
131
139
  *
132
- * @param a The first SafeUint.
133
- * @param b The second SafeUint.
134
- * @returns `a + b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
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 one SafeUint from another.
147
+ * Subtracts two non-negative safe integers, returning `a - b` as a
148
+ * `SafeUint`.
140
149
  *
141
- * @param a The minuend SafeUint.
142
- * @param b The subtrahend SafeUint.
143
- * @returns `a - b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint (minimum
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 SafeUint values.
157
+ * Multiplies two non-negative safe integers, returning `a * b` as a
158
+ * `SafeUint`.
150
159
  *
151
- * @param a The first SafeUint.
152
- * @param b The second SafeUint.
153
- * @returns `a * b` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
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 one SafeUint by another using floor division.
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 SafeUint.
161
- * @param b The divisor SafeUint.
162
- * @returns `⌊a / b⌋` clamped to [0, MAX_SAFE_INTEGER] as a SafeUint.
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;