ts-data-forge 6.13.0 → 7.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 (181) hide show
  1. package/README.md +2 -2
  2. package/dist/array/impl/array-utils-iterators.mjs +6 -0
  3. package/dist/array/impl/array-utils-iterators.mjs.map +1 -1
  4. package/dist/array/impl/array-utils-modification.mjs +6 -0
  5. package/dist/array/impl/array-utils-modification.mjs.map +1 -1
  6. package/dist/array/impl/array-utils-reducing-value.mjs +6 -0
  7. package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
  8. package/dist/array/impl/array-utils-search.mjs +6 -0
  9. package/dist/array/impl/array-utils-search.mjs.map +1 -1
  10. package/dist/array/impl/array-utils-slice-clamped.mjs +6 -0
  11. package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
  12. package/dist/array/impl/array-utils-slicing.mjs +6 -0
  13. package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
  14. package/dist/array/impl/array-utils-transformation.mjs +6 -0
  15. package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
  16. package/dist/array/impl/array-utils-validation.mjs +6 -0
  17. package/dist/array/impl/array-utils-validation.mjs.map +1 -1
  18. package/dist/collections/imap-mapped.mjs +6 -0
  19. package/dist/collections/imap-mapped.mjs.map +1 -1
  20. package/dist/collections/imap.mjs +6 -0
  21. package/dist/collections/imap.mjs.map +1 -1
  22. package/dist/collections/iset-mapped.mjs +6 -0
  23. package/dist/collections/iset-mapped.mjs.map +1 -1
  24. package/dist/collections/iset.mjs +6 -0
  25. package/dist/collections/iset.mjs.map +1 -1
  26. package/dist/collections/queue.mjs +6 -0
  27. package/dist/collections/queue.mjs.map +1 -1
  28. package/dist/collections/stack.mjs +6 -0
  29. package/dist/collections/stack.mjs.map +1 -1
  30. package/dist/entry-point.mjs +6 -0
  31. package/dist/entry-point.mjs.map +1 -1
  32. package/dist/functional/pipe.d.mts +6 -18
  33. package/dist/functional/pipe.d.mts.map +1 -1
  34. package/dist/functional/pipe.mjs +35 -15
  35. package/dist/functional/pipe.mjs.map +1 -1
  36. package/dist/index.mjs +6 -0
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/iterator/range.mjs +6 -0
  39. package/dist/iterator/range.mjs.map +1 -1
  40. package/dist/json/json.mjs +6 -0
  41. package/dist/json/json.mjs.map +1 -1
  42. package/dist/number/branded-types/finite-number.d.mts +1 -1
  43. package/dist/number/branded-types/index.d.mts +6 -0
  44. package/dist/number/branded-types/index.d.mts.map +1 -1
  45. package/dist/number/branded-types/index.mjs +6 -0
  46. package/dist/number/branded-types/index.mjs.map +1 -1
  47. package/dist/number/branded-types/int.d.mts +1 -2
  48. package/dist/number/branded-types/int.d.mts.map +1 -1
  49. package/dist/number/branded-types/int16.d.mts +2 -3
  50. package/dist/number/branded-types/int16.d.mts.map +1 -1
  51. package/dist/number/branded-types/int32.d.mts +2 -3
  52. package/dist/number/branded-types/int32.d.mts.map +1 -1
  53. package/dist/number/branded-types/negative-finite-number.d.mts +143 -0
  54. package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -0
  55. package/dist/number/branded-types/negative-finite-number.mjs +156 -0
  56. package/dist/number/branded-types/negative-finite-number.mjs.map +1 -0
  57. package/dist/number/branded-types/negative-int.d.mts +120 -0
  58. package/dist/number/branded-types/negative-int.d.mts.map +1 -0
  59. package/dist/number/branded-types/negative-int.mjs +125 -0
  60. package/dist/number/branded-types/negative-int.mjs.map +1 -0
  61. package/dist/number/branded-types/negative-safe-int.d.mts +132 -0
  62. package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -0
  63. package/dist/number/branded-types/negative-safe-int.mjs +136 -0
  64. package/dist/number/branded-types/negative-safe-int.mjs.map +1 -0
  65. package/dist/number/branded-types/non-negative-finite-number.d.mts +1 -1
  66. package/dist/number/branded-types/non-negative-int16.d.mts +1 -1
  67. package/dist/number/branded-types/non-negative-int32.d.mts +1 -1
  68. package/dist/number/branded-types/non-positive-finite-number.d.mts +130 -0
  69. package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -0
  70. package/dist/number/branded-types/non-positive-finite-number.mjs +134 -0
  71. package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -0
  72. package/dist/number/branded-types/non-positive-int.d.mts +224 -0
  73. package/dist/number/branded-types/non-positive-int.d.mts.map +1 -0
  74. package/dist/number/branded-types/non-positive-int.mjs +222 -0
  75. package/dist/number/branded-types/non-positive-int.mjs.map +1 -0
  76. package/dist/number/branded-types/non-positive-safe-int.d.mts +119 -0
  77. package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -0
  78. package/dist/number/branded-types/non-positive-safe-int.mjs +116 -0
  79. package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -0
  80. package/dist/number/branded-types/non-zero-finite-number.d.mts +5 -17
  81. package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
  82. package/dist/number/branded-types/non-zero-finite-number.mjs +5 -17
  83. package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
  84. package/dist/number/branded-types/non-zero-int.d.mts +5 -33
  85. package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
  86. package/dist/number/branded-types/non-zero-int.mjs +5 -25
  87. package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
  88. package/dist/number/branded-types/non-zero-int16.d.mts +6 -43
  89. package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
  90. package/dist/number/branded-types/non-zero-int16.mjs +5 -25
  91. package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
  92. package/dist/number/branded-types/non-zero-int32.d.mts +6 -39
  93. package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
  94. package/dist/number/branded-types/non-zero-int32.mjs +5 -25
  95. package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
  96. package/dist/number/branded-types/non-zero-safe-int.d.mts +5 -37
  97. package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
  98. package/dist/number/branded-types/non-zero-safe-int.mjs +5 -28
  99. package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
  100. package/dist/number/branded-types/non-zero-uint16.d.mts +6 -33
  101. package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
  102. package/dist/number/branded-types/non-zero-uint16.mjs +5 -17
  103. package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
  104. package/dist/number/branded-types/non-zero-uint32.d.mts +6 -31
  105. package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
  106. package/dist/number/branded-types/non-zero-uint32.mjs +5 -17
  107. package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
  108. package/dist/number/branded-types/positive-finite-number.d.mts +4 -2
  109. package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
  110. package/dist/number/branded-types/positive-int.d.mts +4 -2
  111. package/dist/number/branded-types/positive-int.d.mts.map +1 -1
  112. package/dist/number/branded-types/positive-int16.d.mts +4 -2
  113. package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
  114. package/dist/number/branded-types/positive-int32.d.mts +4 -2
  115. package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
  116. package/dist/number/branded-types/positive-safe-int.d.mts +4 -2
  117. package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
  118. package/dist/number/branded-types/positive-uint16.d.mts +4 -2
  119. package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
  120. package/dist/number/branded-types/positive-uint32.d.mts +4 -2
  121. package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
  122. package/dist/number/branded-types/safe-int.d.mts +1 -2
  123. package/dist/number/branded-types/safe-int.d.mts.map +1 -1
  124. package/dist/number/branded-types/safe-uint.d.mts +1 -1
  125. package/dist/number/branded-types/uint.d.mts +1 -1
  126. package/dist/number/branded-types/uint16.d.mts +1 -1
  127. package/dist/number/branded-types/uint32.d.mts +1 -1
  128. package/dist/number/index.d.mts +1 -0
  129. package/dist/number/index.d.mts.map +1 -1
  130. package/dist/number/index.mjs +6 -0
  131. package/dist/number/index.mjs.map +1 -1
  132. package/dist/number/num-arithmetic-types.d.mts +74 -0
  133. package/dist/number/num-arithmetic-types.d.mts.map +1 -0
  134. package/dist/number/num-arithmetic-types.mjs +2 -0
  135. package/dist/number/num-arithmetic-types.mjs.map +1 -0
  136. package/dist/number/num.d.mts +53 -9
  137. package/dist/number/num.d.mts.map +1 -1
  138. package/dist/number/num.mjs +64 -12
  139. package/dist/number/num.mjs.map +1 -1
  140. package/dist/number/refined-number-utils.d.mts +12 -9
  141. package/dist/number/refined-number-utils.d.mts.map +1 -1
  142. package/dist/number/refined-number-utils.mjs.map +1 -1
  143. package/dist/object/object.mjs +6 -0
  144. package/dist/object/object.mjs.map +1 -1
  145. package/package.json +5 -2
  146. package/src/functional/pipe.mts +104 -78
  147. package/src/functional/pipe.test.mts +57 -1
  148. package/src/number/branded-types/index.mts +6 -0
  149. package/src/number/branded-types/negative-finite-number.mts +210 -0
  150. package/src/number/branded-types/negative-finite-number.test.mts +172 -0
  151. package/src/number/branded-types/negative-int.mts +160 -0
  152. package/src/number/branded-types/negative-int.test.mts +146 -0
  153. package/src/number/branded-types/negative-safe-int.mts +173 -0
  154. package/src/number/branded-types/negative-safe-int.test.mts +120 -0
  155. package/src/number/branded-types/non-positive-finite-number.mts +191 -0
  156. package/src/number/branded-types/non-positive-finite-number.test.mts +286 -0
  157. package/src/number/branded-types/non-positive-int.mts +251 -0
  158. package/src/number/branded-types/non-positive-int.test.mts +197 -0
  159. package/src/number/branded-types/non-positive-safe-int.mts +147 -0
  160. package/src/number/branded-types/non-positive-safe-int.test.mts +223 -0
  161. package/src/number/branded-types/non-zero-finite-number.mts +14 -22
  162. package/src/number/branded-types/non-zero-finite-number.test.mts +0 -12
  163. package/src/number/branded-types/non-zero-int.mts +10 -32
  164. package/src/number/branded-types/non-zero-int.test.mts +0 -20
  165. package/src/number/branded-types/non-zero-int16.mts +8 -32
  166. package/src/number/branded-types/non-zero-int16.test.mts +0 -30
  167. package/src/number/branded-types/non-zero-int32.mts +8 -32
  168. package/src/number/branded-types/non-zero-int32.test.mts +0 -30
  169. package/src/number/branded-types/non-zero-safe-int.mts +8 -35
  170. package/src/number/branded-types/non-zero-safe-int.test.mts +0 -32
  171. package/src/number/branded-types/non-zero-uint16.mts +8 -22
  172. package/src/number/branded-types/non-zero-uint16.test.mts +0 -16
  173. package/src/number/branded-types/non-zero-uint32.mts +8 -22
  174. package/src/number/branded-types/non-zero-uint32.test.mts +0 -16
  175. package/src/number/index.mts +1 -0
  176. package/src/number/num-arithmetic-types.mts +269 -0
  177. package/src/number/num-arithmetic-types.test.mts +130 -0
  178. package/src/number/num-arithmetic.test.mts +102 -0
  179. package/src/number/num.mts +96 -15
  180. package/src/number/refined-number-utils.mts +19 -9
  181. package/src/others/map-nullable.test.mts +3 -4
