ts-data-forge 14.6.1 → 14.6.2

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 (393) hide show
  1. package/dist/array/impl/array-utils-creation.mjs +126 -26
  2. package/dist/array/impl/array-utils-creation.mjs.map +1 -1
  3. package/dist/array/impl/array-utils-element-access.mjs +63 -30
  4. package/dist/array/impl/array-utils-element-access.mjs.map +1 -1
  5. package/dist/array/impl/array-utils-iterators.mjs +69 -53
  6. package/dist/array/impl/array-utils-iterators.mjs.map +1 -1
  7. package/dist/array/impl/array-utils-length-bounded-array-cast.mjs +109 -73
  8. package/dist/array/impl/array-utils-length-bounded-array-cast.mjs.map +1 -1
  9. package/dist/array/impl/array-utils-length-bounded-array-guard.mjs +71 -33
  10. package/dist/array/impl/array-utils-length-bounded-array-guard.mjs.map +1 -1
  11. package/dist/array/impl/array-utils-length-bounded-tuple-cast.mjs +102 -73
  12. package/dist/array/impl/array-utils-length-bounded-tuple-cast.mjs.map +1 -1
  13. package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs +77 -33
  14. package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs.map +1 -1
  15. package/dist/array/impl/array-utils-modification.mjs +75 -122
  16. package/dist/array/impl/array-utils-modification.mjs.map +1 -1
  17. package/dist/array/impl/array-utils-reducing-value.mjs +100 -150
  18. package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
  19. package/dist/array/impl/array-utils-search.mjs +110 -134
  20. package/dist/array/impl/array-utils-search.mjs.map +1 -1
  21. package/dist/array/impl/array-utils-set-op.mjs +146 -38
  22. package/dist/array/impl/array-utils-set-op.mjs.map +1 -1
  23. package/dist/array/impl/array-utils-size.mjs +10 -8
  24. package/dist/array/impl/array-utils-size.mjs.map +1 -1
  25. package/dist/array/impl/array-utils-slice-clamped.mjs +13 -50
  26. package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
  27. package/dist/array/impl/array-utils-slicing.mjs +94 -78
  28. package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
  29. package/dist/array/impl/array-utils-transformation.mjs +291 -199
  30. package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
  31. package/dist/array/impl/array-utils-validation.mjs +54 -56
  32. package/dist/array/impl/array-utils-validation.mjs.map +1 -1
  33. package/dist/array/impl/index.mjs +17 -17
  34. package/dist/array/impl/index.mjs.map +1 -1
  35. package/dist/array/index.mjs +2 -3
  36. package/dist/array/index.mjs.map +1 -1
  37. package/dist/collections/imap-mapped.mjs +335 -292
  38. package/dist/collections/imap-mapped.mjs.map +1 -1
  39. package/dist/collections/imap.mjs +280 -239
  40. package/dist/collections/imap.mjs.map +1 -1
  41. package/dist/collections/index.mjs +7 -7
  42. package/dist/collections/index.mjs.map +1 -1
  43. package/dist/collections/iset-mapped.mjs +448 -265
  44. package/dist/collections/iset-mapped.mjs.map +1 -1
  45. package/dist/collections/iset.mjs +328 -201
  46. package/dist/collections/iset.mjs.map +1 -1
  47. package/dist/collections/queue.mjs +183 -151
  48. package/dist/collections/queue.mjs.map +1 -1
  49. package/dist/collections/stack.mjs +169 -140
  50. package/dist/collections/stack.mjs.map +1 -1
  51. package/dist/entry-point.mjs +4 -77
  52. package/dist/entry-point.mjs.map +1 -1
  53. package/dist/expect-type.mjs +70 -4
  54. package/dist/expect-type.mjs.map +1 -1
  55. package/dist/functional/async-result/async-result.mjs +2 -3
  56. package/dist/functional/async-result/async-result.mjs.map +1 -1
  57. package/dist/functional/async-result/impl/async-result-flat-map.mjs +19 -21
  58. package/dist/functional/async-result/impl/async-result-flat-map.mjs.map +1 -1
  59. package/dist/functional/async-result/impl/async-result-from-promise.mjs +9 -10
  60. package/dist/functional/async-result/impl/async-result-from-promise.mjs.map +1 -1
  61. package/dist/functional/async-result/impl/async-result-from-throwable.mjs +12 -14
  62. package/dist/functional/async-result/impl/async-result-from-throwable.mjs.map +1 -1
  63. package/dist/functional/async-result/impl/async-result-map-err.mjs +16 -19
  64. package/dist/functional/async-result/impl/async-result-map-err.mjs.map +1 -1
  65. package/dist/functional/async-result/impl/async-result-map.mjs +16 -19
  66. package/dist/functional/async-result/impl/async-result-map.mjs.map +1 -1
  67. package/dist/functional/async-result/impl/async-result-unwrap-or.mjs +36 -9
  68. package/dist/functional/async-result/impl/async-result-unwrap-or.mjs.map +1 -1
  69. package/dist/functional/async-result/impl/index.mjs +8 -7
  70. package/dist/functional/async-result/impl/index.mjs.map +1 -1
  71. package/dist/functional/async-result/impl/types.mjs +2 -2
  72. package/dist/functional/async-result/impl/types.mjs.map +1 -1
  73. package/dist/functional/async-result/index.mjs +2 -3
  74. package/dist/functional/async-result/index.mjs.map +1 -1
  75. package/dist/functional/index.mjs +7 -11
  76. package/dist/functional/index.mjs.map +1 -1
  77. package/dist/functional/match.mjs +27 -13
  78. package/dist/functional/match.mjs.map +1 -1
  79. package/dist/functional/optional/impl/index.mjs +19 -18
  80. package/dist/functional/optional/impl/index.mjs.map +1 -1
  81. package/dist/functional/optional/impl/optional-expect-to-be.mjs +16 -18
  82. package/dist/functional/optional/impl/optional-expect-to-be.mjs.map +1 -1
  83. package/dist/functional/optional/impl/optional-filter.mjs +17 -19
  84. package/dist/functional/optional/impl/optional-filter.mjs.map +1 -1
  85. package/dist/functional/optional/impl/optional-flat-map.mjs +13 -15
  86. package/dist/functional/optional/impl/optional-flat-map.mjs.map +1 -1
  87. package/dist/functional/optional/impl/optional-from-nullable.mjs +26 -5
  88. package/dist/functional/optional/impl/optional-from-nullable.mjs.map +1 -1
  89. package/dist/functional/optional/impl/optional-is-none.mjs +21 -5
  90. package/dist/functional/optional/impl/optional-is-none.mjs.map +1 -1
  91. package/dist/functional/optional/impl/optional-is-optional.mjs +26 -8
  92. package/dist/functional/optional/impl/optional-is-optional.mjs.map +1 -1
  93. package/dist/functional/optional/impl/optional-is-some.mjs +22 -5
  94. package/dist/functional/optional/impl/optional-is-some.mjs.map +1 -1
  95. package/dist/functional/optional/impl/optional-map.mjs +16 -18
  96. package/dist/functional/optional/impl/optional-map.mjs.map +1 -1
  97. package/dist/functional/optional/impl/optional-match.mjs +16 -18
  98. package/dist/functional/optional/impl/optional-match.mjs.map +1 -1
  99. package/dist/functional/optional/impl/optional-none.mjs +18 -5
  100. package/dist/functional/optional/impl/optional-none.mjs.map +1 -1
  101. package/dist/functional/optional/impl/optional-or-else.mjs +13 -15
  102. package/dist/functional/optional/impl/optional-or-else.mjs.map +1 -1
  103. package/dist/functional/optional/impl/optional-some.mjs +23 -7
  104. package/dist/functional/optional/impl/optional-some.mjs.map +1 -1
  105. package/dist/functional/optional/impl/optional-to-nullable.mjs +28 -5
  106. package/dist/functional/optional/impl/optional-to-nullable.mjs.map +1 -1
  107. package/dist/functional/optional/impl/optional-unwrap-or.mjs +12 -14
  108. package/dist/functional/optional/impl/optional-unwrap-or.mjs.map +1 -1
  109. package/dist/functional/optional/impl/optional-unwrap-throw.mjs +34 -9
  110. package/dist/functional/optional/impl/optional-unwrap-throw.mjs.map +1 -1
  111. package/dist/functional/optional/impl/optional-unwrap.mjs +6 -9
  112. package/dist/functional/optional/impl/optional-unwrap.mjs.map +1 -1
  113. package/dist/functional/optional/impl/optional-zip.mjs +36 -5
  114. package/dist/functional/optional/impl/optional-zip.mjs.map +1 -1
  115. package/dist/functional/optional/impl/tag.mjs +4 -5
  116. package/dist/functional/optional/impl/tag.mjs.map +1 -1
  117. package/dist/functional/optional/impl/types.mjs +2 -2
  118. package/dist/functional/optional/impl/types.mjs.map +1 -1
  119. package/dist/functional/optional/index.mjs +2 -3
  120. package/dist/functional/optional/index.mjs.map +1 -1
  121. package/dist/functional/optional/optional.mjs +2 -3
  122. package/dist/functional/optional/optional.mjs.map +1 -1
  123. package/dist/functional/pipe.mjs +42 -14
  124. package/dist/functional/pipe.mjs.map +1 -1
  125. package/dist/functional/result/impl/index.mjs +28 -27
  126. package/dist/functional/result/impl/index.mjs.map +1 -1
  127. package/dist/functional/result/impl/result-err.mjs +29 -7
  128. package/dist/functional/result/impl/result-err.mjs.map +1 -1
  129. package/dist/functional/result/impl/result-expect-to-be.mjs +17 -18
  130. package/dist/functional/result/impl/result-expect-to-be.mjs.map +1 -1
  131. package/dist/functional/result/impl/result-flat-map.mjs +18 -21
  132. package/dist/functional/result/impl/result-flat-map.mjs.map +1 -1
  133. package/dist/functional/result/impl/result-fold.mjs +18 -21
  134. package/dist/functional/result/impl/result-fold.mjs.map +1 -1
  135. package/dist/functional/result/impl/result-from-optional.mjs +17 -20
  136. package/dist/functional/result/impl/result-from-optional.mjs.map +1 -1
  137. package/dist/functional/result/impl/result-from-promise.mjs +37 -8
  138. package/dist/functional/result/impl/result-from-promise.mjs.map +1 -1
  139. package/dist/functional/result/impl/result-from-throwable.mjs +41 -14
  140. package/dist/functional/result/impl/result-from-throwable.mjs.map +1 -1
  141. package/dist/functional/result/impl/result-is-err.mjs +21 -5
  142. package/dist/functional/result/impl/result-is-err.mjs.map +1 -1
  143. package/dist/functional/result/impl/result-is-ok.mjs +21 -5
  144. package/dist/functional/result/impl/result-is-ok.mjs.map +1 -1
  145. package/dist/functional/result/impl/result-is-result.mjs +25 -7
  146. package/dist/functional/result/impl/result-is-result.mjs.map +1 -1
  147. package/dist/functional/result/impl/result-map-err.mjs +18 -21
  148. package/dist/functional/result/impl/result-map-err.mjs.map +1 -1
  149. package/dist/functional/result/impl/result-map.mjs +18 -21
  150. package/dist/functional/result/impl/result-map.mjs.map +1 -1
  151. package/dist/functional/result/impl/result-match.mjs +17 -21
  152. package/dist/functional/result/impl/result-match.mjs.map +1 -1
  153. package/dist/functional/result/impl/result-ok.mjs +29 -7
  154. package/dist/functional/result/impl/result-ok.mjs.map +1 -1
  155. package/dist/functional/result/impl/result-or-else.mjs +14 -15
  156. package/dist/functional/result/impl/result-or-else.mjs.map +1 -1
  157. package/dist/functional/result/impl/result-safe-try.mjs +32 -21
  158. package/dist/functional/result/impl/result-safe-try.mjs.map +1 -1
  159. package/dist/functional/result/impl/result-safe-unwrap.mjs +40 -12
  160. package/dist/functional/result/impl/result-safe-unwrap.mjs.map +1 -1
  161. package/dist/functional/result/impl/result-swap.mjs +23 -8
  162. package/dist/functional/result/impl/result-swap.mjs.map +1 -1
  163. package/dist/functional/result/impl/result-to-optional.mjs +30 -7
  164. package/dist/functional/result/impl/result-to-optional.mjs.map +1 -1
  165. package/dist/functional/result/impl/result-unwrap-err-or.mjs +13 -14
  166. package/dist/functional/result/impl/result-unwrap-err-or.mjs.map +1 -1
  167. package/dist/functional/result/impl/result-unwrap-err-throw.mjs +43 -20
  168. package/dist/functional/result/impl/result-unwrap-err-throw.mjs.map +1 -1
  169. package/dist/functional/result/impl/result-unwrap-err.mjs +33 -8
  170. package/dist/functional/result/impl/result-unwrap-err.mjs.map +1 -1
  171. package/dist/functional/result/impl/result-unwrap-ok-or.mjs +13 -14
  172. package/dist/functional/result/impl/result-unwrap-ok-or.mjs.map +1 -1
  173. package/dist/functional/result/impl/result-unwrap-ok.mjs +6 -9
  174. package/dist/functional/result/impl/result-unwrap-ok.mjs.map +1 -1
  175. package/dist/functional/result/impl/result-unwrap-throw.mjs +38 -11
  176. package/dist/functional/result/impl/result-unwrap-throw.mjs.map +1 -1
  177. package/dist/functional/result/impl/result-zip.mjs +35 -5
  178. package/dist/functional/result/impl/result-zip.mjs.map +1 -1
  179. package/dist/functional/result/impl/tag.mjs +4 -5
  180. package/dist/functional/result/impl/tag.mjs.map +1 -1
  181. package/dist/functional/result/impl/types.mjs +2 -2
  182. package/dist/functional/result/impl/types.mjs.map +1 -1
  183. package/dist/functional/result/index.mjs +2 -3
  184. package/dist/functional/result/index.mjs.map +1 -1
  185. package/dist/functional/result/result.mjs +2 -3
  186. package/dist/functional/result/result.mjs.map +1 -1
  187. package/dist/functional/ternary-result/impl/index.mjs +29 -28
  188. package/dist/functional/ternary-result/impl/index.mjs.map +1 -1
  189. package/dist/functional/ternary-result/impl/tag.mjs +6 -6
  190. package/dist/functional/ternary-result/impl/tag.mjs.map +1 -1
  191. package/dist/functional/ternary-result/impl/ternary-result-err.mjs +17 -7
  192. package/dist/functional/ternary-result/impl/ternary-result-err.mjs.map +1 -1
  193. package/dist/functional/ternary-result/impl/ternary-result-expect-to-be.mjs +15 -18
  194. package/dist/functional/ternary-result/impl/ternary-result-expect-to-be.mjs.map +1 -1
  195. package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs +28 -32
  196. package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs.map +1 -1
  197. package/dist/functional/ternary-result/impl/ternary-result-fold.mjs +24 -26
  198. package/dist/functional/ternary-result/impl/ternary-result-fold.mjs.map +1 -1
  199. package/dist/functional/ternary-result/impl/ternary-result-from-promise.mjs +21 -8
  200. package/dist/functional/ternary-result/impl/ternary-result-from-promise.mjs.map +1 -1
  201. package/dist/functional/ternary-result/impl/ternary-result-from-throwable.mjs +28 -13
  202. package/dist/functional/ternary-result/impl/ternary-result-from-throwable.mjs.map +1 -1
  203. package/dist/functional/ternary-result/impl/ternary-result-is-err.mjs +19 -5
  204. package/dist/functional/ternary-result/impl/ternary-result-is-err.mjs.map +1 -1
  205. package/dist/functional/ternary-result/impl/ternary-result-is-ok.mjs +21 -5
  206. package/dist/functional/ternary-result/impl/ternary-result-is-ok.mjs.map +1 -1
  207. package/dist/functional/ternary-result/impl/ternary-result-is-ternary-result.mjs +28 -8
  208. package/dist/functional/ternary-result/impl/ternary-result-is-ternary-result.mjs.map +1 -1
  209. package/dist/functional/ternary-result/impl/ternary-result-is-warn.mjs +20 -5
  210. package/dist/functional/ternary-result/impl/ternary-result-is-warn.mjs.map +1 -1
  211. package/dist/functional/ternary-result/impl/ternary-result-map-err.mjs +17 -18
  212. package/dist/functional/ternary-result/impl/ternary-result-map-err.mjs.map +1 -1
  213. package/dist/functional/ternary-result/impl/ternary-result-map-warn.mjs +20 -23
  214. package/dist/functional/ternary-result/impl/ternary-result-map-warn.mjs.map +1 -1
  215. package/dist/functional/ternary-result/impl/ternary-result-map.mjs +24 -26
  216. package/dist/functional/ternary-result/impl/ternary-result-map.mjs.map +1 -1
  217. package/dist/functional/ternary-result/impl/ternary-result-ok.mjs +18 -7
  218. package/dist/functional/ternary-result/impl/ternary-result-ok.mjs.map +1 -1
  219. package/dist/functional/ternary-result/impl/ternary-result-or-else.mjs +11 -14
  220. package/dist/functional/ternary-result/impl/ternary-result-or-else.mjs.map +1 -1
  221. package/dist/functional/ternary-result/impl/ternary-result-to-optional.mjs +24 -10
  222. package/dist/functional/ternary-result/impl/ternary-result-to-optional.mjs.map +1 -1
  223. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-or.mjs +11 -14
  224. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-or.mjs.map +1 -1
  225. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-throw.mjs +30 -19
  226. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-throw.mjs.map +1 -1
  227. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err.mjs +20 -8
  228. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err.mjs.map +1 -1
  229. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok-or.mjs +11 -14
  230. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok-or.mjs.map +1 -1
  231. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok.mjs +7 -9
  232. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok.mjs.map +1 -1
  233. package/dist/functional/ternary-result/impl/ternary-result-unwrap-throw.mjs +30 -22
  234. package/dist/functional/ternary-result/impl/ternary-result-unwrap-throw.mjs.map +1 -1
  235. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-or.mjs +11 -14
  236. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-or.mjs.map +1 -1
  237. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-throw.mjs +27 -17
  238. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-throw.mjs.map +1 -1
  239. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn.mjs +20 -8
  240. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn.mjs.map +1 -1
  241. package/dist/functional/ternary-result/impl/ternary-result-warn.mjs +21 -8
  242. package/dist/functional/ternary-result/impl/ternary-result-warn.mjs.map +1 -1
  243. package/dist/functional/ternary-result/impl/ternary-result-zip.mjs +47 -19
  244. package/dist/functional/ternary-result/impl/ternary-result-zip.mjs.map +1 -1
  245. package/dist/functional/ternary-result/impl/types.mjs +2 -2
  246. package/dist/functional/ternary-result/impl/types.mjs.map +1 -1
  247. package/dist/functional/ternary-result/impl/variant-name.mjs +12 -14
  248. package/dist/functional/ternary-result/impl/variant-name.mjs.map +1 -1
  249. package/dist/functional/ternary-result/index.mjs +2 -3
  250. package/dist/functional/ternary-result/index.mjs.map +1 -1
  251. package/dist/functional/ternary-result/ternary-result.mjs +2 -3
  252. package/dist/functional/ternary-result/ternary-result.mjs.map +1 -1
  253. package/dist/guard/has-key.mjs +43 -4
  254. package/dist/guard/has-key.mjs.map +1 -1
  255. package/dist/guard/index.mjs +8 -8
  256. package/dist/guard/index.mjs.map +1 -1
  257. package/dist/guard/is-non-empty-string.mjs +39 -4
  258. package/dist/guard/is-non-empty-string.mjs.map +1 -1
  259. package/dist/guard/is-non-null-object.mjs +36 -4
  260. package/dist/guard/is-non-null-object.mjs.map +1 -1
  261. package/dist/guard/is-primitive.mjs +46 -15
  262. package/dist/guard/is-primitive.mjs.map +1 -1
  263. package/dist/guard/is-record.mjs +89 -6
  264. package/dist/guard/is-record.mjs.map +1 -1
  265. package/dist/guard/is-type.mjs +404 -19
  266. package/dist/guard/is-type.mjs.map +1 -1
  267. package/dist/guard/key-is-in.mjs +42 -4
  268. package/dist/guard/key-is-in.mjs.map +1 -1
  269. package/dist/index.mjs +12 -65
  270. package/dist/index.mjs.map +1 -1
  271. package/dist/iterator/index.mjs +2 -2
  272. package/dist/iterator/index.mjs.map +1 -1
  273. package/dist/iterator/range.mjs +19 -57
  274. package/dist/iterator/range.mjs.map +1 -1
  275. package/dist/json/index.mjs +2 -2
  276. package/dist/json/index.mjs.map +1 -1
  277. package/dist/json/json.mjs +346 -105
  278. package/dist/json/json.mjs.map +1 -1
  279. package/dist/number/branded-types/finite-number.mjs +148 -137
  280. package/dist/number/branded-types/finite-number.mjs.map +1 -1
  281. package/dist/number/branded-types/index.mjs +33 -33
  282. package/dist/number/branded-types/index.mjs.map +1 -1
  283. package/dist/number/branded-types/int.mjs +245 -209
  284. package/dist/number/branded-types/int.mjs.map +1 -1
  285. package/dist/number/branded-types/int16.mjs +141 -131
  286. package/dist/number/branded-types/int16.mjs.map +1 -1
  287. package/dist/number/branded-types/int32.mjs +141 -131
  288. package/dist/number/branded-types/int32.mjs.map +1 -1
  289. package/dist/number/branded-types/negative-finite-number.mjs +155 -149
  290. package/dist/number/branded-types/negative-finite-number.mjs.map +1 -1
  291. package/dist/number/branded-types/negative-int.mjs +125 -110
  292. package/dist/number/branded-types/negative-int.mjs.map +1 -1
  293. package/dist/number/branded-types/negative-safe-int.mjs +126 -115
  294. package/dist/number/branded-types/negative-safe-int.mjs.map +1 -1
  295. package/dist/number/branded-types/non-negative-finite-number.mjs +164 -154
  296. package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
  297. package/dist/number/branded-types/non-negative-int16.mjs +137 -125
  298. package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
  299. package/dist/number/branded-types/non-negative-int32.mjs +137 -125
  300. package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
  301. package/dist/number/branded-types/non-positive-finite-number.mjs +143 -139
  302. package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -1
  303. package/dist/number/branded-types/non-positive-int.mjs +116 -99
  304. package/dist/number/branded-types/non-positive-int.mjs.map +1 -1
  305. package/dist/number/branded-types/non-positive-safe-int.mjs +118 -107
  306. package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -1
  307. package/dist/number/branded-types/non-zero-finite-number.mjs +144 -129
  308. package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
  309. package/dist/number/branded-types/non-zero-int.mjs +102 -82
  310. package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
  311. package/dist/number/branded-types/non-zero-int16.mjs +118 -105
  312. package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
  313. package/dist/number/branded-types/non-zero-int32.mjs +118 -105
  314. package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
  315. package/dist/number/branded-types/non-zero-safe-int.mjs +122 -108
  316. package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
  317. package/dist/number/branded-types/non-zero-uint16.mjs +118 -104
  318. package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
  319. package/dist/number/branded-types/non-zero-uint32.mjs +118 -104
  320. package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
  321. package/dist/number/branded-types/positive-finite-number.mjs +167 -160
  322. package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
  323. package/dist/number/branded-types/positive-int.mjs +260 -224
  324. package/dist/number/branded-types/positive-int.mjs.map +1 -1
  325. package/dist/number/branded-types/positive-int16.mjs +134 -122
  326. package/dist/number/branded-types/positive-int16.mjs.map +1 -1
  327. package/dist/number/branded-types/positive-int32.mjs +134 -122
  328. package/dist/number/branded-types/positive-int32.mjs.map +1 -1
  329. package/dist/number/branded-types/positive-safe-int.mjs +292 -258
  330. package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
  331. package/dist/number/branded-types/positive-uint16.mjs +134 -122
  332. package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
  333. package/dist/number/branded-types/positive-uint32.mjs +134 -122
  334. package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
  335. package/dist/number/branded-types/safe-int.mjs +284 -255
  336. package/dist/number/branded-types/safe-int.mjs.map +1 -1
  337. package/dist/number/branded-types/safe-uint.mjs +135 -124
  338. package/dist/number/branded-types/safe-uint.mjs.map +1 -1
  339. package/dist/number/branded-types/uint.mjs +248 -211
  340. package/dist/number/branded-types/uint.mjs.map +1 -1
  341. package/dist/number/branded-types/uint16.mjs +132 -121
  342. package/dist/number/branded-types/uint16.mjs.map +1 -1
  343. package/dist/number/branded-types/uint32.mjs +132 -121
  344. package/dist/number/branded-types/uint32.mjs.map +1 -1
  345. package/dist/number/enum/index.mjs +3 -3
  346. package/dist/number/enum/index.mjs.map +1 -1
  347. package/dist/number/enum/int8.mjs +146 -131
  348. package/dist/number/enum/int8.mjs.map +1 -1
  349. package/dist/number/enum/uint8.mjs +133 -119
  350. package/dist/number/enum/uint8.mjs.map +1 -1
  351. package/dist/number/index.mjs +6 -37
  352. package/dist/number/index.mjs.map +1 -1
  353. package/dist/number/num-arithmetic-types.mjs +42 -1
  354. package/dist/number/num-arithmetic-types.mjs.map +1 -1
  355. package/dist/number/num.mjs +541 -83
  356. package/dist/number/num.mjs.map +1 -1
  357. package/dist/number/refined-number-utils.mjs +294 -133
  358. package/dist/number/refined-number-utils.mjs.map +1 -1
  359. package/dist/object/index.mjs +2 -2
  360. package/dist/object/index.mjs.map +1 -1
  361. package/dist/object/object.mjs +355 -202
  362. package/dist/object/object.mjs.map +1 -1
  363. package/dist/others/cast-mutable.mjs +38 -11
  364. package/dist/others/cast-mutable.mjs.map +1 -1
  365. package/dist/others/cast-readonly.mjs +37 -11
  366. package/dist/others/cast-readonly.mjs.map +1 -1
  367. package/dist/others/debounce-function.mjs +22 -11
  368. package/dist/others/debounce-function.mjs.map +1 -1
  369. package/dist/others/fast-deep-equal.mjs +70 -51
  370. package/dist/others/fast-deep-equal.mjs.map +1 -1
  371. package/dist/others/if-then.mjs +32 -5
  372. package/dist/others/if-then.mjs.map +1 -1
  373. package/dist/others/index.mjs +10 -10
  374. package/dist/others/index.mjs.map +1 -1
  375. package/dist/others/map-nullable.mjs +11 -13
  376. package/dist/others/map-nullable.mjs.map +1 -1
  377. package/dist/others/memoize-function.mjs +14 -16
  378. package/dist/others/memoize-function.mjs.map +1 -1
  379. package/dist/others/tuple.mjs +52 -4
  380. package/dist/others/tuple.mjs.map +1 -1
  381. package/dist/others/unknown-to-string.mjs +91 -47
  382. package/dist/others/unknown-to-string.mjs.map +1 -1
  383. package/dist/promise/index.mjs +2 -2
  384. package/dist/promise/index.mjs.map +1 -1
  385. package/dist/promise/promise.mjs +51 -10
  386. package/dist/promise/promise.mjs.map +1 -1
  387. package/dist/string/index.mjs +2 -2
  388. package/dist/string/index.mjs.map +1 -1
  389. package/dist/string/str.mjs +250 -83
  390. package/dist/string/str.mjs.map +1 -1
  391. package/dist/types.mjs +3 -2
  392. package/dist/types.mjs.map +1 -1
  393. package/package.json +5 -6
