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
@@ -16,7 +16,7 @@ const {
16
16
  MIN_VALUE,
17
17
  add,
18
18
  castType,
19
- clamp,
19
+ fromNumber,
20
20
  is,
21
21
  max: max_,
22
22
  min: min_,
@@ -35,139 +35,137 @@ const {
35
35
  typeNameInMessage,
36
36
  } as const);
37
37
 
38
- /**
39
- * Returns the absolute value of a negative safe integer.
40
- *
41
- * The absolute value of a negative safe integer is always a positive safe
42
- * integer (`>= 1`), so the result is typed as a {@link PositiveSafeInt}.
43
- *
44
- * @param x - The negative safe integer.
45
- * @returns `|x|` as a PositiveSafeInt.
46
- */
47
38
  const abs = (x: WithSmallInt<ElementType>): PositiveSafeInt =>
48
- PositiveSafeInt.clamp(Math.abs(x));
39
+ PositiveSafeInt.fromNumber(Math.abs(x));
49
40
 
50
41
  /**
51
- * Checks if a number is a NegativeSafeInt (a negative safe integer in the range
52
- * `[Number.MIN_SAFE_INTEGER, -1]`).
42
+ * Type guard that checks if a value is a negative safe integer.
43
+ *
44
+ * Returns `true` for a negative safe integer — a value with no fractional
45
+ * component.
53
46
  *
54
- * @param value The value to check.
55
- * @returns `true` if the value is a NegativeSafeInt, `false` otherwise.
47
+ * @param value - The value to check
48
+ * @returns `true` if the value is a negative safe integer, `false` otherwise
56
49
  */
57
50
  export const isNegativeSafeInt = is;
58
51
 
59
52
  /**
60
- * Casts a number to a NegativeSafeInt type.
53
+ * Casts a `number` to the `NegativeSafeInt` branded type.
54
+ *
55
+ * Validates that the value is a negative safe integer and returns it with the
56
+ * `NegativeSafeInt` brand. Throws a `TypeError` otherwise.
61
57
  *
62
- * @param value The value to cast.
63
- * @returns The value as a NegativeSafeInt type.
64
- * @throws {TypeError} If the value is not a negative safe integer.
58
+ * @param value - The value to cast
59
+ * @returns The value as a `NegativeSafeInt`
60
+ * @throws {TypeError} If the value is not a negative safe integer
65
61
  */
66
62
  export const asNegativeSafeInt = castType;
67
63
 
68
64
  /**
69
- * Namespace providing type-safe arithmetic operations for negative safe
70
- * integers.
65
+ * Namespace providing type-safe operations for the `NegativeSafeInt` branded
66
+ * type.
71
67
  *
72
- * NegativeSafeInt represents safe integers that are strictly less than zero
73
- * (`[Number.MIN_SAFE_INTEGER, -1]`). Operations that stay within the negative
74
- * safe integers clamp their results to the valid range, while operations whose
75
- * result leaves the set (`mul`, `div`, `abs`) are typed to reflect the actual
76
- * sign of the result.
68
+ * The `NegativeSafeInt` type represents a negative safe integer. Division
69
+ * (`div`) uses floor division.
77
70
  */