@@ -10,16 +10,13 @@ const typeNameInMessage = 'a non-zero integer';
10
10
 
11
11
  const {
12
12
  abs,
13
- add,
14
13
  castType,
15
- div,
16
14
  is,
17
15
  max: max_,
18
16
  min: min_,
19
17
  mul,
20
18
  pow,
21
19
  randomNonZero: random,
22
- sub,
23
20
  } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
24
21
  ElementType,
25
22
  number,
@@ -107,49 +104,30 @@ export const NonZeroInt = {
107
104
  */
108
105
  pow,
109
106
 
110
- /**
111
- * Adds two non-zero integers.
112
- *
113
- * @param a The first non-zero integer.
114
- * @param b The second non-zero integer.
115
- * @returns `a + b` as a NonZeroInt.
116
- */
117
- add,
118
-
119
- /**
120
- * Subtracts one non-zero integer from another.
121
- *
122
- * @param a The minuend non-zero integer.
123
- * @param b The subtrahend non-zero integer.
124
- * @returns `a - b` as a NonZeroInt.
125
- */
126
- sub,
127
-
128
107
  /**
129
108
  * Multiplies two non-zero integers.
130
109
  *
110
+ * The product of two non-zero integers is always non-zero, so this stays
111
+ * closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
112
+ * be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
113
+ *
131
114
  * @param a The first non-zero integer.
132
115
  * @param b The second non-zero integer.
133
116
  * @returns `a * b` as a NonZeroInt.
134
117
  */
135
118
  mul,
136
-
137
- /**
138
- * Divides one non-zero integer by another using floor division.
139
- *
140
- * @param a The dividend non-zero integer.
141
- * @param b The divisor non-zero integer.
142
- * @returns `⌊a / b⌋` as a NonZeroInt.
143
- */
144
- div,
145
119
  } as const;
