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