78
71
  export const NegativeSafeInt = {
79
72
  /**
80
- * Type guard to check if a value is a NegativeSafeInt.
73
+ * Type guard that checks if a value is a negative safe integer.
81
74
  *
82
- * @param value The value to check.
83
- * @returns `true` if the value is a negative safe integer, `false` otherwise.
75
+ * @param value - The value to check
76
+ * @returns `true` if the value is a negative safe integer, `false` otherwise
77
+ * @see {@link isNegativeSafeInt} for usage examples
84
78
  */
85
79
  is,
86
80
 
87
81
  /**
88
- * The minimum value for a negative safe integer.
89
- *
90
- * @readonly
82
+ * The smallest value representable as `NegativeSafeInt` (the lower saturation
83
+ * target of `fromNumber`).
91
84
  */
92
85
  MIN_VALUE,
93
86
 
94
87
  /**
95
- * The maximum value for a negative safe integer.
96
- *
97
- * @readonly
88
+ * The largest value representable as `NegativeSafeInt` (the upper saturation
89
+ * target of `fromNumber`).
98
90
  */
99
91
  MAX_VALUE,
100
92
 
101
93
  /**
102
94
  * Returns the absolute value of a negative safe integer.
103
95
  *
104
- * @param a The negative safe integer.
105
- * @returns The absolute value as a PositiveSafeInt.
96
+ * The result is non-negative and keeps the `NegativeSafeInt` brand.
97
+ *
98
+ * @param a - The negative safe integer value
99
+ * @returns The absolute value as a non-negative `NegativeSafeInt`
106
100
  */
107
101
  abs,
108
102
 
109
103
  /**
110
- * Returns the smaller of two negative safe integers.
104
+ * Returns the smallest of the given negative safe integers.
111
105
  *
112
- * @param a The first negative safe integer.
113
- * @param b The second negative safe integer.
114
- * @returns The minimum value as a NegativeSafeInt.
106
+ * @param values - The negative safe integers to compare (at least one required)
107
+ * @returns The smallest value as a `NegativeSafeInt`
115
108
  */
116
109
  min: min_,
117
110
 
118
111
  /**
119
- * Returns the larger of two negative safe integers.
112
+ * Returns the largest of the given negative safe integers.
120
113
  *
121
- * @param a The first negative safe integer.
122
- * @param b The second negative safe integer.
123
- * @returns The maximum value as a NegativeSafeInt.
114
+ * @param values - The negative safe integers to compare (at least one required)
115
+ * @returns The largest value as a `NegativeSafeInt`
124
116
  */
125
117
  max: max_,
126
118
 
127
119
  /**
128
- * Clamps a number to the NegativeSafeInt range.
120
+ * Converts an arbitrary `number` into a `NegativeSafeInt`, rounding to the
121
+ * nearest integer and saturating the result into the range `[MIN_VALUE,
122
+ * MAX_VALUE]`.
129
123
  *
130
- * @param value The number to clamp.
131
- * @returns The value clamped to `[Number.MIN_SAFE_INTEGER, -1]` as a
132
- * NegativeSafeInt.
124
+ * Unlike `asNegativeSafeInt`, this is total: out-of-range inputs are clamped
125
+ * to the nearest representable `NegativeSafeInt` instead of throwing.
126
+ *
127
+ * @param value - The value to convert
128
+ * @returns The value as a `NegativeSafeInt`
133
129
  */
134
- clamp,
130
+ fromNumber,
135
131
 
136
132
  /**
137
- * Generates a random NegativeSafeInt value within the valid range.
133
+ * Generates a random `NegativeSafeInt` within the given range.
134
+ *
135
+ * The range is inclusive on both ends.
138
136
  *
139
- * @returns A random NegativeSafeInt between Number.MIN_SAFE_INTEGER and -1.
137
+ * @param min - The minimum value (inclusive)
138
+ * @param max - The maximum value (inclusive)
139
+ * @returns A random `NegativeSafeInt` in `[min, max]`
140
140
  */
141
141
  random,
142
142
 
143
143
  /**
144
- * Raises a negative safe integer to the power of another negative safe
145
- * integer.
144
+ * Raises `a` to the power `b`, returning `a ** b` as a `NegativeSafeInt`
145
+ * (floored to an integer).
146
146
  *
147
- * @param a The base negative safe integer.
148
- * @param b The exponent negative safe integer.
149
- * @returns `a ** b` clamped to the NegativeSafeInt range.
147
+ * @param a - The base negative safe integer
148
+ * @param b - The exponent negative safe integer
149
+ * @returns `a ** b` as a `NegativeSafeInt`
150
150
  */
151
151
  pow,
152
152
 
153
153
  /**
154
- * Adds two negative safe integers.
154
+ * Adds two negative safe integers, returning `a + b` as a `NegativeSafeInt`.
155
155
  *
156
- * @param a The first negative safe integer.
157
- * @param b The second negative safe integer.
158
- * @returns `a + b` clamped to the NegativeSafeInt range.
156
+ * @param a - The first negative safe integer
157
+ * @param b - The second negative safe integer
158
+ * @returns The sum of `a` and `b` as a `NegativeSafeInt`
159
159
  */
160
160
  add,
161
161
 
162
162
  /**
163
- * Subtracts one negative safe integer from another.
164
- *
165
- * The mathematical result can be positive, so it is clamped to the
166
- * NegativeSafeInt range (maximum `-1`).
163
+ * Subtracts two negative safe integers, returning `a - b` as a
164
+ * `NegativeSafeInt`.
167
165
  *
168
- * @param a The minuend negative safe integer.
169
- * @param b The subtrahend negative safe integer.
170
- * @returns `a - b` clamped to the NegativeSafeInt range.
166
+ * @param a - The first negative safe integer
167
+ * @param b - The second negative safe integer
168
+ * @returns The difference of `a` and `b` as a `NegativeSafeInt`
171
169
  */
172
170
  sub,
173
171
  } as const;