146
120
 
147
121
  expectType<
148
122
  keyof typeof NonZeroInt,
149
- keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<ElementType, 'int'>
123
+ keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
124
+ ElementType,
125
+ 'int',
126
+ 'mul'
127
+ >
150
128
  >('=');
151
129
 
152
130
  expectType<
153
131
  typeof NonZeroInt,
154
- TsDataForgeInternals.RefinedNumberUtils.NumberClass<ElementType, 'int'>
132
+ TsDataForgeInternals.RefinedNumberUtils.NumberClass<ElementType, 'int', 'mul'>
155
133
  >('<=');
@@ -127,32 +127,12 @@ describe('NonZeroInt test', () => {
127
127
  expect(NonZeroInt.max(a, c)).toBe(5);
128
128
  });
129
129
 
130
- test('add', () => {
131
- expect(NonZeroInt.add(a, b)).toBe(7);
132
-
133
- expect(NonZeroInt.add(a, c)).toBe(2);
134
- });
135
-
136
- test('sub', () => {
137
- expect(NonZeroInt.sub(a, b)).toBe(3);
138
-
139
- expect(NonZeroInt.sub(a, c)).toBe(8);
140
- });
141
-
142
130
  test('mul', () => {
143
131
  expect(NonZeroInt.mul(a, b)).toBe(10);
144
132
 
145
133
  expect(NonZeroInt.mul(a, c)).toBe(-15);
146
134
  });
