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,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