ts-data-forge 6.13.1 → 7.0.1

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 (257) hide show
  1. package/README.md +2 -2
  2. package/dist/array/impl/array-utils-creation.d.mts.map +1 -1
  3. package/dist/array/impl/array-utils-creation.mjs +1 -1
  4. package/dist/array/impl/array-utils-creation.mjs.map +1 -1
  5. package/dist/array/impl/array-utils-iterators.mjs +7 -1
  6. package/dist/array/impl/array-utils-iterators.mjs.map +1 -1
  7. package/dist/array/impl/array-utils-modification.mjs +6 -0
  8. package/dist/array/impl/array-utils-modification.mjs.map +1 -1
  9. package/dist/array/impl/array-utils-reducing-value.d.mts +1 -1
  10. package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -1
  11. package/dist/array/impl/array-utils-reducing-value.mjs +6 -1
  12. package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
  13. package/dist/array/impl/array-utils-search.d.mts +0 -2
  14. package/dist/array/impl/array-utils-search.d.mts.map +1 -1
  15. package/dist/array/impl/array-utils-search.mjs +6 -0
  16. package/dist/array/impl/array-utils-search.mjs.map +1 -1
  17. package/dist/array/impl/array-utils-set-op.d.mts.map +1 -1
  18. package/dist/array/impl/array-utils-set-op.mjs +0 -1
  19. package/dist/array/impl/array-utils-set-op.mjs.map +1 -1
  20. package/dist/array/impl/array-utils-slice-clamped.mjs +6 -0
  21. package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
  22. package/dist/array/impl/array-utils-slicing.mjs +6 -0
  23. package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
  24. package/dist/array/impl/array-utils-transformation.d.mts +1 -1
  25. package/dist/array/impl/array-utils-transformation.d.mts.map +1 -1
  26. package/dist/array/impl/array-utils-transformation.mjs +8 -4
  27. package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
  28. package/dist/array/impl/array-utils-validation.d.mts.map +1 -1
  29. package/dist/array/impl/array-utils-validation.mjs +9 -9
  30. package/dist/array/impl/array-utils-validation.mjs.map +1 -1
  31. package/dist/collections/imap-mapped.d.mts +622 -3
  32. package/dist/collections/imap-mapped.d.mts.map +1 -1
  33. package/dist/collections/imap-mapped.mjs +117 -18
  34. package/dist/collections/imap-mapped.mjs.map +1 -1
  35. package/dist/collections/imap.d.mts +3 -3
  36. package/dist/collections/imap.d.mts.map +1 -1
  37. package/dist/collections/imap.mjs +12 -5
  38. package/dist/collections/imap.mjs.map +1 -1
  39. package/dist/collections/iset-mapped.d.mts +4 -4
  40. package/dist/collections/iset-mapped.d.mts.map +1 -1
  41. package/dist/collections/iset-mapped.mjs +14 -4
  42. package/dist/collections/iset-mapped.mjs.map +1 -1
  43. package/dist/collections/iset.d.mts +2 -2
  44. package/dist/collections/iset.d.mts.map +1 -1
  45. package/dist/collections/iset.mjs +11 -2
  46. package/dist/collections/iset.mjs.map +1 -1
  47. package/dist/collections/queue.mjs +26 -20
  48. package/dist/collections/queue.mjs.map +1 -1
  49. package/dist/collections/stack.mjs +23 -17
  50. package/dist/collections/stack.mjs.map +1 -1
  51. package/dist/entry-point.mjs +6 -0
  52. package/dist/entry-point.mjs.map +1 -1
  53. package/dist/functional/optional/impl/optional-flat-map.d.mts +2 -2
  54. package/dist/functional/pipe.d.mts.map +1 -1
  55. package/dist/functional/pipe.mjs.map +1 -1
  56. package/dist/functional/result/impl/result-flat-map.d.mts +2 -2
  57. package/dist/functional/ternary-result/impl/ternary-result-flat-map.d.mts +5 -3
  58. package/dist/functional/ternary-result/impl/ternary-result-flat-map.d.mts.map +1 -1
  59. package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs.map +1 -1
  60. package/dist/guard/has-key.d.mts.map +1 -1
  61. package/dist/guard/has-key.mjs +1 -3
  62. package/dist/guard/has-key.mjs.map +1 -1
  63. package/dist/guard/is-non-null-object.d.mts.map +1 -1
  64. package/dist/guard/is-non-null-object.mjs +1 -3
  65. package/dist/guard/is-non-null-object.mjs.map +1 -1
  66. package/dist/guard/key-is-in.d.mts.map +1 -1
  67. package/dist/guard/key-is-in.mjs +1 -3
  68. package/dist/guard/key-is-in.mjs.map +1 -1
  69. package/dist/index.mjs +6 -0
  70. package/dist/index.mjs.map +1 -1
  71. package/dist/iterator/range.mjs +6 -0
  72. package/dist/iterator/range.mjs.map +1 -1
  73. package/dist/json/json.mjs +11 -7
  74. package/dist/json/json.mjs.map +1 -1
  75. package/dist/number/branded-types/finite-number.d.mts +1 -1
  76. package/dist/number/branded-types/index.d.mts +6 -0
  77. package/dist/number/branded-types/index.d.mts.map +1 -1
  78. package/dist/number/branded-types/index.mjs +6 -0
  79. package/dist/number/branded-types/index.mjs.map +1 -1
  80. package/dist/number/branded-types/int.d.mts +1 -2
  81. package/dist/number/branded-types/int.d.mts.map +1 -1
  82. package/dist/number/branded-types/int16.d.mts +2 -3
  83. package/dist/number/branded-types/int16.d.mts.map +1 -1
  84. package/dist/number/branded-types/int32.d.mts +2 -3
  85. package/dist/number/branded-types/int32.d.mts.map +1 -1
  86. package/dist/number/branded-types/negative-finite-number.d.mts +143 -0
  87. package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -0
  88. package/dist/number/branded-types/negative-finite-number.mjs +156 -0
  89. package/dist/number/branded-types/negative-finite-number.mjs.map +1 -0
  90. package/dist/number/branded-types/negative-int.d.mts +120 -0
  91. package/dist/number/branded-types/negative-int.d.mts.map +1 -0
  92. package/dist/number/branded-types/negative-int.mjs +125 -0
  93. package/dist/number/branded-types/negative-int.mjs.map +1 -0
  94. package/dist/number/branded-types/negative-safe-int.d.mts +132 -0
  95. package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -0
  96. package/dist/number/branded-types/negative-safe-int.mjs +136 -0
  97. package/dist/number/branded-types/negative-safe-int.mjs.map +1 -0
  98. package/dist/number/branded-types/non-negative-finite-number.d.mts +1 -1
  99. package/dist/number/branded-types/non-negative-int16.d.mts +1 -1
  100. package/dist/number/branded-types/non-negative-int32.d.mts +1 -1
  101. package/dist/number/branded-types/non-positive-finite-number.d.mts +130 -0
  102. package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -0
  103. package/dist/number/branded-types/non-positive-finite-number.mjs +134 -0
  104. package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -0
  105. package/dist/number/branded-types/non-positive-int.d.mts +224 -0
  106. package/dist/number/branded-types/non-positive-int.d.mts.map +1 -0
  107. package/dist/number/branded-types/non-positive-int.mjs +222 -0
  108. package/dist/number/branded-types/non-positive-int.mjs.map +1 -0
  109. package/dist/number/branded-types/non-positive-safe-int.d.mts +119 -0
  110. package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -0
  111. package/dist/number/branded-types/non-positive-safe-int.mjs +116 -0
  112. package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -0
  113. package/dist/number/branded-types/non-zero-finite-number.d.mts +5 -17
  114. package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
  115. package/dist/number/branded-types/non-zero-finite-number.mjs +5 -17
  116. package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
  117. package/dist/number/branded-types/non-zero-int.d.mts +5 -33
  118. package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
  119. package/dist/number/branded-types/non-zero-int.mjs +5 -25
  120. package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
  121. package/dist/number/branded-types/non-zero-int16.d.mts +6 -43
  122. package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
  123. package/dist/number/branded-types/non-zero-int16.mjs +5 -25
  124. package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
  125. package/dist/number/branded-types/non-zero-int32.d.mts +6 -39
  126. package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
  127. package/dist/number/branded-types/non-zero-int32.mjs +5 -25
  128. package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
  129. package/dist/number/branded-types/non-zero-safe-int.d.mts +5 -37
  130. package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
  131. package/dist/number/branded-types/non-zero-safe-int.mjs +7 -30
  132. package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
  133. package/dist/number/branded-types/non-zero-uint16.d.mts +6 -33
  134. package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
  135. package/dist/number/branded-types/non-zero-uint16.mjs +5 -17
  136. package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
  137. package/dist/number/branded-types/non-zero-uint32.d.mts +6 -31
  138. package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
  139. package/dist/number/branded-types/non-zero-uint32.mjs +5 -17
  140. package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
  141. package/dist/number/branded-types/positive-finite-number.d.mts +4 -2
  142. package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
  143. package/dist/number/branded-types/positive-int.d.mts +4 -2
  144. package/dist/number/branded-types/positive-int.d.mts.map +1 -1
  145. package/dist/number/branded-types/positive-int16.d.mts +4 -2
  146. package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
  147. package/dist/number/branded-types/positive-int32.d.mts +4 -2
  148. package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
  149. package/dist/number/branded-types/positive-safe-int.d.mts +4 -2
  150. package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
  151. package/dist/number/branded-types/positive-safe-int.mjs +1 -1
  152. package/dist/number/branded-types/positive-uint16.d.mts +4 -2
  153. package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
  154. package/dist/number/branded-types/positive-uint32.d.mts +4 -2
  155. package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
  156. package/dist/number/branded-types/safe-int.d.mts +1 -2
  157. package/dist/number/branded-types/safe-int.d.mts.map +1 -1
  158. package/dist/number/branded-types/safe-int.mjs +2 -2
  159. package/dist/number/branded-types/safe-uint.d.mts +1 -1
  160. package/dist/number/branded-types/safe-uint.mjs +1 -1
  161. package/dist/number/branded-types/uint.d.mts +1 -1
  162. package/dist/number/branded-types/uint16.d.mts +1 -1
  163. package/dist/number/branded-types/uint32.d.mts +1 -1
  164. package/dist/number/index.d.mts +1 -0
  165. package/dist/number/index.d.mts.map +1 -1
  166. package/dist/number/index.mjs +6 -0
  167. package/dist/number/index.mjs.map +1 -1
  168. package/dist/number/num-arithmetic-types.d.mts +74 -0
  169. package/dist/number/num-arithmetic-types.d.mts.map +1 -0
  170. package/dist/number/num-arithmetic-types.mjs +2 -0
  171. package/dist/number/num-arithmetic-types.mjs.map +1 -0
  172. package/dist/number/num.d.mts +53 -9
  173. package/dist/number/num.d.mts.map +1 -1
  174. package/dist/number/num.mjs +67 -15
  175. package/dist/number/num.mjs.map +1 -1
  176. package/dist/number/refined-number-utils.d.mts +12 -9
  177. package/dist/number/refined-number-utils.d.mts.map +1 -1
  178. package/dist/number/refined-number-utils.mjs.map +1 -1
  179. package/dist/object/object.mjs +7 -1
  180. package/dist/object/object.mjs.map +1 -1
  181. package/dist/others/fast-deep-equal.d.mts.map +1 -1
  182. package/dist/others/fast-deep-equal.mjs +0 -1
  183. package/dist/others/fast-deep-equal.mjs.map +1 -1
  184. package/dist/others/unknown-to-string.mjs +2 -2
  185. package/dist/others/unknown-to-string.mjs.map +1 -1
  186. package/package.json +6 -6
  187. package/src/array/impl/array-utils-creation.mts +1 -1
  188. package/src/array/impl/array-utils-iterators.mts +1 -1
  189. package/src/array/impl/array-utils-reducing-value.mts +1 -2
  190. package/src/array/impl/array-utils-search.mts +0 -2
  191. package/src/array/impl/array-utils-set-op.mts +0 -1
  192. package/src/array/impl/array-utils-transformation.mts +8 -6
  193. package/src/array/impl/array-utils-validation.mts +1 -5
  194. package/src/collections/imap-mapped.mts +696 -34
  195. package/src/collections/imap-mapped.test.mts +61 -13
  196. package/src/collections/imap.mts +20 -9
  197. package/src/collections/imap.test.mts +9 -8
  198. package/src/collections/iset-mapped.mts +18 -10
  199. package/src/collections/iset-mapped.test.mts +6 -1
  200. package/src/collections/iset.mts +11 -4
  201. package/src/collections/iset.test.mts +6 -8
  202. package/src/collections/queue.mts +32 -32
  203. package/src/collections/stack.mts +26 -26
  204. package/src/functional/optional/impl/optional-flat-map.mts +2 -2
  205. package/src/functional/optional.test.mts +6 -4
  206. package/src/functional/pipe.mts +0 -1
  207. package/src/functional/pipe.test.mts +2 -1
  208. package/src/functional/result/impl/result-flat-map.mts +2 -2
  209. package/src/functional/result.test.mts +3 -2
  210. package/src/functional/ternary-result/impl/ternary-result-flat-map.mts +5 -3
  211. package/src/functional/ternary-result.test.mts +8 -3
  212. package/src/guard/has-key.mts +1 -3
  213. package/src/guard/is-non-null-object.mts +0 -1
  214. package/src/guard/key-is-in.mts +1 -3
  215. package/src/json/json.mts +5 -8
  216. package/src/json/json.test.mts +2 -2
  217. package/src/number/branded-types/index.mts +6 -0
  218. package/src/number/branded-types/negative-finite-number.mts +210 -0
  219. package/src/number/branded-types/negative-finite-number.test.mts +172 -0
  220. package/src/number/branded-types/negative-int.mts +160 -0
  221. package/src/number/branded-types/negative-int.test.mts +146 -0
  222. package/src/number/branded-types/negative-safe-int.mts +173 -0
  223. package/src/number/branded-types/negative-safe-int.test.mts +120 -0
  224. package/src/number/branded-types/non-positive-finite-number.mts +191 -0
  225. package/src/number/branded-types/non-positive-finite-number.test.mts +286 -0
  226. package/src/number/branded-types/non-positive-int.mts +251 -0
  227. package/src/number/branded-types/non-positive-int.test.mts +197 -0
  228. package/src/number/branded-types/non-positive-safe-int.mts +147 -0
  229. package/src/number/branded-types/non-positive-safe-int.test.mts +223 -0
  230. package/src/number/branded-types/non-zero-finite-number.mts +14 -22
  231. package/src/number/branded-types/non-zero-finite-number.test.mts +0 -12
  232. package/src/number/branded-types/non-zero-int.mts +10 -32
  233. package/src/number/branded-types/non-zero-int.test.mts +0 -20
  234. package/src/number/branded-types/non-zero-int16.mts +8 -32
  235. package/src/number/branded-types/non-zero-int16.test.mts +0 -30
  236. package/src/number/branded-types/non-zero-int32.mts +8 -32
  237. package/src/number/branded-types/non-zero-int32.test.mts +0 -30
  238. package/src/number/branded-types/non-zero-safe-int.mts +10 -37
  239. package/src/number/branded-types/non-zero-safe-int.test.mts +0 -32
  240. package/src/number/branded-types/non-zero-uint16.mts +8 -22
  241. package/src/number/branded-types/non-zero-uint16.test.mts +0 -16
  242. package/src/number/branded-types/non-zero-uint32.mts +8 -22
  243. package/src/number/branded-types/non-zero-uint32.test.mts +0 -16
  244. package/src/number/branded-types/positive-safe-int.mts +1 -1
  245. package/src/number/branded-types/safe-int.mts +2 -2
  246. package/src/number/branded-types/safe-uint.mts +1 -1
  247. package/src/number/index.mts +1 -0
  248. package/src/number/num-arithmetic-types.mts +265 -0
  249. package/src/number/num-arithmetic-types.test.mts +130 -0
  250. package/src/number/num-arithmetic.test.mts +102 -0
  251. package/src/number/num.mts +99 -18
  252. package/src/number/num.test.mts +2 -2
  253. package/src/number/refined-number-utils.mts +19 -9
  254. package/src/object/object.mts +2 -2
  255. package/src/others/fast-deep-equal.mts +0 -2
  256. package/src/others/map-nullable.test.mts +4 -3
  257. package/src/others/unknown-to-string.mts +2 -2
