ts-data-forge 14.6.0 → 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 (409) 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 -291
  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.d.mts.map +1 -1
  44. package/dist/collections/iset-mapped.mjs +448 -263
  45. package/dist/collections/iset-mapped.mjs.map +1 -1
  46. package/dist/collections/iset.mjs +328 -201
  47. package/dist/collections/iset.mjs.map +1 -1
  48. package/dist/collections/queue.mjs +183 -151
  49. package/dist/collections/queue.mjs.map +1 -1
  50. package/dist/collections/stack.mjs +169 -140
  51. package/dist/collections/stack.mjs.map +1 -1
  52. package/dist/entry-point.mjs +4 -77
  53. package/dist/entry-point.mjs.map +1 -1
  54. package/dist/expect-type.mjs +70 -4
  55. package/dist/expect-type.mjs.map +1 -1
  56. package/dist/functional/async-result/async-result.mjs +2 -3
  57. package/dist/functional/async-result/async-result.mjs.map +1 -1
  58. package/dist/functional/async-result/impl/async-result-flat-map.mjs +19 -21
  59. package/dist/functional/async-result/impl/async-result-flat-map.mjs.map +1 -1
  60. package/dist/functional/async-result/impl/async-result-from-promise.mjs +9 -10
  61. package/dist/functional/async-result/impl/async-result-from-promise.mjs.map +1 -1
  62. package/dist/functional/async-result/impl/async-result-from-throwable.mjs +12 -14
  63. package/dist/functional/async-result/impl/async-result-from-throwable.mjs.map +1 -1
  64. package/dist/functional/async-result/impl/async-result-map-err.mjs +16 -19
  65. package/dist/functional/async-result/impl/async-result-map-err.mjs.map +1 -1
  66. package/dist/functional/async-result/impl/async-result-map.mjs +16 -19
  67. package/dist/functional/async-result/impl/async-result-map.mjs.map +1 -1
  68. package/dist/functional/async-result/impl/async-result-unwrap-or.mjs +36 -9
  69. package/dist/functional/async-result/impl/async-result-unwrap-or.mjs.map +1 -1
  70. package/dist/functional/async-result/impl/index.mjs +8 -7
  71. package/dist/functional/async-result/impl/index.mjs.map +1 -1
  72. package/dist/functional/async-result/impl/types.mjs +2 -2
  73. package/dist/functional/async-result/impl/types.mjs.map +1 -1
  74. package/dist/functional/async-result/index.mjs +2 -3
  75. package/dist/functional/async-result/index.mjs.map +1 -1
  76. package/dist/functional/index.mjs +7 -11
  77. package/dist/functional/index.mjs.map +1 -1
  78. package/dist/functional/match.mjs +27 -13
  79. package/dist/functional/match.mjs.map +1 -1
  80. package/dist/functional/optional/impl/index.mjs +19 -18
  81. package/dist/functional/optional/impl/index.mjs.map +1 -1
  82. package/dist/functional/optional/impl/optional-expect-to-be.mjs +16 -18
  83. package/dist/functional/optional/impl/optional-expect-to-be.mjs.map +1 -1
  84. package/dist/functional/optional/impl/optional-filter.mjs +17 -19
  85. package/dist/functional/optional/impl/optional-filter.mjs.map +1 -1
  86. package/dist/functional/optional/impl/optional-flat-map.mjs +13 -15
  87. package/dist/functional/optional/impl/optional-flat-map.mjs.map +1 -1
  88. package/dist/functional/optional/impl/optional-from-nullable.mjs +26 -5
  89. package/dist/functional/optional/impl/optional-from-nullable.mjs.map +1 -1
  90. package/dist/functional/optional/impl/optional-is-none.mjs +21 -5
  91. package/dist/functional/optional/impl/optional-is-none.mjs.map +1 -1
  92. package/dist/functional/optional/impl/optional-is-optional.mjs +26 -8
  93. package/dist/functional/optional/impl/optional-is-optional.mjs.map +1 -1
  94. package/dist/functional/optional/impl/optional-is-some.mjs +22 -5
  95. package/dist/functional/optional/impl/optional-is-some.mjs.map +1 -1
  96. package/dist/functional/optional/impl/optional-map.mjs +16 -18
  97. package/dist/functional/optional/impl/optional-map.mjs.map +1 -1
  98. package/dist/functional/optional/impl/optional-match.mjs +16 -18
  99. package/dist/functional/optional/impl/optional-match.mjs.map +1 -1
  100. package/dist/functional/optional/impl/optional-none.mjs +18 -5
  101. package/dist/functional/optional/impl/optional-none.mjs.map +1 -1
  102. package/dist/functional/optional/impl/optional-or-else.mjs +13 -15
  103. package/dist/functional/optional/impl/optional-or-else.mjs.map +1 -1
  104. package/dist/functional/optional/impl/optional-some.mjs +23 -7
  105. package/dist/functional/optional/impl/optional-some.mjs.map +1 -1
  106. package/dist/functional/optional/impl/optional-to-nullable.mjs +28 -5
  107. package/dist/functional/optional/impl/optional-to-nullable.mjs.map +1 -1
  108. package/dist/functional/optional/impl/optional-unwrap-or.mjs +12 -14
  109. package/dist/functional/optional/impl/optional-unwrap-or.mjs.map +1 -1
  110. package/dist/functional/optional/impl/optional-unwrap-throw.mjs +34 -9
  111. package/dist/functional/optional/impl/optional-unwrap-throw.mjs.map +1 -1
  112. package/dist/functional/optional/impl/optional-unwrap.mjs +6 -9
  113. package/dist/functional/optional/impl/optional-unwrap.mjs.map +1 -1
  114. package/dist/functional/optional/impl/optional-zip.mjs +36 -5
  115. package/dist/functional/optional/impl/optional-zip.mjs.map +1 -1
  116. package/dist/functional/optional/impl/tag.mjs +4 -5
  117. package/dist/functional/optional/impl/tag.mjs.map +1 -1
  118. package/dist/functional/optional/impl/types.mjs +2 -2
  119. package/dist/functional/optional/impl/types.mjs.map +1 -1
  120. package/dist/functional/optional/index.mjs +2 -3
  121. package/dist/functional/optional/index.mjs.map +1 -1
  122. package/dist/functional/optional/optional.mjs +2 -3
  123. package/dist/functional/optional/optional.mjs.map +1 -1
  124. package/dist/functional/pipe.mjs +42 -14
  125. package/dist/functional/pipe.mjs.map +1 -1
  126. package/dist/functional/result/impl/index.mjs +28 -27
  127. package/dist/functional/result/impl/index.mjs.map +1 -1
  128. package/dist/functional/result/impl/result-err.mjs +29 -7
  129. package/dist/functional/result/impl/result-err.mjs.map +1 -1
  130. package/dist/functional/result/impl/result-expect-to-be.mjs +17 -18
  131. package/dist/functional/result/impl/result-expect-to-be.mjs.map +1 -1
  132. package/dist/functional/result/impl/result-flat-map.mjs +18 -21
  133. package/dist/functional/result/impl/result-flat-map.mjs.map +1 -1
  134. package/dist/functional/result/impl/result-fold.mjs +18 -21
  135. package/dist/functional/result/impl/result-fold.mjs.map +1 -1
  136. package/dist/functional/result/impl/result-from-optional.mjs +17 -20
  137. package/dist/functional/result/impl/result-from-optional.mjs.map +1 -1
  138. package/dist/functional/result/impl/result-from-promise.mjs +37 -8
  139. package/dist/functional/result/impl/result-from-promise.mjs.map +1 -1
  140. package/dist/functional/result/impl/result-from-throwable.mjs +41 -14
  141. package/dist/functional/result/impl/result-from-throwable.mjs.map +1 -1
  142. package/dist/functional/result/impl/result-is-err.mjs +21 -5
  143. package/dist/functional/result/impl/result-is-err.mjs.map +1 -1
  144. package/dist/functional/result/impl/result-is-ok.mjs +21 -5
  145. package/dist/functional/result/impl/result-is-ok.mjs.map +1 -1
  146. package/dist/functional/result/impl/result-is-result.mjs +25 -7
  147. package/dist/functional/result/impl/result-is-result.mjs.map +1 -1
  148. package/dist/functional/result/impl/result-map-err.mjs +18 -21
  149. package/dist/functional/result/impl/result-map-err.mjs.map +1 -1
  150. package/dist/functional/result/impl/result-map.mjs +18 -21
  151. package/dist/functional/result/impl/result-map.mjs.map +1 -1
  152. package/dist/functional/result/impl/result-match.mjs +17 -21
  153. package/dist/functional/result/impl/result-match.mjs.map +1 -1
  154. package/dist/functional/result/impl/result-ok.mjs +29 -7
  155. package/dist/functional/result/impl/result-ok.mjs.map +1 -1
  156. package/dist/functional/result/impl/result-or-else.mjs +14 -15
  157. package/dist/functional/result/impl/result-or-else.mjs.map +1 -1
  158. package/dist/functional/result/impl/result-safe-try.mjs +32 -21
  159. package/dist/functional/result/impl/result-safe-try.mjs.map +1 -1
  160. package/dist/functional/result/impl/result-safe-unwrap.mjs +40 -12
  161. package/dist/functional/result/impl/result-safe-unwrap.mjs.map +1 -1
  162. package/dist/functional/result/impl/result-swap.mjs +23 -8
  163. package/dist/functional/result/impl/result-swap.mjs.map +1 -1
  164. package/dist/functional/result/impl/result-to-optional.mjs +30 -7
  165. package/dist/functional/result/impl/result-to-optional.mjs.map +1 -1
  166. package/dist/functional/result/impl/result-unwrap-err-or.mjs +13 -14
  167. package/dist/functional/result/impl/result-unwrap-err-or.mjs.map +1 -1
  168. package/dist/functional/result/impl/result-unwrap-err-throw.mjs +43 -20
  169. package/dist/functional/result/impl/result-unwrap-err-throw.mjs.map +1 -1
  170. package/dist/functional/result/impl/result-unwrap-err.mjs +33 -8
  171. package/dist/functional/result/impl/result-unwrap-err.mjs.map +1 -1
  172. package/dist/functional/result/impl/result-unwrap-ok-or.mjs +13 -14
  173. package/dist/functional/result/impl/result-unwrap-ok-or.mjs.map +1 -1
  174. package/dist/functional/result/impl/result-unwrap-ok.mjs +6 -9
  175. package/dist/functional/result/impl/result-unwrap-ok.mjs.map +1 -1
  176. package/dist/functional/result/impl/result-unwrap-throw.mjs +38 -11
  177. package/dist/functional/result/impl/result-unwrap-throw.mjs.map +1 -1
  178. package/dist/functional/result/impl/result-zip.mjs +35 -5
  179. package/dist/functional/result/impl/result-zip.mjs.map +1 -1
  180. package/dist/functional/result/impl/tag.mjs +4 -5
  181. package/dist/functional/result/impl/tag.mjs.map +1 -1
  182. package/dist/functional/result/impl/types.mjs +2 -2
  183. package/dist/functional/result/impl/types.mjs.map +1 -1
  184. package/dist/functional/result/index.mjs +2 -3
  185. package/dist/functional/result/index.mjs.map +1 -1
  186. package/dist/functional/result/result.mjs +2 -3
  187. package/dist/functional/result/result.mjs.map +1 -1
  188. package/dist/functional/ternary-result/impl/index.mjs +29 -28
  189. package/dist/functional/ternary-result/impl/index.mjs.map +1 -1
  190. package/dist/functional/ternary-result/impl/tag.mjs +6 -6
  191. package/dist/functional/ternary-result/impl/tag.mjs.map +1 -1
  192. package/dist/functional/ternary-result/impl/ternary-result-err.mjs +17 -7
  193. package/dist/functional/ternary-result/impl/ternary-result-err.mjs.map +1 -1
  194. package/dist/functional/ternary-result/impl/ternary-result-expect-to-be.mjs +15 -18
  195. package/dist/functional/ternary-result/impl/ternary-result-expect-to-be.mjs.map +1 -1
  196. package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs +28 -32
  197. package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs.map +1 -1
  198. package/dist/functional/ternary-result/impl/ternary-result-fold.mjs +24 -26
  199. package/dist/functional/ternary-result/impl/ternary-result-fold.mjs.map +1 -1
  200. package/dist/functional/ternary-result/impl/ternary-result-from-promise.mjs +21 -8
  201. package/dist/functional/ternary-result/impl/ternary-result-from-promise.mjs.map +1 -1
  202. package/dist/functional/ternary-result/impl/ternary-result-from-throwable.mjs +28 -13
  203. package/dist/functional/ternary-result/impl/ternary-result-from-throwable.mjs.map +1 -1
  204. package/dist/functional/ternary-result/impl/ternary-result-is-err.mjs +19 -5
  205. package/dist/functional/ternary-result/impl/ternary-result-is-err.mjs.map +1 -1
  206. package/dist/functional/ternary-result/impl/ternary-result-is-ok.mjs +21 -5
  207. package/dist/functional/ternary-result/impl/ternary-result-is-ok.mjs.map +1 -1
  208. package/dist/functional/ternary-result/impl/ternary-result-is-ternary-result.mjs +28 -8
  209. package/dist/functional/ternary-result/impl/ternary-result-is-ternary-result.mjs.map +1 -1
  210. package/dist/functional/ternary-result/impl/ternary-result-is-warn.mjs +20 -5
  211. package/dist/functional/ternary-result/impl/ternary-result-is-warn.mjs.map +1 -1
  212. package/dist/functional/ternary-result/impl/ternary-result-map-err.mjs +17 -18
  213. package/dist/functional/ternary-result/impl/ternary-result-map-err.mjs.map +1 -1
  214. package/dist/functional/ternary-result/impl/ternary-result-map-warn.mjs +20 -23
  215. package/dist/functional/ternary-result/impl/ternary-result-map-warn.mjs.map +1 -1
  216. package/dist/functional/ternary-result/impl/ternary-result-map.mjs +24 -26
  217. package/dist/functional/ternary-result/impl/ternary-result-map.mjs.map +1 -1
  218. package/dist/functional/ternary-result/impl/ternary-result-ok.mjs +18 -7
  219. package/dist/functional/ternary-result/impl/ternary-result-ok.mjs.map +1 -1
  220. package/dist/functional/ternary-result/impl/ternary-result-or-else.mjs +11 -14
  221. package/dist/functional/ternary-result/impl/ternary-result-or-else.mjs.map +1 -1
  222. package/dist/functional/ternary-result/impl/ternary-result-to-optional.mjs +24 -10
  223. package/dist/functional/ternary-result/impl/ternary-result-to-optional.mjs.map +1 -1
  224. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-or.mjs +11 -14
  225. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-or.mjs.map +1 -1
  226. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-throw.mjs +30 -19
  227. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-throw.mjs.map +1 -1
  228. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err.mjs +20 -8
  229. package/dist/functional/ternary-result/impl/ternary-result-unwrap-err.mjs.map +1 -1
  230. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok-or.mjs +11 -14
  231. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok-or.mjs.map +1 -1
  232. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok.mjs +7 -9
  233. package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok.mjs.map +1 -1
  234. package/dist/functional/ternary-result/impl/ternary-result-unwrap-throw.mjs +30 -22
  235. package/dist/functional/ternary-result/impl/ternary-result-unwrap-throw.mjs.map +1 -1
  236. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-or.mjs +11 -14
  237. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-or.mjs.map +1 -1
  238. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-throw.mjs +27 -17
  239. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-throw.mjs.map +1 -1
  240. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn.mjs +20 -8
  241. package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn.mjs.map +1 -1
  242. package/dist/functional/ternary-result/impl/ternary-result-warn.mjs +21 -8
  243. package/dist/functional/ternary-result/impl/ternary-result-warn.mjs.map +1 -1
  244. package/dist/functional/ternary-result/impl/ternary-result-zip.mjs +47 -19
  245. package/dist/functional/ternary-result/impl/ternary-result-zip.mjs.map +1 -1
  246. package/dist/functional/ternary-result/impl/types.mjs +2 -2
  247. package/dist/functional/ternary-result/impl/types.mjs.map +1 -1
  248. package/dist/functional/ternary-result/impl/variant-name.mjs +12 -14
  249. package/dist/functional/ternary-result/impl/variant-name.mjs.map +1 -1
  250. package/dist/functional/ternary-result/index.mjs +2 -3
  251. package/dist/functional/ternary-result/index.mjs.map +1 -1
  252. package/dist/functional/ternary-result/ternary-result.mjs +2 -3
  253. package/dist/functional/ternary-result/ternary-result.mjs.map +1 -1
  254. package/dist/guard/has-key.mjs +43 -4
  255. package/dist/guard/has-key.mjs.map +1 -1
  256. package/dist/guard/index.mjs +8 -8
  257. package/dist/guard/index.mjs.map +1 -1
  258. package/dist/guard/is-non-empty-string.mjs +39 -4
  259. package/dist/guard/is-non-empty-string.mjs.map +1 -1
  260. package/dist/guard/is-non-null-object.mjs +36 -4
  261. package/dist/guard/is-non-null-object.mjs.map +1 -1
  262. package/dist/guard/is-primitive.mjs +46 -15
  263. package/dist/guard/is-primitive.mjs.map +1 -1
  264. package/dist/guard/is-record.mjs +89 -6
  265. package/dist/guard/is-record.mjs.map +1 -1
  266. package/dist/guard/is-type.mjs +404 -19
  267. package/dist/guard/is-type.mjs.map +1 -1
  268. package/dist/guard/key-is-in.mjs +42 -4
  269. package/dist/guard/key-is-in.mjs.map +1 -1
  270. package/dist/index.mjs +12 -65
  271. package/dist/index.mjs.map +1 -1
  272. package/dist/iterator/index.mjs +2 -2
  273. package/dist/iterator/index.mjs.map +1 -1
  274. package/dist/iterator/range.mjs +19 -57
  275. package/dist/iterator/range.mjs.map +1 -1
  276. package/dist/json/index.mjs +2 -2
  277. package/dist/json/index.mjs.map +1 -1
  278. package/dist/json/json.mjs +346 -105
  279. package/dist/json/json.mjs.map +1 -1
  280. package/dist/number/branded-types/finite-number.mjs +148 -137
  281. package/dist/number/branded-types/finite-number.mjs.map +1 -1
  282. package/dist/number/branded-types/index.mjs +33 -33
  283. package/dist/number/branded-types/index.mjs.map +1 -1
  284. package/dist/number/branded-types/int.mjs +245 -209
  285. package/dist/number/branded-types/int.mjs.map +1 -1
  286. package/dist/number/branded-types/int16.mjs +141 -131
  287. package/dist/number/branded-types/int16.mjs.map +1 -1
  288. package/dist/number/branded-types/int32.mjs +141 -131
  289. package/dist/number/branded-types/int32.mjs.map +1 -1
  290. package/dist/number/branded-types/negative-finite-number.mjs +155 -149
  291. package/dist/number/branded-types/negative-finite-number.mjs.map +1 -1
  292. package/dist/number/branded-types/negative-int.mjs +125 -110
  293. package/dist/number/branded-types/negative-int.mjs.map +1 -1
  294. package/dist/number/branded-types/negative-safe-int.mjs +126 -115
  295. package/dist/number/branded-types/negative-safe-int.mjs.map +1 -1
  296. package/dist/number/branded-types/non-negative-finite-number.mjs +164 -154
  297. package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
  298. package/dist/number/branded-types/non-negative-int16.mjs +137 -125
  299. package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
  300. package/dist/number/branded-types/non-negative-int32.mjs +137 -125
  301. package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
  302. package/dist/number/branded-types/non-positive-finite-number.mjs +143 -139
  303. package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -1
  304. package/dist/number/branded-types/non-positive-int.mjs +116 -99
  305. package/dist/number/branded-types/non-positive-int.mjs.map +1 -1
  306. package/dist/number/branded-types/non-positive-safe-int.mjs +118 -107
  307. package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -1
  308. package/dist/number/branded-types/non-zero-finite-number.mjs +144 -129
  309. package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
  310. package/dist/number/branded-types/non-zero-int.mjs +102 -82
  311. package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
  312. package/dist/number/branded-types/non-zero-int16.mjs +118 -105
  313. package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
  314. package/dist/number/branded-types/non-zero-int32.mjs +118 -105
  315. package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
  316. package/dist/number/branded-types/non-zero-safe-int.mjs +122 -108
  317. package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
  318. package/dist/number/branded-types/non-zero-uint16.mjs +118 -104
  319. package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
  320. package/dist/number/branded-types/non-zero-uint32.mjs +118 -104
  321. package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
  322. package/dist/number/branded-types/positive-finite-number.mjs +167 -160
  323. package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
  324. package/dist/number/branded-types/positive-int.mjs +260 -224
  325. package/dist/number/branded-types/positive-int.mjs.map +1 -1
  326. package/dist/number/branded-types/positive-int16.mjs +134 -122
  327. package/dist/number/branded-types/positive-int16.mjs.map +1 -1
  328. package/dist/number/branded-types/positive-int32.mjs +134 -122
  329. package/dist/number/branded-types/positive-int32.mjs.map +1 -1
  330. package/dist/number/branded-types/positive-safe-int.mjs +292 -258
  331. package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
  332. package/dist/number/branded-types/positive-uint16.mjs +134 -122
  333. package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
  334. package/dist/number/branded-types/positive-uint32.mjs +134 -122
  335. package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
  336. package/dist/number/branded-types/safe-int.mjs +284 -255
  337. package/dist/number/branded-types/safe-int.mjs.map +1 -1
  338. package/dist/number/branded-types/safe-uint.mjs +135 -124
  339. package/dist/number/branded-types/safe-uint.mjs.map +1 -1
  340. package/dist/number/branded-types/uint.mjs +248 -211
  341. package/dist/number/branded-types/uint.mjs.map +1 -1
  342. package/dist/number/branded-types/uint16.mjs +132 -121
  343. package/dist/number/branded-types/uint16.mjs.map +1 -1
  344. package/dist/number/branded-types/uint32.mjs +132 -121
  345. package/dist/number/branded-types/uint32.mjs.map +1 -1
  346. package/dist/number/enum/index.mjs +3 -3
  347. package/dist/number/enum/index.mjs.map +1 -1
  348. package/dist/number/enum/int8.mjs +146 -131
  349. package/dist/number/enum/int8.mjs.map +1 -1
  350. package/dist/number/enum/uint8.mjs +133 -119
  351. package/dist/number/enum/uint8.mjs.map +1 -1
  352. package/dist/number/index.mjs +6 -37
  353. package/dist/number/index.mjs.map +1 -1
  354. package/dist/number/num-arithmetic-types.mjs +42 -1
  355. package/dist/number/num-arithmetic-types.mjs.map +1 -1
  356. package/dist/number/num.mjs +541 -83
  357. package/dist/number/num.mjs.map +1 -1
  358. package/dist/number/refined-number-utils.mjs +294 -133
  359. package/dist/number/refined-number-utils.mjs.map +1 -1
  360. package/dist/object/index.mjs +2 -2
  361. package/dist/object/index.mjs.map +1 -1
  362. package/dist/object/object.mjs +355 -202
  363. package/dist/object/object.mjs.map +1 -1
  364. package/dist/others/cast-mutable.mjs +38 -11
  365. package/dist/others/cast-mutable.mjs.map +1 -1
  366. package/dist/others/cast-readonly.mjs +37 -11
  367. package/dist/others/cast-readonly.mjs.map +1 -1
  368. package/dist/others/debounce-function.mjs +22 -11
  369. package/dist/others/debounce-function.mjs.map +1 -1
  370. package/dist/others/fast-deep-equal.mjs +70 -51
  371. package/dist/others/fast-deep-equal.mjs.map +1 -1
  372. package/dist/others/if-then.mjs +32 -5
  373. package/dist/others/if-then.mjs.map +1 -1
  374. package/dist/others/index.mjs +10 -10
  375. package/dist/others/index.mjs.map +1 -1
  376. package/dist/others/map-nullable.mjs +11 -13
  377. package/dist/others/map-nullable.mjs.map +1 -1
  378. package/dist/others/memoize-function.mjs +14 -16
  379. package/dist/others/memoize-function.mjs.map +1 -1
  380. package/dist/others/tuple.mjs +52 -4
  381. package/dist/others/tuple.mjs.map +1 -1
  382. package/dist/others/unknown-to-string.mjs +91 -47
  383. package/dist/others/unknown-to-string.mjs.map +1 -1
  384. package/dist/promise/index.mjs +2 -2
  385. package/dist/promise/index.mjs.map +1 -1
  386. package/dist/promise/promise.mjs +51 -10
  387. package/dist/promise/promise.mjs.map +1 -1
  388. package/dist/string/index.mjs +2 -2
  389. package/dist/string/index.mjs.map +1 -1
  390. package/dist/string/str.mjs +250 -83
  391. package/dist/string/str.mjs.map +1 -1
  392. package/dist/types.mjs +3 -2
  393. package/dist/types.mjs.map +1 -1
  394. package/package.json +5 -6
  395. package/src/array/impl/array-utils-length-constraint-preservation.test.mts +2 -2
  396. package/src/collections/imap-mapped.mts +4 -4
  397. package/src/collections/imap.mts +1 -1
  398. package/src/collections/imap.test.mts +1 -1
  399. package/src/collections/iset-mapped.mts +2 -1
  400. package/src/collections/iset.mts +1 -1
  401. package/src/functional/async-result.test.mts +3 -2
  402. package/src/functional/optional.test.mts +2 -1
  403. package/src/functional/result.test.mts +0 -2
  404. package/src/guard/is-non-empty-string.test.mts +2 -2
  405. package/src/guard/is-non-null-object.test.mts +3 -3
  406. package/src/guard/is-primitive.test.mts +3 -3
  407. package/src/guard/is-type.test.mts +3 -3
  408. package/src/json/json.test.mts +1 -1
  409. package/src/number/enum/int8.mts +1 -1