147
135
 
148
- test('div (floor division)', () => {
149
- expect(NonZeroInt.div(a, b)).toBe(2);
150
-
151
- expect(NonZeroInt.div(asNonZeroInt(7), asNonZeroInt(3))).toBe(2);
152
-
153
- expect(NonZeroInt.div(asNonZeroInt(-7), asNonZeroInt(3))).toBe(-3);
154
- });
155
-
156
136
  test('pow', () => {
157
137
  expect(NonZeroInt.pow(asNonZeroInt(2), asNonZeroInt(3))).toBe(8);
158
138
 
@@ -12,17 +12,14 @@ const {
12
12
  MAX_VALUE,
13
13
  MIN_VALUE,
14
14
  abs,
15
- add,
16
15
  castType,
17
16
  clamp,
18
- div,
19
17
  is,
20
18
  max: max_,
21
19
  min: min_,
22
20
  mul,
23
21
  pow,
24
22
  randomNonZero: random,
25
- sub,
26
23
  } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
27
24
  ElementType,
28
25
  number,
@@ -137,48 +134,26 @@ export const NonZeroInt16 = {
137
134
  */
138
135
  pow,
139
136
 
140
- /**
141
- * Adds two NonZeroInt16 values.
142
- *
143
- * @param a The first NonZeroInt16.
144
- * @param b The second NonZeroInt16.
145
- * @returns `a + b` clamped to [-32768, 32767] as a NonZeroInt16.
146
- */
147
- add,
148
-
149
- /**
150
- * Subtracts one NonZeroInt16 from another.
151
- *
152
- * @param a The minuend NonZeroInt16.
153
- * @param b The subtrahend NonZeroInt16.
154
- * @returns `a - b` clamped to [-32768, 32767] as a NonZeroInt16.
155
- */
156
- sub,
157
-
158
137
  /**
159
138
  * Multiplies two NonZeroInt16 values.
160
139
  *
140
+ * The product of two non-zero integers is always non-zero, so this stays
141
+ * closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
142
+ * be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
143
+ *
161
144
  * @param a The first NonZeroInt16.
162
145
  * @param b The second NonZeroInt16.
163
146
  * @returns `a * b` clamped to [-32768, 32767] as a NonZeroInt16.
164
147
  */
165
148
  mul,
166
-
167
- /**
168
- * Divides one NonZeroInt16 by another using floor division.
169
- *
170
- * @param a The dividend NonZeroInt16.
171
- * @param b The divisor NonZeroInt16.
172
- * @returns `⌊a / b⌋` clamped to [-32768, 32767] as a NonZeroInt16.
173
- */
174
- div,
175
149
  } as const;
176
150
 
177
151
  expectType<
178
152
  keyof typeof NonZeroInt16,
179
153
  keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
180
154
  ElementType,
181
- 'int' | 'range'
155
+ 'int' | 'range',
156
+ 'mul'
182
157
  >
183
158
  >('=');
184
159
 
@@ -186,6 +161,7 @@ expectType<
186
161
  typeof NonZeroInt16,
187
162
  TsDataForgeInternals.RefinedNumberUtils.NumberClass<
188
163
  ElementType,
189
- 'int' | 'range'
164
+ 'int' | 'range',
165
+ 'mul'
190
166
  >
191
167
  >('<=');
@@ -154,28 +154,6 @@ describe('NonZeroInt16 test', () => {
154
154
  expect(NonZeroInt16.max(a, c)).toBe(100);
155
155
  });
156
156
 
157
- test('add (with clamping)', () => {
158
- const result = NonZeroInt16.add(
159
- asNonZeroInt16(32_000),
160
- asNonZeroInt16(1000),
161
- );
162
-
163
- expect(result).toBe(32_767); // clamped to max
164
-
165
- expect(NonZeroInt16.add(a, b)).toBe(150);
166
- });
167
-
168
- test('sub (with clamping)', () => {
169
- const result = NonZeroInt16.sub(
170
- asNonZeroInt16(-32_000),
171
- asNonZeroInt16(1000),
172
- );
173
-
174
- expect(result).toBe(-32_768); // clamped to min
175
-
176
- expect(NonZeroInt16.sub(a, b)).toBe(50);
177
- });
178
-
179
157
  test('mul (with clamping)', () => {
180
158
  const result = NonZeroInt16.mul(
181
159
  asNonZeroInt16(1000),
@@ -187,14 +165,6 @@ describe('NonZeroInt16 test', () => {
187
165
  expect(NonZeroInt16.mul(asNonZeroInt16(10), asNonZeroInt16(5))).toBe(50);
188
166
  });
189
167
 
190
- test('div (floor division with clamping)', () => {
191
- expect(NonZeroInt16.div(a, asNonZeroInt16(50))).toBe(2);
192
-
193
- expect(NonZeroInt16.div(asNonZeroInt16(7), asNonZeroInt16(3))).toBe(2);
194
-
195
- expect(NonZeroInt16.div(asNonZeroInt16(-7), asNonZeroInt16(3))).toBe(-3);
196
- });
197
-
198
168
  test('pow (with clamping)', () => {
199
169
  const result = NonZeroInt16.pow(asNonZeroInt16(200), asNonZeroInt16(3));
200
170
 
@@ -12,17 +12,14 @@ const {
12
12
  MAX_VALUE,
13
13
  MIN_VALUE,
14
14
  abs,
15
- add,
16
15
  castType,
17
16
  clamp,
18
- div,
19
17
  is,
20
18
  max: max_,
21
19
  min: min_,
22
20
  mul,
23
21
  pow,
24
22
  randomNonZero: random,
25
- sub,
26
23
  } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
27
24
  ElementType,
28
25
  number,
@@ -138,48 +135,26 @@ export const NonZeroInt32 = {
138
135
  */
139
136
  pow,
140
137
 
141
- /**
142
- * Adds two NonZeroInt32 values.
143
- *
144
- * @param a The first NonZeroInt32.
145
- * @param b The second NonZeroInt32.
146
- * @returns `a + b` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
147
- */
148
- add,
149
-
150
- /**
151
- * Subtracts one NonZeroInt32 from another.
152
- *
153
- * @param a The minuend NonZeroInt32.
154
- * @param b The subtrahend NonZeroInt32.
155
- * @returns `a - b` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
156
- */
157
- sub,
158
-
159
138
  /**
160
139
  * Multiplies two NonZeroInt32 values.
161
140
  *
141
+ * The product of two non-zero integers is always non-zero, so this stays
142
+ * closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
143
+ * be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
144
+ *
162
145
  * @param a The first NonZeroInt32.
163
146
  * @param b The second NonZeroInt32.
164
147
  * @returns `a * b` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
165
148
  */
166
149
  mul,
167
-
168
- /**
169
- * Divides one NonZeroInt32 by another using floor division.
170
- *
171
- * @param a The dividend NonZeroInt32.
172
- * @param b The divisor NonZeroInt32.
173
- * @returns `⌊a / b⌋` clamped to [-2147483648, 2147483647] as a NonZeroInt32.
174
- */
175
- div,
176
150
  } as const;
177
151
 
178
152
  expectType<
179
153
  keyof typeof NonZeroInt32,
180
154
  keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
181
155
  ElementType,
182
- 'int' | 'range'
156
+ 'int' | 'range',
157
+ 'mul'
183
158
  >
184
159
  >('=');
185
160
 
@@ -187,6 +162,7 @@ expectType<
187
162
  typeof NonZeroInt32,
188
163
  TsDataForgeInternals.RefinedNumberUtils.NumberClass<
189
164
  ElementType,
190
- 'int' | 'range'
165
+ 'int' | 'range',
166
+ 'mul'
191
167
  >
192
168
  >('<=');
@@ -154,28 +154,6 @@ describe('NonZeroInt32 test', () => {
154
154
  expect(NonZeroInt32.max(a, c)).toBe(1_000_000);
155
155
  });
156
156
 
157
- test('add (with clamping)', () => {
158
- const result = NonZeroInt32.add(
159
- asNonZeroInt32(2_147_483_000),
160
- asNonZeroInt32(1000),
161
- );
162
-
163
- expect(result).toBe(2_147_483_647); // clamped to max
164
-
165
- expect(NonZeroInt32.add(a, b)).toBe(1_500_000);
166
- });
167
-
168
- test('sub (with clamping)', () => {
169
- const result = NonZeroInt32.sub(
170
- asNonZeroInt32(-2_147_483_000),
171
- asNonZeroInt32(1000),
172
- );
173
-
174
- expect(result).toBe(-2_147_483_648); // clamped to min
175
-
176
- expect(NonZeroInt32.sub(a, b)).toBe(500_000);
177
- });
178
-
179
157
  test('mul (with clamping)', () => {
180
158
  const result = NonZeroInt32.mul(
181
159
  asNonZeroInt32(100_000),
@@ -189,14 +167,6 @@ describe('NonZeroInt32 test', () => {
189
167
  );
190
168
  });
191
169
 
192
- test('div (floor division with clamping)', () => {
193
- expect(NonZeroInt32.div(a, asNonZeroInt32(500_000))).toBe(2);
194
-
195
- expect(NonZeroInt32.div(asNonZeroInt32(7), asNonZeroInt32(3))).toBe(2);
196
-
197
- expect(NonZeroInt32.div(asNonZeroInt32(-7), asNonZeroInt32(3))).toBe(-3);
198
- });
199
-
200
170
  test('pow (with clamping)', () => {
201
171
  const result = NonZeroInt32.pow(
202
172
  asNonZeroInt32(10_000),
@@ -16,17 +16,14 @@ const {
16
16
  MAX_VALUE,
17
17
  MIN_VALUE,
18
18
  abs,
19
- add,
20
19
  castType,
21
20
  clamp,
22
- div,
23
21
  is,
24
22
  max: max_,
25
23
  min: min_,
26
24
  mul,
27
25
  pow,
28
26
  randomNonZero: random,
29
- sub,
30
27
  } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
31
28
  ElementType,
32
29
  SafeInt,
@@ -144,52 +141,27 @@ export const NonZeroSafeInt = {
144
141
  */
145
142
  pow,
146
143
 
147
- /**
148
- * Adds two NonZeroSafeInt values.
149
- *
150
- * @param a The first NonZeroSafeInt.
151
- * @param b The second NonZeroSafeInt.
152
- * @returns `a + b` clamped to non-zero safe integer range as a
153
- * NonZeroSafeInt.
154
- */
155
- add,
156
-
157
- /**
158
- * Subtracts one NonZeroSafeInt from another.
159
- *
160
- * @param a The minuend NonZeroSafeInt.
161
- * @param b The subtrahend NonZeroSafeInt.
162
- * @returns `a - b` clamped to non-zero safe integer range as a
163
- * NonZeroSafeInt.
164
- */
165
- sub,
166
-
167
144
  /**
168
145
  * Multiplies two NonZeroSafeInt values.
169
146
  *
147
+ * The product of two non-zero safe integers is always non-zero, so this stays
148
+ * closed; for the non-closed operations (`add`/`sub`/`div`, whose result may
149
+ * be `0`) use {@link Num.add}/{@link Num.sub}/{@link Num.divInt}.
150
+ *
170
151
  * @param a The first NonZeroSafeInt.
171
152
  * @param b The second NonZeroSafeInt.
172
153
  * @returns `a * b` clamped to non-zero safe integer range as a
173
154
  * NonZeroSafeInt.
174
155
  */
175
156
  mul,
176
-
177
- /**
178
- * Divides one NonZeroSafeInt by another using floor division.
179
- *
180
- * @param a The dividend NonZeroSafeInt.
181
- * @param b The divisor NonZeroSafeInt.
182
- * @returns `⌊a / b⌋` clamped to non-zero safe integer range as a
183
- * NonZeroSafeInt.
184
- */
185
- div,
186
157
  } as const;
187
158
 
188
159
  expectType<
189
160
  keyof typeof NonZeroSafeInt,
190
161
  keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
191
162
  ElementType,
192
- 'int' | 'range'
163
+ 'int' | 'range',
164
+ 'mul'
193
165
  >
194
166
  >('=');
195
167
 
@@ -197,6 +169,7 @@ expectType<
197
169
  typeof NonZeroSafeInt,
198
170
  TsDataForgeInternals.RefinedNumberUtils.NumberClass<
199
171
  ElementType,
200
- 'int' | 'range'
172
+ 'int' | 'range',
173
+ 'mul'
201
174
  >
202
175
  >('<=');
@@ -170,26 +170,6 @@ describe('NonZeroSafeInt test', () => {
170
170
  expect(NonZeroSafeInt.max(a, c)).toBe(5);
171
171
  });
172
172
 
173
- test('add (with clamping to safe integer range)', () => {
174
- const largeValue = asNonZeroSafeInt(Number.MAX_SAFE_INTEGER - 1);
175
-
176
- const result = NonZeroSafeInt.add(largeValue, asNonZeroSafeInt(10));
177
-
178
- expect(result).toBe(Number.MAX_SAFE_INTEGER); // clamped to max
179
-
180
- expect(NonZeroSafeInt.add(a, b)).toBe(7);
181
- });
182
-
183
- test('sub (with clamping to safe integer range)', () => {
184
- const smallValue = asNonZeroSafeInt(Number.MIN_SAFE_INTEGER + 1);
185
-
186
- const result = NonZeroSafeInt.sub(smallValue, asNonZeroSafeInt(10));
187
-
188
- expect(result).toBe(Number.MIN_SAFE_INTEGER); // clamped to min
189
-
190
- expect(NonZeroSafeInt.sub(a, b)).toBe(3);
191
- });
192
-
193
173
  test('mul (with clamping to safe integer range)', () => {
194
174
  const largeValue = asNonZeroSafeInt(
195
175
  Math.floor(Math.sqrt(Number.MAX_SAFE_INTEGER)),
@@ -204,18 +184,6 @@ describe('NonZeroSafeInt test', () => {
204
184
  ).toBe(50);
205
185
  });
206
186
 
207
- test('div (floor division with clamping)', () => {
208
- expect(NonZeroSafeInt.div(a, b)).toBe(2);
209
-
210
- expect(NonZeroSafeInt.div(asNonZeroSafeInt(7), asNonZeroSafeInt(3))).toBe(
211
- 2,
212
- );
213
-
214
- expect(
215
- NonZeroSafeInt.div(asNonZeroSafeInt(-7), asNonZeroSafeInt(3)),
216
- ).toBe(-3);
217
- });
218
-
219
187
  test('pow (with clamping to safe integer range)', () => {
220
188
  const result = NonZeroSafeInt.pow(
221
189
  asNonZeroSafeInt(1000),
@@ -14,14 +14,12 @@ const {
14
14
  add,
15
15
  castType,
16
16
  clamp,
17
- div,
18
17
  is,
19
18
  max: max_,
20
19
  min: min_,
21
20
  mul,
22
21
  pow,
23
22
  randomNonZero: random,
24
- sub,
25
23
  } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
26
24
  ElementType,
27
25
  1,
@@ -136,39 +134,26 @@ export const NonZeroUint16 = {
136
134
  */
137
135
  add,
138
136
 
139
- /**
140
- * Subtracts one NonZeroUint16 from another.
141
- *
142
- * @param a The minuend NonZeroUint16.
143
- * @param b The subtrahend NonZeroUint16.
144
- * @returns `a - b` clamped to [1, 65535] as a NonZeroUint16 (minimum 1).
145
- */
146
- sub,
147
-
148
137
  /**
149
138
  * Multiplies two NonZeroUint16 values.
150
139
  *
140
+ * Both `add` and `mul` stay within `[1, 65535]`. For the non-closed
141
+ * operations (`sub`/`div`, whose result may be `0`) use {@link Num.sub} /
142
+ * {@link Num.divInt}.
143
+ *
151
144
  * @param a The first NonZeroUint16.
152
145
  * @param b The second NonZeroUint16.
153
146
  * @returns `a * b` clamped to [1, 65535] as a NonZeroUint16.
154
147
  */
155
148
  mul,
156
-
157
- /**
158
- * Divides one NonZeroUint16 by another using floor division.
159
- *
160
- * @param a The dividend NonZeroUint16.
161
- * @param b The divisor NonZeroUint16.
162
- * @returns `⌊a / b⌋` clamped to [1, 65535] as a NonZeroUint16.
163
- */
164
- div,
165
149
  } as const;
166
150
 
167
151
  expectType<
168
152
  keyof typeof NonZeroUint16,
169
153
  keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
170
154
  ElementType,
171
- 'int' | 'positive' | 'range'
155
+ 'int' | 'positive' | 'range',
156
+ 'add' | 'mul'
172
157
  >
173
158
  >('=');
174
159
 
@@ -176,6 +161,7 @@ expectType<
176
161
  typeof NonZeroUint16,
177
162
  TsDataForgeInternals.RefinedNumberUtils.NumberClass<
178
163
  ElementType,
179
- 'int' | 'positive' | 'range'
164
+ 'int' | 'positive' | 'range',
165
+ 'add' | 'mul'
180
166
  >
181
167
  >('<=');
@@ -159,12 +159,6 @@ describe('NonZeroUint16 test', () => {
159
159
  expect(NonZeroUint16.add(a, b)).toBe(150);
160
160
  });
161
161
 
162
- test('sub (never goes below 1)', () => {
163
- expect(NonZeroUint16.sub(a, b)).toBe(50);
164
-
165
- expect(NonZeroUint16.sub(b, a)).toBe(1); // clamped to 1
166
- });
167
-
168
162
  test('mul (with clamping to non-zero uint16 range)', () => {
169
163
  const result = NonZeroUint16.mul(
170
164
  asNonZeroUint16(1000),
@@ -178,16 +172,6 @@ describe('NonZeroUint16 test', () => {
178
172
  );
179
173
  });
180
174
 
181
- test('div (floor division, never goes below 1)', () => {
182
- expect(NonZeroUint16.div(a, asNonZeroUint16(50))).toBe(2);
183
-
184
- expect(NonZeroUint16.div(asNonZeroUint16(7), asNonZeroUint16(3))).toBe(2);
185
-
186
- expect(NonZeroUint16.div(asNonZeroUint16(50), asNonZeroUint16(100))).toBe(
187
- 1,
188
- ); // floor(50/100) = 0, clamped to 1
189
- });
190
-
191
175
  test('pow (with clamping to non-zero uint16 range)', () => {
192
176
  const result = NonZeroUint16.pow(
193
177
  asNonZeroUint16(256),
@@ -14,14 +14,12 @@ const {
14
14
  add,
15
15
  castType,
16
16
  clamp,
17
- div,
18
17
  is,
19
18
  max: max_,
20
19
  min: min_,
21
20
  mul,
22
21
  pow,
23
22
  randomNonZero: random,
24
- sub,
25
23
  } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
26
24
  ElementType,
27
25
  1,
@@ -136,39 +134,26 @@ export const NonZeroUint32 = {
136
134
  */
137
135
  add,
138
136
 
139
- /**
140
- * Subtracts one NonZeroUint32 from another.
141
- *
142
- * @param a The minuend NonZeroUint32.
143
- * @param b The subtrahend NonZeroUint32.
144
- * @returns `a - b` clamped to [1, 4294967295] as a NonZeroUint32 (minimum 1).
145
- */
146
- sub,
147
-
148
137
  /**
149
138
  * Multiplies two NonZeroUint32 values.
150
139
  *
140
+ * Both `add` and `mul` stay within `[1, 4294967295]`. For the non-closed
141
+ * operations (`sub`/`div`, whose result may be `0`) use {@link Num.sub} /
142
+ * {@link Num.divInt}.
143
+ *
151
144
  * @param a The first NonZeroUint32.
152
145
  * @param b The second NonZeroUint32.
153
146
  * @returns `a * b` clamped to [1, 4294967295] as a NonZeroUint32.
154
147
  */
155
148
  mul,
156
-
157
- /**
158
- * Divides one NonZeroUint32 by another using floor division.
159
- *
160
- * @param a The dividend NonZeroUint32.
161
- * @param b The divisor NonZeroUint32.
162
- * @returns `⌊a / b⌋` clamped to [1, 4294967295] as a NonZeroUint32.
163
- */
164
- div,
165
149
  } as const;
166
150
 
167
151
  expectType<
168
152
  keyof typeof NonZeroUint32,
169
153
  keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
170
154
  ElementType,
171
- 'int' | 'positive' | 'range'
155
+ 'int' | 'positive' | 'range',
156
+ 'add' | 'mul'
172
157
  >
173
158
  >('=');
174
159
 
@@ -176,6 +161,7 @@ expectType<
176
161
  typeof NonZeroUint32,
177
162
  TsDataForgeInternals.RefinedNumberUtils.NumberClass<
178
163
  ElementType,
179
- 'int' | 'positive' | 'range'
164
+ 'int' | 'positive' | 'range',
165
+ 'add' | 'mul'
180
166
  >
181
167
  >('<=');
@@ -159,12 +159,6 @@ describe('NonZeroUint32 test', () => {
159
159
  expect(NonZeroUint32.add(a, b)).toBe(1_500_000);
160
160
  });
161
161
 
162
- test('sub (never goes below 1)', () => {
163
- expect(NonZeroUint32.sub(a, b)).toBe(500_000);
164
-
165
- expect(NonZeroUint32.sub(b, a)).toBe(1); // clamped to 1
166
- });
167
-
168
162
  test('mul (with clamping to non-zero uint32 range)', () => {
169
163
  const result = NonZeroUint32.mul(
170
164
  asNonZeroUint32(100_000),
@@ -178,16 +172,6 @@ describe('NonZeroUint32 test', () => {
178
172
  );
179
173
  });
180
174
 
181
- test('div (floor division, never goes below 1)', () => {
182
- expect(NonZeroUint32.div(a, asNonZeroUint32(500_000))).toBe(2);
183
-
184
- expect(NonZeroUint32.div(asNonZeroUint32(7), asNonZeroUint32(3))).toBe(2);
185
-
186
- expect(
187
- NonZeroUint32.div(asNonZeroUint32(500_000), asNonZeroUint32(1_000_000)),
188
- ).toBe(1); // floor(500000/1000000) = 0, clamped to 1
189
- });
190
-
191
175
  test('pow (with clamping to non-zero uint32 range)', () => {
192
176
  const result = NonZeroUint32.pow(
193
177
  asNonZeroUint32(10_000),
@@ -1,4 +1,5 @@
1
1
  export * from './branded-types/index.mjs';
2
2
  export * from './enum/index.mjs';
3
+ export * from './num-arithmetic-types.mjs';
3
4
  export * from './num.mjs';
4
5
  export * from './refined-number-utils.mjs';