@@ -0,0 +1,223 @@
1
+ import { expectType } from '../../expect-type.mjs';
2
+ import { range } from '../../iterator/index.mjs';
3
+ import {
4
+ asNonPositiveSafeInt,
5
+ isNonPositiveSafeInt,
6
+ NonPositiveSafeInt,
7
+ } from './non-positive-safe-int.mjs';
8
+
9
+ describe('NonPositiveSafeInt test', () => {
10
+ describe(asNonPositiveSafeInt, () => {
11
+ test('accepts valid non-positive safe integer values', () => {
12
+ expect(() => asNonPositiveSafeInt(0)).not.toThrow();
13
+
14
+ expect(() => asNonPositiveSafeInt(-1)).not.toThrow();
15
+
16
+ expect(() => asNonPositiveSafeInt(-1000)).not.toThrow();
17
+
18
+ expect(() => asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER)).not.toThrow();
19
+ });
20
+
21
+ test('rejects positive integers', () => {
22
+ expect(() => asNonPositiveSafeInt(1)).toThrow(TypeError);
23
+
24
+ expect(() => asNonPositiveSafeInt(42)).toThrow(TypeError);
25
+
26
+ expect(() => asNonPositiveSafeInt(Number.MAX_SAFE_INTEGER)).toThrow(
27
+ TypeError,
28
+ );
29
+ });
30
+
31
+ test('rejects values outside safe integer range', () => {
32
+ expect(() => asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER - 1)).toThrow(
33
+ TypeError,
34
+ );
35
+
36
+ expect(() => asNonPositiveSafeInt(Number.MAX_SAFE_INTEGER + 1)).toThrow(
37
+ TypeError,
38
+ );
39
+ });
40
+
41
+ test('rejects non-integers', () => {
42
+ expect(() => asNonPositiveSafeInt(Number.NaN)).toThrow(TypeError);
43
+
44
+ expect(() => asNonPositiveSafeInt(Number.POSITIVE_INFINITY)).toThrow(
45
+ TypeError,
46
+ );
47
+
48
+ expect(() => asNonPositiveSafeInt(Number.NEGATIVE_INFINITY)).toThrow(
49
+ TypeError,
50
+ );
51
+
52
+ expect(() => asNonPositiveSafeInt(-1.2)).toThrow(TypeError);
53
+
54
+ expect(() => asNonPositiveSafeInt(3.4)).toThrow(TypeError);
55
+ });
56
+
57
+ test('returns the same value for valid inputs', () => {
58
+ expect(asNonPositiveSafeInt(0)).toBe(0);
59
+
60
+ expect(asNonPositiveSafeInt(-5)).toBe(-5);
61
+
62
+ expect(asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER)).toBe(
63
+ Number.MIN_SAFE_INTEGER,
64
+ );
65
+ });
66
+
67
+ test('throws TypeError for invalid values', () => {
68
+ expect(() => asNonPositiveSafeInt(1)).toThrow(TypeError);
69
+
70
+ expect(() => asNonPositiveSafeInt(Number.MIN_SAFE_INTEGER - 1)).toThrow(
71
+ TypeError,
72
+ );
73
+
74
+ expect(() => asNonPositiveSafeInt(Number.NaN)).toThrow(TypeError);
75
+ });
76
+ });
77
+
78
+ describe(isNonPositiveSafeInt, () => {
79
+ test('correctly identifies non-positive safe integers', () => {
80
+ assert.isTrue(isNonPositiveSafeInt(0));
81
+
82
+ assert.isTrue(isNonPositiveSafeInt(-1));
83
+
84
+ assert.isTrue(isNonPositiveSafeInt(-1000));
85
+
86
+ assert.isTrue(isNonPositiveSafeInt(Number.MIN_SAFE_INTEGER));
87
+ });
88
+
89
+ test('correctly identifies positive integers', () => {
90
+ assert.isFalse(isNonPositiveSafeInt(1));
91
+
92
+ assert.isFalse(isNonPositiveSafeInt(42));
93
+
94
+ assert.isFalse(isNonPositiveSafeInt(Number.MAX_SAFE_INTEGER));
95
+ });
96
+
97
+ test('correctly identifies values outside safe integer range', () => {
98
+ assert.isFalse(isNonPositiveSafeInt(Number.MIN_SAFE_INTEGER - 1));
99
+
100
+ assert.isFalse(isNonPositiveSafeInt(Number.MAX_SAFE_INTEGER + 1));
101
+ });
102
+
103
+ test('correctly identifies non-integers', () => {
104
+ assert.isFalse(isNonPositiveSafeInt(Number.NaN));
105
+
106
+ assert.isFalse(isNonPositiveSafeInt(Number.POSITIVE_INFINITY));
107
+
108
+ assert.isFalse(isNonPositiveSafeInt(Number.NEGATIVE_INFINITY));
109
+
110
+ assert.isFalse(isNonPositiveSafeInt(-1.2));
111
+
112
+ assert.isFalse(isNonPositiveSafeInt(3.4));
113
+ });
114
+ });
115
+
116
+ describe('NonPositiveSafeInt.is', () => {
117
+ test('works as a type guard', () => {
118
+ const value: number = -42;
119
+
120
+ if (NonPositiveSafeInt.is(value)) {
121
+ expectType<typeof value, typeof value & NonPositiveSafeInt>('=');
122
+ }
123
+ });
124
+ });
125
+
126
+ describe('NonPositiveSafeInt.MIN_VALUE', () => {
127
+ test('is Number.MIN_SAFE_INTEGER', () => {
128
+ expect(NonPositiveSafeInt.MIN_VALUE).toBe(Number.MIN_SAFE_INTEGER);
129
+ });
130
+ });
131
+
132
+ describe('NonPositiveSafeInt.MAX_VALUE', () => {
133
+ test('is 0', () => {
134
+ expect(NonPositiveSafeInt.MAX_VALUE).toBe(0);
135
+ });
136
+ });
137
+
138
+ describe('NonPositiveSafeInt.min', () => {
139
+ test('returns the smaller value', () => {
140
+ expect(NonPositiveSafeInt.min(-5, -10)).toBe(-10);
141
+
142
+ expect(NonPositiveSafeInt.min(0, -1)).toBe(-1);
143
+ });
144
+
145
+ test('clamps to range when necessary', () => {
146
+ expect(NonPositiveSafeInt.min(-5, 10)).toBe(-5);
147
+
148
+ expect(NonPositiveSafeInt.min(5, 10)).toBe(0);
149
+ });
150
+ });
151
+
152
+ describe('NonPositiveSafeInt.max', () => {
153
+ test('returns the larger value', () => {
154
+ expect(NonPositiveSafeInt.max(-5, -10)).toBe(-5);
155
+
156
+ expect(NonPositiveSafeInt.max(-1, 0)).toBe(0);
157
+ });
158
+
159
+ test('clamps to range when necessary', () => {
160
+ expect(NonPositiveSafeInt.max(-5, -10)).toBe(-5);
161
+
162
+ expect(NonPositiveSafeInt.max(-5, 10)).toBe(0);
163
+ });
164
+ });
165
+
166
+ describe('NonPositiveSafeInt.clamp', () => {
167
+ test('returns the same value if within range', () => {
168
+ expect(NonPositiveSafeInt.clamp(-5)).toBe(-5);
169
+
170
+ expect(NonPositiveSafeInt.clamp(0)).toBe(0);
171
+
172
+ expect(NonPositiveSafeInt.clamp(-1000)).toBe(-1000);
173
+ });
174
+
175
+ test('clamps positive values to MAX_VALUE (0)', () => {
176
+ expect(NonPositiveSafeInt.clamp(5)).toBe(0);
177
+
178
+ expect(NonPositiveSafeInt.clamp(1000)).toBe(0);
179
+ });
180
+
181
+ test('clamps out-of-range negative values to MIN_VALUE', () => {
182
+ expect(NonPositiveSafeInt.clamp(Number.MIN_SAFE_INTEGER - 1)).toBe(
183
+ Number.MIN_SAFE_INTEGER,
184
+ );
185
+ });
186
+ });
187
+
188
+ describe('NonPositiveSafeInt.add', () => {
189
+ test('adds two non-positive integers', () => {
190
+ expect(NonPositiveSafeInt.add(-5, -3)).toBe(-8);
191
+
192
+ expect(NonPositiveSafeInt.add(0, -10)).toBe(-10);
193
+ });
194
+
195
+ test('clamps result to MAX_VALUE (0) when sum is positive', () => {
196
+ expect(NonPositiveSafeInt.add(-5, 10)).toBe(0);
197
+
198
+ expect(NonPositiveSafeInt.add(0, 0)).toBe(0);
199
+ });
200
+ });
201
+
202
+ describe('NonPositiveSafeInt.sub', () => {
203
+ test('subtracts two non-positive integers', () => {
204
+ expect(NonPositiveSafeInt.sub(-10, -3)).toBe(-7);
205
+
206
+ expect(NonPositiveSafeInt.sub(0, -5)).toBe(0);
207
+ });
208
+
209
+ test('clamps result to MAX_VALUE (0) when result is positive', () => {
210
+ expect(NonPositiveSafeInt.sub(-5, -10)).toBe(0);
211
+ });
212
+ });
213
+
214
+ describe('NonPositiveSafeInt.random', () => {
215
+ test('generates values within range', () => {
216
+ for (const _ of range(100)) {
217
+ const value = NonPositiveSafeInt.random();
218
+
219
+ assert.isTrue(isNonPositiveSafeInt(value));
220
+ }
221
+ });
222
+ });
223
+ });
@@ -15,7 +15,6 @@ const typeNameInMessage = 'a non-zero finite number';
15
15
 