@@ -1,214 +1,367 @@
1
- import '../number/branded-types/finite-number.mjs';
2
- import '../number/branded-types/int.mjs';
3
- import '../number/branded-types/int16.mjs';
4
- import '../number/branded-types/int32.mjs';
5
- import '../number/branded-types/negative-finite-number.mjs';
6
- import '../number/branded-types/negative-int.mjs';
7
- import '../number/branded-types/negative-safe-int.mjs';
8
- import '../number/branded-types/non-negative-finite-number.mjs';
9
- import '../number/branded-types/non-negative-int16.mjs';
10
- import '../number/branded-types/non-negative-int32.mjs';
11
- import '../number/branded-types/non-positive-finite-number.mjs';
12
- import '../number/branded-types/non-positive-int.mjs';
13
- import '../number/branded-types/non-positive-safe-int.mjs';
14
- import '../number/branded-types/non-zero-finite-number.mjs';
15
- import '../number/branded-types/non-zero-int.mjs';
16
- import '../number/branded-types/non-zero-int16.mjs';
17
- import '../number/branded-types/non-zero-int32.mjs';
18
- import '../number/branded-types/non-zero-safe-int.mjs';
19
- import '../number/branded-types/non-zero-uint16.mjs';
20
- import '../number/branded-types/non-zero-uint32.mjs';
21
- import '../number/branded-types/positive-finite-number.mjs';
22
- import '../number/branded-types/positive-int.mjs';
23
- import '../number/branded-types/positive-int16.mjs';
24
- import '../number/branded-types/positive-int32.mjs';
25
- import '../number/branded-types/positive-safe-int.mjs';
26
- import '../number/branded-types/positive-uint16.mjs';
27
- import '../number/branded-types/positive-uint32.mjs';
28
- import '../number/branded-types/safe-int.mjs';
29
- import '../number/branded-types/safe-uint.mjs';
30
- import '../number/branded-types/uint.mjs';
31
- import '../number/branded-types/uint16.mjs';
32
- import '../number/branded-types/uint32.mjs';
33
- import '../number/enum/int8.mjs';
34
- import '../number/enum/uint8.mjs';
35
- import '../number/num.mjs';
36
- import '../number/refined-number-utils.mjs';
37
- import { isSome } from '../functional/optional/impl/optional-is-some.mjs';
38
- import { hasKey } from '../guard/has-key.mjs';
39
- import { isRecord } from '../guard/is-record.mjs';
40
- import '@sindresorhus/is';
41
- import { isNonEmpty } from '../array/impl/array-utils-length-bounded-array-guard.mjs';
42
- import '../collections/imap-mapped.mjs';
43
- import '../collections/imap.mjs';
44
- import '../collections/iset-mapped.mjs';
45
- import '../collections/iset.mjs';
46
-
47
- var Obj;
48
- ((Obj2) => {
49
- Obj2.shallowEq = (a, b, eq = Object.is) => {
50
- const aEntries = Object.entries(a);
51
- const bEntries = Object.entries(b);
52
- if (aEntries.length !== bEntries.length) return false;
53
- return aEntries.every(([k, v]) => eq(b[k], v));
54
- };
55
- function pick(...args) {
56
- switch (args.length) {
57
- case 2: {
58
- const [record, keys] = args;
59
- const keysSet = new Set(keys);
60
- return (
61
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
62
- Object.fromEntries(
63
- Object.entries(record).filter(([k, _v]) => keysSet.has(k))
64
- )
65
- );
66
- }
67
- case 1: {
68
- const [keys] = args;
69
- return (record) => pick(record, keys);
70
- }
1
+ import { Arr } from '../array/index.mjs';
2
+ import { Optional } from '../functional/index.mjs';
3
+ import { hasKey, isRecord } from '../guard/index.mjs';
4
+ /**
5
+ * A collection of type-safe object utility functions providing functional
6
+ * programming patterns for object manipulation, including pick, omit, shallow
7
+ * equality checks, and more.
8
+ *
9
+ * All functions maintain TypeScript type safety and support both direct and
10
+ * curried usage patterns for better composition with pipe operations.
11
+ */
12
+ export var Obj;
13
+ (function (Obj) {
14
+ /**
15
+ * Performs a shallow equality check on two records using a configurable
16
+ * equality function. Verifies that both records have the same number of
17
+ * entries and that for every key in the first record, the corresponding value
18
+ * passes the equality test with the value in the second record.
19
+ *
20
+ * @example
21
+ *
22
+ * ```ts
23
+ * const obj1 = { name: 'Alice', age: 30 } as const;
24
+ *
25
+ * const obj2 = { name: 'Alice', age: 30 } as const;
26
+ *
27
+ * const obj3 = { name: 'Alice', age: 31 } as const;
28
+ *
29
+ * assert.isTrue(Obj.shallowEq(obj1, obj2));
30
+ *
31
+ * assert.isFalse(Obj.shallowEq(obj1, obj3));
32
+ *
33
+ * // Custom equality function
34
+ * const obj4 = { value: 1 } as const;
35
+ *
36
+ * const obj5 = { value: 1.00001 } as const;
37
+ *
38
+ * const closeEnough = (a: unknown, b: unknown): boolean => {
39
+ * if (typeof a === 'number' && typeof b === 'number') {
40
+ * return Math.abs(a - b) < 0.001;
41
+ * }
42
+ *
43
+ * return Object.is(a, b);
44
+ * };
45
+ *
46
+ * assert.isTrue(Obj.shallowEq(obj4, obj5, closeEnough));
47
+ * ```
48
+ *
49
+ * @param a - The first record to compare
50
+ * @param b - The second record to compare
51
+ * @param eq - Optional equality function (defaults to Object.is for strict
52
+ * equality)
53
+ * @returns `true` if the records are shallowly equal according to the
54
+ * equality function, `false` otherwise
55
+ */
56
+ Obj.shallowEq = (a, b, eq = Object.is) => {
57
+ const aEntries = Object.entries(a);
58
+ const bEntries = Object.entries(b);
59
+ if (aEntries.length !== bEntries.length)
60
+ return false;
61
+ return aEntries.every(([k, v]) => eq(b[k], v));
62
+ };
63
+ function pick(...args) {
64
+ switch (args.length) {
65
+ case 2: {
66
+ const [record, keys] = args;
67
+ const keysSet = new Set(keys);
68
+ return (
69
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
70
+ Object.fromEntries(Object.entries(record).filter(([k, _v]) => keysSet.has(k))));
71
+ }
72
+ case 1: {
73
+ const [keys] = args;
74
+ return (record) => pick(record, keys);
75
+ }
76
+ }
71
77
  }
72
- }
73
- Obj2.pick = pick;
74
- function omit(...args) {
75
- switch (args.length) {
76
- case 2: {
77
- const [record, keys] = args;
78
- const keysSet = new Set(keys);
79
- return (
80
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
81
- Object.fromEntries(
82
- Object.entries(record).filter(([k, _v]) => !keysSet.has(k))
83
- )
84
- );
85
- }
86
- case 1: {
87
- const [keys] = args;
88
- return (record) => {
89
- const result = omit(
90
- record,
91
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
92
- keys
93
- );
94
- return result;
95
- };
96
- }
78
+ Obj.pick = pick;
79
+ function omit(...args) {
80
+ switch (args.length) {
81
+ case 2: {
82
+ const [record, keys] = args;
83
+ const keysSet = new Set(keys);
84
+ return (
85
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
86
+ Object.fromEntries(Object.entries(record).filter(([k, _v]) => !keysSet.has(k))));
87
+ }
88
+ case 1: {
89
+ const [keys] = args;
90
+ return (record) => {
91
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
92
+ const result = omit(record,
93
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
94
+ keys);
95
+ return result;
96
+ };
97
+ }
98
+ }
97
99
  }
98
- }
99
- Obj2.omit = omit;
100
- Obj2.fromEntries = (entries) => (
100
+ Obj.omit = omit;
101
+ /**
102
+ * Creates an object from an array of key-value pairs with precise TypeScript
103
+ * typing. This is a type-safe wrapper around `Object.fromEntries` that
104
+ * provides better type inference and compile-time guarantees about the
105
+ * resulting object structure.
106
+ *
107
+ * **Type Behavior**:
108
+ *
109
+ * - When entries is a fixed-length tuple, the exact object type is inferred
110
+ * - When entries has dynamic length with union key types, `Partial` is applied
111
+ * to prevent incorrect assumptions about which keys will be present
112
+ *
113
+ * @example
114
+ *
115
+ * ```ts
116
+ * // Fixed-length tuple - exact type inferred
117
+ * const entries1 = [
118
+ * ['name', 'David'],
119
+ * ['age', 25],
120
+ * ['active', true],
121
+ * ] as const;
122
+ *
123
+ * const obj1 = Obj.fromEntries(entries1);
124
+ *
125
+ * assert.deepStrictEqual(obj1, {
126
+ * name: 'David',
127
+ * age: 25,
128
+ * active: true,
129
+ * });
130
+ *
131
+ * // Dynamic length array - Partial type applied
132
+ * const dynamicEntries: readonly (readonly ['x' | 'y', number])[] = [
133
+ * ['x', 10],
134
+ * ['y', 20],
135
+ * ] as const;
136
+ *
137
+ * const obj2 = Obj.fromEntries(dynamicEntries);
138
+ *
139
+ * assert.deepStrictEqual(obj2, { x: 10, y: 20 });
140
+ * ```
141
+ *
142
+ * @template Entries - The readonly array type of key-value entry tuples
143
+ * @param entries - An array of readonly key-value entry tuples `[key, value]`
144
+ * @returns An object created from the entries with precise typing
145
+ */
146
+ Obj.fromEntries = (entries) =>
101
147
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
102
- Object.fromEntries(entries)
103
- );
104
- Obj2.map = (record, mapFn) => {
105
- const mapFnWidened = mapFn;
106
- return (
107
- // `Object.entries` enumerates exactly the own enumerable string keys of
108
- // `record`, and nothing here adds or removes an entry, so the result has
109
- // the key set `MappedRecord` claims.
110
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
111
- Object.fromEntries(
112
- Object.entries(record).map(
113
- ([k, v]) => [k, mapFnWidened(v, k)]
114
- )
115
- )
116
- );
117
- };
118
- function filter(record, predicate) {
119
- const predicateWidened = predicate;
120
- return (
121
- // `Object.entries` enumerates exactly the own enumerable string keys of
122
- // `record`, and filtering only ever removes entries, so the result has a
123
- // subset of those keys — which is what `FilteredRecord` claims.
124
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
125
- Object.fromEntries(
126
- Object.entries(record).filter(([k, v]) => predicateWidened(v, k))
127
- )
128
- );
129
- }
130
- Obj2.filter = filter;
131
- Obj2.filterMap = (record, mapFn) => {
132
- const mapFnWidened = mapFn;
133
- return (
134
- // `Object.entries` enumerates exactly the own enumerable string keys of
135
- // `record`, and this only ever drops entries or replaces their values, so
136
- // the result has a subset of those keys with `V2` values.
137
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
138
- Object.fromEntries(
139
- Object.entries(record).flatMap(([k, v]) => {
140
- const mapped = mapFnWidened(v, k);
141
- return isSome(mapped) ? [[k, mapped.value]] : [];
142
- })
143
- )
144
- );
145
- };
146
- Obj2.merge = (...records) => (
147
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
148
- Object.fromEntries(records.flatMap((r) => Object.entries(r)))
149
- );
150
- function deepPick(...args) {
151
- switch (args.length) {
152
- case 2: {
153
- const [record, path] = args;
148
+ Object.fromEntries(entries);
149
+ /**
150
+ * Transforms every value of a record, leaving the key set untouched.
151
+ *
152
+ * **Type Behavior**: the result is a mapped type over `keyof R`, so the keys
153
+ * — and their optional modifiers — survive verbatim:
154
+ * `{ a: number; b?: number }` maps to `{ a: V2; b?: V2 }`, and a record with
155
+ * an index signature stays total rather than becoming `Partial`.
156
+ *
157
+ * This is what `Object.fromEntries(Object.entries(record).map(...))` cannot
158
+ * express: an entries array carries no evidence that it still covers every
159
+ * key of the record it came from, so its element type is all the return type
160
+ * can be built from. Going through a mapped type instead states the
161
+ * invariant that a value-only transform preserves the key set.
162
+ *
163
+ * **Key handling**: keys reach the callback the way `Object.entries` yields
164
+ * them, so a numeric key `1` arrives as `'1'`. Symbol-keyed properties are
165
+ * not enumerated by `Object.entries`; they are dropped from both the result
166
+ * and its type.
167
+ *
168
+ * @example
169
+ *
170
+ * <!-- doc:embed:jsdoc:example:./samples/src/object/map-example.mts -->
171
+ *
172
+ * ```ts
173
+ * const scores = { alice: 1, bob: 2 } as const;
174
+ *
175
+ * const doubled = Obj.map(scores, (value) => value * 2);
176
+ *
177
+ * assert.deepStrictEqual(doubled, { alice: 2, bob: 4 });
178
+ *
179
+ * // The key is available as the second argument.
180
+ * const labelled = Obj.map(scores, (value, key) => `${key}=${value}`);
181
+ *
182
+ * assert.deepStrictEqual(labelled, { alice: 'alice=1', bob: 'bob=2' });
183
+ * ```
184
+ *
185
+ * <!-- /doc:embed:jsdoc:example:./samples/src/object/map-example.mts -->
186
+ *
187
+ * @template R - The type of the source record
188
+ * @template V2 - The type the callback returns for every key
189
+ * @param record - The record whose values are transformed
190
+ * @param mapFn - Called once per own enumerable string key, with the value
191
+ * and the key
192
+ * @returns A new record with the same keys as `record` and the mapped values
193
+ */
194
+ Obj.map = (record, mapFn) => {
195
+ // `Object.entries` erases both the key and the value type of `R`, so the
196
+ // callback is widened once here instead of asserting on every entry.
197
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
198
+ const mapFnWidened = mapFn;
199
+ return (
200
+ // `Object.entries` enumerates exactly the own enumerable string keys of
201
+ // `record`, and nothing here adds or removes an entry, so the result has
202
+ // the key set `MappedRecord` claims.
203
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
204
+ Object.fromEntries(Object.entries(record).map(([k, v]) => [k, mapFnWidened(v, k)])));
205
+ };
206
+ function filter(record, predicate) {
207
+ // `Object.entries` erases both the key and the value type of `R`, so the
208
+ // callback is widened once here instead of asserting on every entry.
209
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
210
+ const predicateWidened = predicate;
154
211
  return (
155
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
156
- deepPickImpl(record, path)
157
- );
158
- }
159
- case 1: {
160
- const [path] = args;
161
- return (record) => deepPick(record, path);
162
- }
212
+ // `Object.entries` enumerates exactly the own enumerable string keys of
213
+ // `record`, and filtering only ever removes entries, so the result has a
214
+ // subset of those keys — which is what `FilteredRecord` claims.
215
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
216
+ Object.fromEntries(Object.entries(record).filter(([k, v]) => predicateWidened(v, k))));
163
217
  }
164
- }
165
- Obj2.deepPick = deepPick;
166
- function deepOmit(...args) {
167
- switch (args.length) {
168
- case 2: {
169
- const [record, path] = args;
218
+ Obj.filter = filter;
219
+ /**
220
+ * Transforms and drops entries in one pass: the callback returns
221
+ * `Optional.some(value)` to keep an entry with a new value, or
222
+ * `Optional.none` to drop it.
223
+ *
224
+ * **Type Behavior**: as with {@link filter}, the surviving keys are the keys
225
+ * of the source record made optional, and a record keyed by an index
226
+ * signature stays total. Unlike {@link filter}, every kept value takes the
227
+ * type the callback returns.
228
+ *
229
+ * `Optional` rather than `undefined` marks the dropped entries, so a record
230
+ * whose values are legitimately `undefined` stays expressible.
231
+ *
232
+ * **Key handling**: keys reach the callback the way `Object.entries` yields
233
+ * them, so a numeric key `1` arrives as `'1'`. Symbol-keyed properties are
234
+ * not enumerated by `Object.entries`; they are dropped from both the result
235
+ * and its type.
236
+ *
237
+ * @example
238
+ *
239
+ * <!-- doc:embed:jsdoc:example:./samples/src/object/filter-map-example.mts -->
240
+ *
241
+ * ```ts
242
+ * const scores = { alice: 1, bob: 2 } as const;
243
+ *
244
+ * // `Optional.some` keeps an entry with a new value, `Optional.none` drops it.
245
+ * const labelled = Obj.filterMap(scores, (value, key) =>
246
+ * value > 1 ? Optional.some(`${key}=${value}`) : Optional.none,
247
+ * );
248
+ *
249
+ * assert.deepStrictEqual(labelled, { bob: 'bob=2' });
250
+ * ```
251
+ *
252
+ * <!-- /doc:embed:jsdoc:example:./samples/src/object/filter-map-example.mts -->
253
+ *
254
+ * @template R - The type of the source record
255
+ * @template V2 - The type the callback returns for the entries it keeps
256
+ * @param record - The record whose entries are transformed and filtered
257
+ * @param mapFn - Called once per own enumerable string key, with the value
258
+ * and the key
259
+ * @returns A new record holding only the kept entries, with mapped values
260
+ */
261
+ Obj.filterMap = (record, mapFn) => {
262
+ // `Object.entries` erases both the key and the value type of `R`, so the
263
+ // callback is widened once here instead of asserting on every entry.
264
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
265
+ const mapFnWidened = mapFn;
170
266
  return (
171
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
172
- deepOmitImpl(record, path)
173
- );
174
- }
175
- case 1: {
176
- const [path] = args;
177
- return (record) => deepOmit(record, path);
178
- }
267
+ // `Object.entries` enumerates exactly the own enumerable string keys of
268
+ // `record`, and this only ever drops entries or replaces their values, so
269
+ // the result has a subset of those keys with `V2` values.
270
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
271
+ Object.fromEntries(Object.entries(record).flatMap(([k, v]) => {
272
+ const mapped = mapFnWidened(v, k);
273
+ return Optional.isSome(mapped) ? [[k, mapped.value]] : [];
274
+ })));
275
+ };
276
+ /**
277
+ * Merges multiple records into a single record using `Object.assign`.
278
+ * Later records override properties from earlier records with the same key.
279
+ *
280
+ * @example
281
+ *
282
+ * <!-- doc:embed:jsdoc:example:./samples/src/object/merge-example.mts -->
283
+ *
284
+ * ```ts
285
+ * const a = { a: 0, b: 0 } as const;
286
+ *
287
+ * const b = { b: 1, c: 0 } as const;
288
+ *
289
+ * const result = Obj.merge(a, b);
290
+ *
291
+ * assert.deepStrictEqual(result, { a: 0, b: 1, c: 0 });
292
+ * ```
293
+ *
294
+ * <!-- /doc:embed:jsdoc:example:./samples/src/object/merge-example.mts -->
295
+ *
296
+ * @param records - The records to merge
297
+ * @returns A new record with all properties merged
298
+ */
299
+ Obj.merge = (...records) =>
300
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
301
+ Object.fromEntries(records.flatMap((r) => Object.entries(r)));
302
+ function deepPick(...args) {
303
+ switch (args.length) {
304
+ case 2: {
305
+ const [record, path] = args;
306
+ return (
307
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
308
+ deepPickImpl(record, path));
309
+ }
310
+ case 1: {
311
+ const [path] = args;
312
+ return (record) => deepPick(record, path);
313
+ }
314
+ }
315
+ }
316
+ Obj.deepPick = deepPick;
317
+ function deepOmit(...args) {
318
+ switch (args.length) {
319
+ case 2: {
320
+ const [record, path] = args;
321
+ return (
322
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
323
+ deepOmitImpl(record, path));
324
+ }
325
+ case 1: {
326
+ const [path] = args;
327
+ return (record) => deepOmit(record, path);
328
+ }
329
+ }
179
330
  }
180
- }
181
- Obj2.deepOmit = deepOmit;
331
+ Obj.deepOmit = deepOmit;
182
332
  })(Obj || (Obj = {}));
183
333
  const deepPickImpl = (record, path) => {
184
- if (!isNonEmpty(path)) return record;
185
- const head = path[0];
186
- if (!hasKey(record, head)) return {};
187
- const value = record[head];
188
- const tail = path.slice(1);
189
- if (!isNonEmpty(tail)) return { [head]: value };
190
- if (!isRecord(value)) return { [head]: {} };
191
- return {
192
- [head]: deepPickImpl(value, tail)
193
- };
334
+ if (!Arr.isNonEmpty(path))
335
+ return record;
336
+ const head = path[0];
337
+ if (!hasKey(record, head))
338
+ return {};
339
+ const value = record[head];
340
+ const tail = path.slice(1);
341
+ if (!Arr.isNonEmpty(tail))
342
+ return { [head]: value };
343
+ if (!isRecord(value))
344
+ return { [head]: {} };
345
+ return {
346
+ [head]: deepPickImpl(value, tail),
347
+ };
194
348
  };
195
349
  const deepOmitImpl = (record, path) => {
196
- if (!isNonEmpty(path)) return record;
197
- const head = path[0];
198
- if (!hasKey(record, head)) return record;
199
- const tail = path.slice(1);
200
- if (!isNonEmpty(tail)) {
201
- return Object.fromEntries(
202
- Object.entries(record).filter(([k]) => k !== head)
203
- );
204
- }
205
- const value = record[head];
206
- if (!isRecord(value)) return record;
207
- return {
208
- ...record,
209
- [head]: deepOmitImpl(value, tail)
210
- };
350
+ if (!Arr.isNonEmpty(path))
351
+ return record;
352
+ const head = path[0];
353
+ if (!hasKey(record, head))
354
+ return record;
355
+ const tail = path.slice(1);
356
+ if (!Arr.isNonEmpty(tail)) {
357
+ return Object.fromEntries(Object.entries(record).filter(([k]) => k !== head));
358
+ }
359
+ const value = record[head];
360
+ if (!isRecord(value))
361
+ return record;
362
+ return {
363
+ ...record,
364
+ [head]: deepOmitImpl(value, tail),
365
+ };
211
366
  };
212
-
213
- export { Obj };
214
- //# sourceMappingURL=object.mjs.map
367
+ //# sourceMappingURL=object.mjs.map