@@ -1,93 +1,551 @@
1
- import { err } from '../functional/result/impl/result-err.mjs';
2
- import { ok } from '../functional/result/impl/result-ok.mjs';
3
- import '@sindresorhus/is';
4
1
 
5
- var Num;
6
- ((Num2) => {
7
- Num2.from = Number;
8
- Num2.safeParseInt = (s) => {
9
- const viaNumber = Number(s);
10
- return Number.isNaN(viaNumber) || Number.isNaN(Number.parseInt(s, 10)) ? err(
11
- new Error(`safeParseInt: "${s}" is not a valid base-10 integer`)
12
- ) : (
13
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
14
- ok(Math.trunc(viaNumber))
15
- );
16
- };
17
- Num2.safeParseFloat = (s) => {
18
- const viaNumber = Number(s);
19
- return Number.isNaN(viaNumber) || !Number.isFinite(viaNumber) || Number.isNaN(Number.parseFloat(s)) ? err(
20
- new Error(`safeParseFloat: "${s}" is not a valid finite number`)
21
- ) : (
22
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
23
- ok(viaNumber)
24
- );
25
- };
26
- Num2.isNonZero = (num) => num !== 0;
27
- Num2.isNonNegative = (num) => num >= 0;
28
- Num2.isPositive = (num) => num > 0;
29
- Num2.isInRange = (lowerBound, upperBound) => (x) => lowerBound <= x && x < upperBound;
30
- Num2.isInRangeInclusive = (lowerBound, upperBound) => (x) => lowerBound <= x && x <= upperBound;
31
- Num2.isUintInRange = (lowerBound, upperBound) => (x) => Number.isSafeInteger(x) && lowerBound <= x && x < upperBound;
32
- Num2.isUintInRangeInclusive = (lowerBound, upperBound) => (x) => Number.isSafeInteger(x) && lowerBound <= x && x <= upperBound;
33
- function clamp(...args) {
34
- switch (args.length) {
35
- case 3: {
36
- const [target, lowerBound, upperBound] = args;
37
- return !Number.isFinite(target) ? lowerBound : Math.max(lowerBound, Math.min(upperBound, target));
38
- }
39
- case 2: {
40
- const [lowerBound, upperBound] = args;
41
- return (target) => clamp(target, lowerBound, upperBound);
42
- }
2
+ import { Result } from '../functional/index.mjs';
3
+ /**
4
+ * Namespace providing utility functions for number manipulation and validation.
5
+ *
6
+ * This namespace offers a comprehensive set of type-safe number utilities
7
+ * including:
8
+ *
9
+ * - Type conversion and validation
10
+ * - Type guards for numeric constraints (non-zero, non-negative, positive)
11
+ * - Range checking and clamping operations
12
+ * - Mathematical operations with type safety
13
+ * - Rounding utilities
14
+ *
15
+ * Many functions in this namespace leverage TypeScript's type system to provide
16
+ * compile-time guarantees about numeric constraints.
17
+ */
18
+ export var Num;
19
+ (function (Num) {
20
+ /**
21
+ * Converts an unknown value to a number. Alias for the `Number` constructor.
22
+ *
23
+ * @example
24
+ *
25
+ * ```ts
26
+ * const input = '123.45';
27
+ *
28
+ * const result = Num.from(input);
29
+ *
30
+ * assert.isTrue(result === 123.45);
31
+ * ```
32
+ *
33
+ * @param n The value to convert.
34
+ * @returns The numeric representation of `n`.
35
+ */
36
+ Num.from = Number;
37
+ /**
38
+ * Safely parses a base-10 integer from a string, returning a {@link Result}
39
+ * that is `Ok<Int>` for valid input and `Err<Error>` otherwise.
40
+ *
41
+ * This is a stricter alternative to both `parseInt` and `Number`:
42
+ *
43
+ * - Unlike `parseInt('12abc', 10)` (which returns `12`), trailing
44
+ * non-numeric characters make the whole input invalid and yield `Err`.
45
+ * - Unlike `Number('')` / `Number(' ')` (which return `0`), empty or
46
+ * whitespace-only input yields `Err`.
47
+ *
48
+ * The empty-string case is rejected by delegating to `parseInt` (which
49
+ * returns `NaN` there) rather than hard-coding a check, while the trailing-
50
+ * garbage case is rejected via `Number`. Valid input is truncated toward
51
+ * zero, so `'12.9'` becomes `12` and `'-3.5'` becomes `-3`.
52
+ *
53
+ * Only base 10 is supported. Use `Result.unwrapOk` (optionally with a
54
+ * `?? Number.NaN` fallback) or `Result.unwrapOkOr` to get a plain number
55
+ * back.
56
+ *
57
+ * @example
58
+ *
59
+ * ```ts
60
+ * assert.strictEqual(
61
+ * Result.unwrapOkOr(Num.safeParseInt('123'), Number.NaN),
62
+ * 123,
63
+ * );
64
+ *
65
+ * assert.strictEqual(
66
+ * Result.unwrapOkOr(Num.safeParseInt('12.9'), Number.NaN),
67
+ * 12,
68
+ * );
69
+ *
70
+ * assert.strictEqual(
71
+ * Result.unwrapOkOr(Num.safeParseInt('-12.9'), Number.NaN),
72
+ * -12,
73
+ * );
74
+ *
75
+ * assert.strictEqual(Number.parseInt('-12.9', 10), -12);
76
+ *
77
+ * // Native `parseInt` ignores trailing non-numeric characters
78
+ *
79
+ * assert.strictEqual(Number.parseInt('123abc', 10), 123);
80
+ *
81
+ * assert.isTrue(Number.isNaN(Number('123abc')));
82
+ *
83
+ * assert.isTrue(Result.isErr(Num.safeParseInt('123abc')));
84
+ *
85
+ * // Whitespace is not a valid integer, so we return an error instead of coercing to 0.
86
+ *
87
+ * assert.isTrue(Number.isNaN(Number.parseInt(' ', 10)));
88
+ *
89
+ * assert.strictEqual(Number(' '), 0); // Native `Number` coerces whitespace to 0
90
+ *
91
+ * assert.isTrue(Result.isErr(Num.safeParseInt('')));
92
+ *
93
+ * assert.strictEqual(Result.unwrapOk(Num.safeParseInt(' ')), undefined);
94
+ * ```
95
+ *
96
+ * @param s The string to parse.
97
+ * @returns `Result.ok(parsedInt)` for valid input, otherwise `Result.err`
98
+ * wrapping an `Error` describing the invalid input.
99
+ */
100
+ Num.safeParseInt = (s) => {
101
+ const viaNumber = Number(s);
102
+ // `Number('')` / `Number(' ')` は 0 を返すが、`parseInt` は NaN を返す。
103
+ // 末尾不正文字 ('12abc' 等) は `Number` 側が NaN にするので、両者が共に
104
+ // 有効な場合のみ採用することで空文字・空白のみ・末尾不正をまとめて弾く。
105
+ return Number.isNaN(viaNumber) || Number.isNaN(Number.parseInt(s, 10))
106
+ ? Result.err(new Error(`safeParseInt: "${s}" is not a valid base-10 integer`))
107
+ : // eslint-disable-next-line total-functions/no-unsafe-type-assertion
108
+ Result.ok(Math.trunc(viaNumber));
109
+ };
110
+ /**
111
+ * Safely parses a finite floating-point number from a string, returning a
112
+ * {@link Result} that is `Ok<FiniteNumber>` for valid input and `Err<Error>`
113
+ * otherwise.
114
+ *
115
+ * This is a stricter alternative to both `parseFloat` and `Number`:
116
+ *
117
+ * - Unlike `parseFloat('12abc')` (which returns `12`), trailing non-numeric
118
+ * characters make the whole input invalid and yield `Err`.
119
+ * - Unlike `Number('')` / `Number(' ')` (which return `0`), empty or
120
+ * whitespace-only input yields `Err`.
121
+ * - Unlike `Number('Infinity')` (which returns `Infinity`), non-finite values
122
+ * yield `Err`.
123
+ *
124
+ * The empty-string case is rejected by delegating to `parseFloat` (which
125
+ * returns `NaN` there) rather than hard-coding a check, while the trailing-
126
+ * garbage case is rejected via `Number`. Decimal values are preserved as-is,
127
+ * so `'12.9'` stays `12.9`.
128
+ *
129
+ * Use `Result.unwrapOk` (optionally with a `?? Number.NaN` fallback) or
130
+ * `Result.unwrapOkOr` to get a plain number back.
131
+ *
132
+ * @example
133
+ *
134
+ * ```ts
135
+ * assert.strictEqual(
136
+ * Result.unwrapOkOr(Num.safeParseFloat('12.9'), Number.NaN),
137
+ * 12.9,
138
+ * );
139
+ *
140
+ * assert.strictEqual(
141
+ * Result.unwrapOkOr(Num.safeParseFloat('-3.5'), Number.NaN),
142
+ * -3.5,
143
+ * );
144
+ *
145
+ * assert.strictEqual(
146
+ * Result.unwrapOkOr(Num.safeParseFloat('1e3'), Number.NaN),
147
+ * 1000,
148
+ * );
149
+ *
150
+ * // Native `parseFloat` ignores trailing non-numeric characters
151
+ *
152
+ * assert.strictEqual(Number.parseFloat('12px'), 12);
153
+ *
154
+ * assert.isTrue(Result.isErr(Num.safeParseFloat('12px')));
155
+ *
156
+ * // Whitespace is not a valid number, so we return an error instead of coercing to 0.
157
+ *
158
+ * assert.isTrue(Result.isErr(Num.safeParseFloat('')));
159
+ *
160
+ * assert.isTrue(Result.isErr(Num.safeParseFloat(' ')));
161
+ *
162
+ * // Infinity and NaN are not finite, so they are rejected.
163
+ *
164
+ * assert.isTrue(Result.isErr(Num.safeParseFloat('Infinity')));
165
+ *
166
+ * assert.isTrue(Result.isErr(Num.safeParseFloat('NaN')));
167
+ * ```
168
+ *
169
+ * @param s The string to parse.
170
+ * @returns `Result.ok(parsedFloat)` for valid finite input, otherwise
171
+ * `Result.err` wrapping an `Error` describing the invalid input.
172
+ */
173
+ Num.safeParseFloat = (s) => {
174
+ const viaNumber = Number(s);
175
+ // `Number('')` / `Number(' ')` は 0 を返すが、`parseFloat` は NaN を返す。
176
+ // 末尾不正文字 ('12abc' 等) は `Number` 側が NaN にするので、両者が共に
177
+ // 非 NaN かつ有限の場合のみ採用することで空文字・空白のみ・末尾不正・
178
+ // Infinity をまとめて弾く。
179
+ return Number.isNaN(viaNumber) ||
180
+ !Number.isFinite(viaNumber) ||
181
+ Number.isNaN(Number.parseFloat(s))
182
+ ? Result.err(new Error(`safeParseFloat: "${s}" is not a valid finite number`))
183
+ : // eslint-disable-next-line total-functions/no-unsafe-type-assertion
184
+ Result.ok(viaNumber);
185
+ };
186
+ /**
187
+ * Type guard that checks if a number is non-zero.
188
+ *
189
+ * When this function returns `true`, TypeScript narrows the type to exclude
190
+ * zero, providing compile-time safety for division operations and other
191
+ * calculations that require non-zero values.
192
+ *
193
+ * @example
194
+ *
195
+ * ```ts
196
+ * const value: number = 5;
197
+ *
198
+ * if (Num.isNonZero(value)) {
199
+ * // Safe to divide now that we know value is non-zero
200
+ * // eslint-disable-next-line total-functions/no-partial-division
201
+ * const inverted = 1 / value;
202
+ *
203
+ * assert.isTrue(inverted === 0.2);
204
+ * }
205
+ *
206
+ * assert.isFalse(Num.isNonZero(0));
207
+ * ```
208
+ *
209
+ * @template N - The numeric literal type or number type to check
210
+ * @param num - The number to check
211
+ * @returns `true` if the number is not zero, `false` otherwise
212
+ */
213
+ Num.isNonZero = (num) => num !== 0;
214
+
215
+ /**
216
+ * Type guard that checks if a number is non-negative (greater than or equal
217
+ * to zero).
218
+ *
219
+ * When this function returns `true`, TypeScript narrows the type to exclude
220
+ * negative values, which is useful for operations that require non-negative
221
+ * inputs like array indices or measurements.
222
+ *
223
+ * @example
224
+ *
225
+ * ```ts
226
+ * const candidate = 10;
227
+ *
228
+ * if (Num.isNonNegative(candidate)) {
229
+ * const index: number = candidate;
230
+ *
231
+ * assert.isTrue(index === 10);
232
+ * }
233
+ *
234
+ * assert.isFalse(Num.isNonNegative(-1));
235
+ * ```
236
+ *
237
+ * @template N - The numeric literal type or number type to check
238
+ * @param num - The number to check
239
+ * @returns `true` if the number is >= 0, `false` otherwise
240
+ */
241
+ Num.isNonNegative = (num) => num >= 0;
242
+ /**
243
+ * Type guard that checks if a number is positive (greater than zero).
244
+ *
245
+ * When this function returns `true`, TypeScript narrows the type to exclude
246
+ * zero and negative values. This is particularly useful for validating inputs
247
+ * that must be strictly positive, such as dimensions, counts, or rates.
248
+ *
249
+ * @example
250
+ *
251
+ * ```ts
252
+ * const amount = 42;
253
+ *
254
+ * if (Num.isPositive(amount)) {
255
+ * assert.isTrue(amount > 0);
256
+ * }
257
+ *
258
+ * assert.isFalse(Num.isPositive(0));
259
+ * ```
260
+ *
261
+ * @template N - The numeric literal type or number type to check
262
+ * @param num - The number to check
263
+ * @returns `true` if the number is > 0, `false` otherwise
264
+ */
265
+ Num.isPositive = (num) => num > 0;
266
+ /**
267
+ * Creates a function that checks if a number `x` is within the range
268
+ * `lowerBound <= x < upperBound`.
269
+ *
270
+ * @example
271
+ *
272
+ * ```ts
273
+ * const isGrade = Num.isInRange(0, 100);
274
+ *
275
+ * assert.isTrue(isGrade(50));
276
+ *
277
+ * assert.isFalse(isGrade(100));
278
+ * ```
279
+ *
280
+ * @param lowerBound The lower bound (inclusive).
281
+ * @param upperBound The upper bound (exclusive).
282
+ * @returns A function that takes a number `x` and returns `true` if `x` is in
283
+ * the range, `false` otherwise.
284
+ */
285
+ Num.isInRange = (lowerBound, upperBound) => (x) => lowerBound <= x && x < upperBound;
286
+ /**
287
+ * Creates a function that checks if a number `x` is within the range
288
+ * `lowerBound <= x <= upperBound`.
289
+ *
290
+ * @example
291
+ *
292
+ * ```ts
293
+ * const isPercentage = Num.isInRangeInclusive(0, 100);
294
+ *
295
+ * assert.isTrue(isPercentage(100));
296
+ *
297
+ * assert.isFalse(isPercentage(-1));
298
+ * ```
299
+ *
300
+ * @param lowerBound The lower bound (inclusive).
301
+ * @param upperBound The upper bound (inclusive).
302
+ * @returns A function that takes a number `x` and returns `true` if `x` is in
303
+ * the range, `false` otherwise.
304
+ */
305
+ Num.isInRangeInclusive = (lowerBound, upperBound) => (x) => lowerBound <= x && x <= upperBound;
306
+ /**
307
+ * Creates a type guard that checks if a number is an unsigned integer within
308
+ * a specified range.
309
+ *
310
+ * This function returns a predicate that validates whether a number is:
311
+ *
312
+ * - A safe integer (no floating point)
313
+ * - Within the range [lowerBound, upperBound)
314
+ *
315
+ * The returned type guard provides precise type narrowing when the bounds are
316
+ * SmallUint literals, making it ideal for array index validation.
317
+ *
318
+ * @example
319
+ *
320
+ * ```ts
321
+ * const indexGuard = Num.isUintInRange(0, 5);
322
+ *
323
+ * assert.isTrue(indexGuard(3));
324
+ *
325
+ * assert.isFalse(indexGuard(5));
326
+ *
327
+ * assert.isFalse(indexGuard(-1));
328
+ * ```
329
+ *
330
+ * @template L - The lower bound as a SmallUint literal type
331
+ * @template U - The upper bound as a SmallUint literal type
332
+ * @param lowerBound - The minimum value (inclusive)
333
+ * @param upperBound - The maximum value (exclusive)
334
+ * @returns A type guard function that validates and narrows number types
335
+ */
336
+ Num.isUintInRange = (lowerBound, upperBound) => (x) => Number.isSafeInteger(x) && lowerBound <= x && x < upperBound;
337
+ /**
338
+ * Creates a type guard that checks if a number is an unsigned integer within
339
+ * a specified inclusive range.
340
+ *
341
+ * This function returns a predicate that validates whether a number is:
342
+ *
343
+ * - A safe integer (no floating point)
344
+ * - Within the range [lowerBound, upperBound] (both bounds inclusive)
345
+ *
346
+ * The returned type guard provides precise type narrowing when the bounds are
347
+ * SmallUint literals, useful for validating scores, percentages, or other
348
+ * bounded values.
349
+ *
350
+ * @example
351
+ *
352
+ * ```ts
353
+ * const inclusiveGuard = Num.isUintInRangeInclusive(0, 5);
354
+ *
355
+ * assert.isTrue(inclusiveGuard(5));
356
+ *
357
+ * assert.isFalse(inclusiveGuard(6));
358
+ * ```
359
+ *
360
+ * @template L - The lower bound as a SmallUint literal type
361
+ * @template U - The upper bound as a SmallUint literal type
362
+ * @param lowerBound - The minimum value (inclusive)
363
+ * @param upperBound - The maximum value (inclusive)
364
+ * @returns A type guard function that validates and narrows number types
365
+ */
366
+ Num.isUintInRangeInclusive = (lowerBound, upperBound) => (x) => Number.isSafeInteger(x) && lowerBound <= x && x <= upperBound;
367
+ function clamp(...args) {
368
+ switch (args.length) {
369
+ case 3: {
370
+ const [target, lowerBound, upperBound] = args;
371
+ return !Number.isFinite(target)
372
+ ? lowerBound
373
+ : Math.max(lowerBound, Math.min(upperBound, target));
374
+ }
375
+ case 2: {
376
+ const [lowerBound, upperBound] = args;
377
+ return (target) => clamp(target, lowerBound, upperBound);
378
+ }
379
+ }
43
380
  }
44
- }
45
- Num2.clamp = clamp;
46
- Num2.add = (a, b) => (
381
+ Num.clamp = clamp;
382
+ /**
383
+ * Adds two numbers, returning the tightest sound branded result type.
384
+ *
385
+ * The sign of the result is computed exactly (e.g. a non-negative plus a
386
+ * non-negative is non-negative); the integer/finite level is preserved, with
387
+ * `SafeInt` operands widening to `Int` because the sum may exceed the safe
388
+ * range. No clamping is performed — for a result that stays inside a bounded
389
+ * type, use that type's branded `add` instead.
390
+ *
391
+ * @param a - The first addend.
392
+ * @param b - The second addend.
393
+ * @returns `a + b`, typed as the tightest branded type guaranteed to contain
394
+ * it.
395
+ */
396
+ Num.add = (a, b) =>
47
397
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
48
- a + b
49
- );
50
- Num2.sub = (a, b) => (
398
+ (a + b);
399
+ /**
400
+ * Subtracts `b` from `a`, returning the tightest sound branded result type.
401
+ *
402
+ * The sign is computed exactly; the level is preserved (with `SafeInt`
403
+ * widening to `Int`). No clamping — for saturating subtraction that stays in a
404
+ * bounded type (e.g. `Uint.sub` clamping at `0`), use that type's branded
405
+ * `sub`.
406
+ *
407
+ * @param a - The minuend.
408
+ * @param b - The subtrahend.
409
+ * @returns `a - b`, typed as the tightest branded type guaranteed to contain
410
+ * it.
411
+ */
412
+ Num.sub = (a, b) =>
51
413
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
52
- a - b
53
- );
54
- Num2.mul = (a, b) => (
414
+ (a - b);
415
+ /**
416
+ * Multiplies two numbers, returning the tightest sound branded result type.
417
+ *
418
+ * The sign follows the usual product rule (e.g. negative times negative is
419
+ * positive); the level is preserved (with `SafeInt` widening to `Int`). No
420
+ * clamping.
421
+ *
422
+ * @param a - The first factor.
423
+ * @param b - The second factor.
424
+ * @returns `a * b`, typed as the tightest branded type guaranteed to contain
425
+ * it.
426
+ */
427
+ Num.mul = (a, b) =>
55
428
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
56
- a * b
57
- );
58
- Num2.div = (a, b) => (
429
+ (a * b);
430
+ /**
431
+ * Performs type-safe exact division with a compile-time zero-check.
432
+ *
433
+ * The divisor must be typed as `NonZeroNumber` or a non-zero numeric literal.
434
+ * The result sign follows the quotient rule; because exact division can be
435
+ * fractional, the level is `finite` (or `number`).
436
+ *
437
+ * @param a - The dividend.
438
+ * @param b - The divisor (must be non-zero, enforced by types).
439
+ * @returns `a / b`, typed as the tightest branded type guaranteed to contain
440
+ * it.
441
+ */
442
+ Num.div = (a, b) =>
59
443
  // eslint-disable-next-line total-functions/no-partial-division, total-functions/no-unsafe-type-assertion
60
- a / b
61
- );
62
- Num2.divInt = (a, b) => {
63
- const quotient = Math.floor(Math.floor(a) / Math.floor(b));
64
- return quotient;
65
- };
66
- Num2.roundAt = (num, precision) => {
67
- const digit = 10 ** precision;
68
- return Math.round(num * digit) / digit;
69
- };
70
- Num2.roundToInt = (num) => Math.trunc(num + 0.5);
71
- Num2.round = (digit) => {
72
- const powAmount = 10 ** digit;
73
- return (target) => (
74
- // eslint-disable-next-line total-functions/no-partial-division
75
- (0, Num2.roundToInt)(powAmount * target) / powAmount
76
- );
77
- };
78
- Num2.mapNaN2Undefined = (num) => Number.isNaN(num) ? void 0 : (
444
+ (a / b);
445
+ /**
446
+ * Performs integer division using floor division.
447
+ *
448
+ * Computes `⌊a / b⌋` by flooring both operands before division and then
449
+ * flooring the result. This ensures integer arithmetic semantics.
450
+ *
451
+ * Note: Unlike `div`, this function does not enforce non-zero divisor at
452
+ * compile time. Division by zero returns `NaN`.
453
+ *
454
+ * @param a - The dividend
455
+ * @param b - The divisor
456
+ * @returns The integer quotient, or `NaN` if b is zero
457
+ */
458
+ Num.divInt = (a, b) => {
459
+ // eslint-disable-next-line total-functions/no-partial-division
460
+ const quotient = Math.floor(Math.floor(a) / Math.floor(b));
461
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
462
+ return quotient;
463
+ };
464
+ /**
465
+ * Rounds a number to a specified number of decimal places.
466
+ *
467
+ * Uses the standard rounding algorithm (round half up) to round the number to
468
+ * the given precision. The precision must be a positive safe integer.
469
+ *
470
+ * @param num - The number to round
471
+ * @param precision - The number of decimal places (must be positive)
472
+ * @returns The rounded number
473
+ */
474
+ Num.roundAt = (num, precision) => {
475
+ const digit = 10 ** precision;
476
+ // eslint-disable-next-line total-functions/no-partial-division
477
+ return Math.round(num * digit) / digit;
478
+ };
479
+ /**
480
+ * Rounds a number to the nearest integer using bitwise operations.
481
+ *
482
+ * This function uses a bitwise OR trick for potentially faster rounding.
483
+ * Note: This implementation rounds half up for positive numbers but may
484
+ * behave differently for negative numbers compared to Math.round.
485
+ *
486
+ * @param num - The number to round
487
+ * @returns The rounded integer as an Int branded type
488
+ */
79
489
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
80
- num
81
- );
82
- Num2.increment = (n) => (
490
+ Num.roundToInt = (num) => Math.trunc(num + 0.5);
491
+ /**
492
+ * Creates a reusable rounding function with a fixed precision.
493
+ *
494
+ * This is a curried version of roundAt that returns a function configured to
495
+ * always round to the specified number of decimal places. Useful for creating
496
+ * consistent rounding behavior across multiple values.
497
+ *
498
+ * @param digit - The number of decimal places for rounding
499
+ * @returns A function that rounds numbers to the specified precision
500
+ */
501
+ Num.round = (digit) => {
502
+ const powAmount = 10 ** digit;
503
+ return (target) =>
504
+ // eslint-disable-next-line total-functions/no-partial-division
505
+ Num.roundToInt(powAmount * target) / powAmount;
506
+ };
507
+ /**
508
+ * Converts NaN values to undefined while preserving all other numbers.
509
+ *
510
+ * This function is useful for handling potentially invalid numeric operations
511
+ * in a type-safe way, converting NaN results to undefined for easier handling
512
+ * with optional chaining or nullish coalescing.
513
+ *
514
+ * @template N - The numeric type (literal or number)
515
+ * @param num - The number to check
516
+ * @returns The original number if not NaN, otherwise undefined
517
+ */
518
+ Num.mapNaN2Undefined = (num) => Number.isNaN(num)
519
+ ? undefined
520
+ : // eslint-disable-next-line total-functions/no-unsafe-type-assertion
521
+ num;
522
+ /**
523
+ * Type-safe increment operation for SmallUint values.
524
+ *
525
+ * Increments a SmallUint (0-40) by 1 with the result type computed at compile
526
+ * time. This provides type-level arithmetic for small unsigned integers,
527
+ * useful for type-safe counter operations.
528
+ *
529
+ * @template N - A SmallUint literal type (0-40)
530
+ * @param n - The SmallUint value to increment
531
+ * @returns The incremented value with type Increment<N>
532
+ */
533
+ Num.increment = (n) =>
83
534
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
84
- n + 1
85
- );
86
- Num2.decrement = (n) => (
535
+ (n + 1);
536
+ /**
537
+ * Type-safe decrement operation for positive SmallInt values.
538
+ *
539
+ * Decrements a positive SmallInt (1-40) by 1 with the result type computed at
540
+ * compile time. This provides type-level arithmetic for small positive
541
+ * integers, useful for type-safe countdown operations.
542
+ *
543
+ * @template N - A positive SmallInt literal type (1-40)
544
+ * @param n - The positive SmallInt value to decrement
545
+ * @returns The decremented value with type Decrement<N>
546
+ */
547
+ Num.decrement = (n) =>
87
548
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
88
- n - 1
89
- );
549
+ (n - 1);
90
550
  })(Num || (Num = {}));
91
-
92
- export { Num };
93
- //# sourceMappingURL=num.mjs.map
551
+ //# sourceMappingURL=num.mjs.map