16
16
  const {
17
17
  abs,
18
- add,
19
18
  castType,
20
19
  div,
21
20
  is,
@@ -24,7 +23,6 @@ const {
24
23
  mul,
25
24
  pow,
26
25
  randomNonZero: random,
27
- sub,
28
26
  } = TsDataForgeInternals.RefinedNumberUtils.operatorsForFloat<
29
27
  ElementType,
30
28
  number,
@@ -169,24 +167,6 @@ export const NonZeroFiniteNumber = {
169
167
  */
170
168
  pow,
171
169
 
172
- /**
173
- * Adds two NonZeroFiniteNumber values.
174
- *
175
- * @param a The first NonZeroFiniteNumber.
176
- * @param b The second NonZeroFiniteNumber.
177
- * @returns `a + b` as a NonZeroFiniteNumber.
178
- */
179
- add,
180
-
181
- /**
182
- * Subtracts one NonZeroFiniteNumber from another.
183
- *
184
- * @param a The minuend NonZeroFiniteNumber.
185
- * @param b The subtrahend NonZeroFiniteNumber.
186
- * @returns `a - b` as a NonZeroFiniteNumber.
187
- */
188
- sub,
189
-
190
170
  /**
191
171
  * Multiplies two NonZeroFiniteNumber values.
192
172
  *
@@ -199,6 +179,10 @@ export const NonZeroFiniteNumber = {
199
179
  /**
200
180
  * Divides one NonZeroFiniteNumber by another.
201
181
  *
182
+ * Exact (non-flooring) division of two non-zero finite numbers is always
183
+ * non-zero, so this stays closed. For the non-closed operations (`add`/`sub`,
184
+ * whose result may be `0`) use {@link Num.add}/{@link Num.sub}.
185
+ *
202
186
  * @param a The dividend NonZeroFiniteNumber.
203
187
  * @param b The divisor NonZeroFiniteNumber.
204
188
  * @returns `a / b` as a NonZeroFiniteNumber.
@@ -213,10 +197,18 @@ expectType<
213
197
 
214
198
  expectType<
215
199
  keyof typeof NonZeroFiniteNumber,
216
- keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<ElementType, never>
200
+ keyof TsDataForgeInternals.RefinedNumberUtils.NumberClass<
201
+ ElementType,
202
+ never,
203
+ 'div' | 'mul'
204
+ >
217
205
  >('=');
218
206
 
219
207
  expectType<
220
208
  typeof NonZeroFiniteNumber,
221
- TsDataForgeInternals.RefinedNumberUtils.NumberClass<ElementType, never>
209
+ TsDataForgeInternals.RefinedNumberUtils.NumberClass<
210
+ ElementType,
211
+ never,
212
+ 'div' | 'mul'
213
+ >
222
214
  >('<=');
@@ -146,18 +146,6 @@ describe('NonZeroFiniteNumber test', () => {
146
146
  expect(NonZeroFiniteNumber.round(c)).toBe(-3);
147
147
  });
148
148
 
149
- test('add', () => {
150
- expect(NonZeroFiniteNumber.add(a, b)).toBe(8);
151
-
152
- expect(NonZeroFiniteNumber.add(a, c)).toBe(2);
153
- });
154
-
155
- test('sub', () => {
156
- expect(NonZeroFiniteNumber.sub(a, b)).toBe(3);
157
-
158
- expect(NonZeroFiniteNumber.sub(a, c)).toBe(9);
159
- });
160
-
161
149
  test('mul', () => {
162
150
  expect(NonZeroFiniteNumber.mul(a, b)).toBe(13.75);
163
151
 
@@ -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),