@@ -86,13 +86,13 @@ describe('NegativeSafeInt test', () => {
86
86
  });
87
87
  });
88
88
 
89
- describe('NegativeSafeInt.clamp', () => {
89
+ describe('NegativeSafeInt.fromNumber', () => {
90
90
  test('clamps to the valid range', () => {
91
- expect(NegativeSafeInt.clamp(-5)).toBe(-5);
91
+ expect(NegativeSafeInt.fromNumber(-5)).toBe(-5);
92
92
 
93
- expect(NegativeSafeInt.clamp(0)).toBe(-1);
93
+ expect(NegativeSafeInt.fromNumber(0)).toBe(-1);
94
94
 
95
- expect(NegativeSafeInt.clamp(Number.MIN_SAFE_INTEGER - 100)).toBe(
95
+ expect(NegativeSafeInt.fromNumber(Number.MIN_SAFE_INTEGER - 100)).toBe(
96
96
  Number.MIN_SAFE_INTEGER,
97
97
  );
98
98
  });
@@ -15,8 +15,8 @@ const {
15
15
  MIN_VALUE,
16
16
  add,
17
17
  castType,
18
- clamp,
19
18
  div,
19
+ fromNumber,
20
20
  is,
21
21
  max: max_,
22
22
  min: min_,
@@ -57,149 +57,164 @@ expectType<TsDataForgeInternals.RefinedNumberUtils.ToInt<ElementType>, Uint>(
57
57
  );
58
58
 
59
59
  /**
60
- * Checks if a number is a NonNegativeFiniteNumber (a finite number >= 0).
60
+ * Type guard that checks if a value is a non-negative finite number.
61
61
  *
62
- * @param value The value to check.
63
- * @returns `true` if the value is a NonNegativeFiniteNumber, `false` otherwise.
62
+ * Returns `true` only for a finite value — never `NaN`, `Infinity`, or
63
+ * `-Infinity`.
64
+ *
65
+ * @param value - The value to check
66
+ * @returns `true` if the value is a non-negative finite number, `false` otherwise
64
67
  */
65
68
  export const isNonNegativeFiniteNumber = is;
66
69
 
67
70
  /**
68
- * Casts a number to a NonNegativeFiniteNumber type.
71
+ * Casts a `number` to the `NonNegativeFiniteNumber` branded type.
72
+ *
73
+ * Validates that the value is a non-negative finite number and returns it with
74
+ * the `NonNegativeFiniteNumber` brand. Throws a `TypeError` otherwise.
69
75
  *
70
- * @param value The value to cast.
71
- * @returns The value as a NonNegativeFiniteNumber type.
72
- * @throws {TypeError} If the value is not a non-negative finite number.
76
+ * @param value - The value to cast
77
+ * @returns The value as a `NonNegativeFiniteNumber`
78
+ * @throws {TypeError} If the value is not a non-negative finite number
73
79
  */
74
80
  export const asNonNegativeFiniteNumber = castType;
75
81
 
76
82
  /**
77
- * Namespace providing type-safe arithmetic operations for non-negative finite
78
- * numbers.
83
+ * Namespace providing type-safe operations for the `NonNegativeFiniteNumber`
84
+ * branded type.
79
85
  *
80
- * All operations maintain the non-negative constraint by clamping negative
81
- * results to 0, while ensuring results remain finite (excluding NaN and
82
- * Infinity). This type is useful for representing measurements, distances,
83
- * weights, and other inherently non-negative values.
86
+ * The `NonNegativeFiniteNumber` type represents a non-negative finite number.
84
87
  */
85
88
  export const NonNegativeFiniteNumber = {
86
89
  /**
87
- * Type guard to check if a value is a NonNegativeFiniteNumber.
90
+ * Type guard that checks if a value is a non-negative finite number.
88
91
  *
89
- * @param value The value to check.
90
- * @returns `true` if the value is a non-negative finite number, `false`
91
- * otherwise.
92
+ * @param value - The value to check
93
+ * @returns `true` if the value is a non-negative finite number, `false` otherwise
94
+ * @see {@link isNonNegativeFiniteNumber} for usage examples
92
95
  */
93
96
  is,
94
97
 
95
98
  /**
96
- * The minimum value for a non-negative finite number.
97
- *
98
- * @readonly
99
+ * The smallest value representable as `NonNegativeFiniteNumber` (the lower
100
+ * saturation target of `fromNumber`).
99
101
  */
100
102
  MIN_VALUE,
101
103
 
102
104
  /**
103
- * Returns the smaller of two NonNegativeFiniteNumber values.
105
+ * Returns the smallest of the given non-negative finite numbers.
104
106
  *
105
- * @param a The first NonNegativeFiniteNumber.
106
- * @param b The second NonNegativeFiniteNumber.
107
- * @returns The minimum value as a NonNegativeFiniteNumber.
107
+ * @param values - The non-negative finite numbers to compare (at least one required)
108
+ * @returns The smallest value as a `NonNegativeFiniteNumber`
108
109
  */
109
110
  min: min_,
110
111
 
111
112
  /**
112
- * Returns the larger of two NonNegativeFiniteNumber values.
113
+ * Returns the largest of the given non-negative finite numbers.
113
114
  *
114
- * @param a The first NonNegativeFiniteNumber.
115
- * @param b The second NonNegativeFiniteNumber.
116
- * @returns The maximum value as a NonNegativeFiniteNumber.
115
+ * @param values - The non-negative finite numbers to compare (at least one required)
116
+ * @returns The largest value as a `NonNegativeFiniteNumber`
117
117
  */
118
118
  max: max_,
119
119
 
120
120
  /**
121
- * Clamps a number to the non-negative finite range.
121
+ * Converts an arbitrary `number` into a `NonNegativeFiniteNumber`, saturating
122
+ * it into the range `[MIN_VALUE, MAX_VALUE]`.
122
123
  *
123
- * @param value The number to clamp.
124
- * @returns The value clamped to [0, +∞) as a NonNegativeFiniteNumber.
124
+ * Unlike `asNonNegativeFiniteNumber`, this is total: out-of-range inputs are
125
+ * clamped to the nearest representable `NonNegativeFiniteNumber` instead of
126
+ * throwing.
127
+ *
128
+ * @param value - The value to convert
129
+ * @returns The value as a `NonNegativeFiniteNumber`
125
130
  */
126
- clamp,
131
+ fromNumber,
127
132
 
128
133
  /**
129
- * Rounds down a NonNegativeFiniteNumber to the nearest integer.
134
+ * Returns the greatest integer less than or equal to a non-negative finite
135
+ * number.
130
136
  *
131
- * @param x The NonNegativeFiniteNumber to round down.
132
- * @returns The floor value as a Uint.
137
+ * @param a - The non-negative finite number value
138
+ * @returns The floored value as an integer
133
139
  */
134
140
  floor,
135
141
 
136
142
  /**
137
- * Rounds up a NonNegativeFiniteNumber to the nearest integer.
143
+ * Returns the smallest integer greater than or equal to a non-negative finite
144
+ * number.
138
145
  *
139
- * @param x The NonNegativeFiniteNumber to round up.
140
- * @returns The ceiling value as a Uint.
146
+ * @param a - The non-negative finite number value
147
+ * @returns The ceiled value as an integer
141
148
  */
142
149
  ceil,
143
150
 
144
151
  /**
145
- * Rounds a NonNegativeFiniteNumber to the nearest integer.
152
+ * Returns the value of a non-negative finite number rounded to the nearest
153
+ * integer.
146
154
  *
147
- * @param x The NonNegativeFiniteNumber to round.
148
- * @returns The rounded value as a Uint.
155
+ * @param a - The non-negative finite number value
156
+ * @returns The rounded value as an integer
149
157
  */
150
158
  round,
151
159
 
152
160
  /**
153
- * Generates a random NonNegativeFiniteNumber value.
161
+ * Generates a random `NonNegativeFiniteNumber` within the given range.
162
+ *
163
+ * The range is inclusive on both ends.
154
164
  *
155
- * @returns A random non-negative finite number.
165
+ * @param min - The minimum value (inclusive)
166
+ * @param max - The maximum value (inclusive)
167
+ * @returns A random `NonNegativeFiniteNumber` in `[min, max]`
156
168
  */
157
169
  random,
158
170
 
159
171
  /**
160
- * Raises a NonNegativeFiniteNumber to the power of another
161
- * NonNegativeFiniteNumber.
172
+ * Raises `a` to the power `b`, returning `a ** b` as a
173
+ * `NonNegativeFiniteNumber`.
162
174
  *
163
- * @param a The base NonNegativeFiniteNumber.
164
- * @param b The exponent NonNegativeFiniteNumber.
165
- * @returns `a ** b` clamped to [0, +∞) as a NonNegativeFiniteNumber.
175
+ * @param a - The base non-negative finite number
176
+ * @param b - The exponent non-negative finite number
177
+ * @returns `a ** b` as a `NonNegativeFiniteNumber`
166
178
  */
167
179
  pow,
168
180
 
169
181
  /**
170
- * Adds two NonNegativeFiniteNumber values.
182
+ * Adds two non-negative finite numbers, returning `a + b` as a
183
+ * `NonNegativeFiniteNumber`.
171
184
  *
172
- * @param a The first NonNegativeFiniteNumber.
173
- * @param b The second NonNegativeFiniteNumber.
174
- * @returns `a + b` clamped to [0, +∞) as a NonNegativeFiniteNumber.
185
+ * @param a - The first non-negative finite number
186
+ * @param b - The second non-negative finite number
187
+ * @returns The sum of `a` and `b` as a `NonNegativeFiniteNumber`
175
188
  */
176
189
  add,
177
190
 
178
191
  /**
179
- * Subtracts one NonNegativeFiniteNumber from another.
192
+ * Subtracts two non-negative finite numbers, returning `a - b` as a
193
+ * `NonNegativeFiniteNumber`.
180
194
  *
181
- * @param a The minuend NonNegativeFiniteNumber.
182
- * @param b The subtrahend NonNegativeFiniteNumber.
183
- * @returns `a - b` clamped to [0, +∞) as a NonNegativeFiniteNumber (minimum
184
- * 0).
195
+ * @param a - The first non-negative finite number
196
+ * @param b - The second non-negative finite number
197
+ * @returns The difference of `a` and `b` as a `NonNegativeFiniteNumber`
185
198
  */
186
199
  sub,
187
200
 
188
201
  /**
189
- * Multiplies two NonNegativeFiniteNumber values.
202
+ * Multiplies two non-negative finite numbers, returning `a * b` as a
203
+ * `NonNegativeFiniteNumber`.
190
204
  *
191
- * @param a The first NonNegativeFiniteNumber.
192
- * @param b The second NonNegativeFiniteNumber.
193
- * @returns `a * b` clamped to [0, +∞) as a NonNegativeFiniteNumber.
205
+ * @param a - The first non-negative finite number
206
+ * @param b - The second non-negative finite number
207
+ * @returns The product of `a` and `b` as a `NonNegativeFiniteNumber`
194
208
  */
195
209
  mul,
196
210
 
197
211
  /**
198
- * Divides one NonNegativeFiniteNumber by another.
212
+ * Divides two non-negative finite numbers, returning `a / b` as a
213
+ * `NonNegativeFiniteNumber`.
199
214
  *
200
- * @param a The dividend NonNegativeFiniteNumber.
201
- * @param b The divisor NonNegativeFiniteNumber.
202
- * @returns `a / b` clamped to [0, +∞) as a NonNegativeFiniteNumber.
215
+ * @param a - The dividend
216
+ * @param b - The divisor (must be non-zero)
217
+ * @returns `a / b` as a `NonNegativeFiniteNumber`
203
218
  */
204
219
  div,
205
220
  } as const;