ts-data-forge 3.3.0 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/README.md +37 -13
  2. package/dist/array/impl/array-utils-creation.d.mts +116 -0
  3. package/dist/array/impl/array-utils-creation.d.mts.map +1 -0
  4. package/dist/array/impl/array-utils-creation.mjs +110 -0
  5. package/dist/array/impl/array-utils-creation.mjs.map +1 -0
  6. package/dist/array/impl/array-utils-element-access.d.mts +61 -0
  7. package/dist/array/impl/array-utils-element-access.d.mts.map +1 -0
  8. package/dist/array/impl/array-utils-element-access.mjs +66 -0
  9. package/dist/array/impl/array-utils-element-access.mjs.map +1 -0
  10. package/dist/array/impl/array-utils-iterators.d.mts +59 -0
  11. package/dist/array/impl/array-utils-iterators.d.mts.map +1 -0
  12. package/dist/array/impl/array-utils-iterators.mjs +104 -0
  13. package/dist/array/impl/array-utils-iterators.mjs.map +1 -0
  14. package/dist/array/impl/array-utils-modification.d.mts +154 -0
  15. package/dist/array/impl/array-utils-modification.d.mts.map +1 -0
  16. package/dist/array/impl/array-utils-modification.mjs +139 -0
  17. package/dist/array/impl/array-utils-modification.mjs.map +1 -0
  18. package/dist/array/impl/array-utils-reducing-value.d.mts +214 -0
  19. package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -0
  20. package/dist/array/impl/array-utils-reducing-value.mjs +160 -0
  21. package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -0
  22. package/dist/array/impl/array-utils-search.d.mts +179 -0
  23. package/dist/array/impl/array-utils-search.d.mts.map +1 -0
  24. package/dist/array/impl/array-utils-search.mjs +153 -0
  25. package/dist/array/impl/array-utils-search.mjs.map +1 -0
  26. package/dist/array/impl/array-utils-set-op.d.mts +100 -0
  27. package/dist/array/impl/array-utils-set-op.d.mts.map +1 -0
  28. package/dist/array/impl/array-utils-set-op.mjs +137 -0
  29. package/dist/array/impl/array-utils-set-op.mjs.map +1 -0
  30. package/dist/array/impl/array-utils-size.d.mts +24 -0
  31. package/dist/array/impl/array-utils-size.d.mts.map +1 -0
  32. package/dist/array/impl/array-utils-size.mjs +28 -0
  33. package/dist/array/impl/array-utils-size.mjs.map +1 -0
  34. package/dist/array/impl/array-utils-slice-clamped.d.mts +18 -0
  35. package/dist/array/impl/array-utils-slice-clamped.d.mts.map +1 -0
  36. package/dist/array/impl/array-utils-slice-clamped.mjs +49 -0
  37. package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -0
  38. package/dist/array/impl/array-utils-slicing.d.mts +120 -0
  39. package/dist/array/impl/array-utils-slicing.d.mts.map +1 -0
  40. package/dist/array/impl/array-utils-slicing.mjs +140 -0
  41. package/dist/array/impl/array-utils-slicing.mjs.map +1 -0
  42. package/dist/array/impl/array-utils-transformation.d.mts +348 -0
  43. package/dist/array/impl/array-utils-transformation.d.mts.map +1 -0
  44. package/dist/array/impl/array-utils-transformation.mjs +331 -0
  45. package/dist/array/impl/array-utils-transformation.mjs.map +1 -0
  46. package/dist/array/impl/array-utils-validation.d.mts +149 -0
  47. package/dist/array/impl/array-utils-validation.d.mts.map +1 -0
  48. package/dist/array/impl/array-utils-validation.mjs +166 -0
  49. package/dist/array/impl/array-utils-validation.mjs.map +1 -0
  50. package/dist/array/impl/index.d.mts +13 -0
  51. package/dist/array/impl/index.d.mts.map +1 -0
  52. package/dist/array/impl/index.mjs +13 -0
  53. package/dist/array/impl/index.mjs.map +1 -0
  54. package/dist/array/index.d.mts +1 -1
  55. package/dist/array/index.d.mts.map +1 -1
  56. package/dist/array/index.mjs +2 -1
  57. package/dist/array/index.mjs.map +1 -1
  58. package/dist/collections/imap-mapped.d.mts +83 -253
  59. package/dist/collections/imap-mapped.d.mts.map +1 -1
  60. package/dist/collections/imap-mapped.mjs +33 -164
  61. package/dist/collections/imap-mapped.mjs.map +1 -1
  62. package/dist/collections/imap.d.mts +436 -163
  63. package/dist/collections/imap.d.mts.map +1 -1
  64. package/dist/collections/imap.mjs +74 -94
  65. package/dist/collections/imap.mjs.map +1 -1
  66. package/dist/collections/iset-mapped.d.mts +828 -345
  67. package/dist/collections/iset-mapped.d.mts.map +1 -1
  68. package/dist/collections/iset-mapped.mjs +200 -242
  69. package/dist/collections/iset-mapped.mjs.map +1 -1
  70. package/dist/collections/iset.d.mts +397 -205
  71. package/dist/collections/iset.d.mts.map +1 -1
  72. package/dist/collections/iset.mjs +102 -184
  73. package/dist/collections/iset.mjs.map +1 -1
  74. package/dist/collections/queue.d.mts +155 -135
  75. package/dist/collections/queue.d.mts.map +1 -1
  76. package/dist/collections/queue.mjs +55 -156
  77. package/dist/collections/queue.mjs.map +1 -1
  78. package/dist/collections/stack.d.mts +154 -154
  79. package/dist/collections/stack.d.mts.map +1 -1
  80. package/dist/collections/stack.mjs +54 -203
  81. package/dist/collections/stack.mjs.map +1 -1
  82. package/dist/entry-point.d.mts +1 -0
  83. package/dist/entry-point.d.mts.map +1 -1
  84. package/dist/entry-point.mjs +2 -1
  85. package/dist/entry-point.mjs.map +1 -1
  86. package/dist/expect-type.d.mts +43 -172
  87. package/dist/expect-type.d.mts.map +1 -1
  88. package/dist/expect-type.mjs +43 -172
  89. package/dist/expect-type.mjs.map +1 -1
  90. package/dist/functional/match.d.mts +35 -140
  91. package/dist/functional/match.d.mts.map +1 -1
  92. package/dist/functional/match.mjs.map +1 -1
  93. package/dist/functional/optional.d.mts +282 -160
  94. package/dist/functional/optional.d.mts.map +1 -1
  95. package/dist/functional/optional.mjs +131 -71
  96. package/dist/functional/optional.mjs.map +1 -1
  97. package/dist/functional/pipe.d.mts +59 -113
  98. package/dist/functional/pipe.d.mts.map +1 -1
  99. package/dist/functional/pipe.mjs.map +1 -1
  100. package/dist/functional/result.d.mts +433 -332
  101. package/dist/functional/result.d.mts.map +1 -1
  102. package/dist/functional/result.mjs +233 -239
  103. package/dist/functional/result.mjs.map +1 -1
  104. package/dist/globals.d.mts +12 -5
  105. package/dist/guard/has-key.d.mts +23 -74
  106. package/dist/guard/has-key.d.mts.map +1 -1
  107. package/dist/guard/has-key.mjs +23 -74
  108. package/dist/guard/has-key.mjs.map +1 -1
  109. package/dist/guard/is-non-empty-string.d.mts +20 -87
  110. package/dist/guard/is-non-empty-string.d.mts.map +1 -1
  111. package/dist/guard/is-non-empty-string.mjs +20 -87
  112. package/dist/guard/is-non-empty-string.mjs.map +1 -1
  113. package/dist/guard/is-non-null-object.d.mts +14 -84
  114. package/dist/guard/is-non-null-object.d.mts.map +1 -1
  115. package/dist/guard/is-non-null-object.mjs +14 -84
  116. package/dist/guard/is-non-null-object.mjs.map +1 -1
  117. package/dist/guard/is-primitive.d.mts +13 -126
  118. package/dist/guard/is-primitive.d.mts.map +1 -1
  119. package/dist/guard/is-primitive.mjs +13 -126
  120. package/dist/guard/is-primitive.mjs.map +1 -1
  121. package/dist/guard/is-record.d.mts +21 -132
  122. package/dist/guard/is-record.d.mts.map +1 -1
  123. package/dist/guard/is-record.mjs +21 -132
  124. package/dist/guard/is-record.mjs.map +1 -1
  125. package/dist/guard/is-type.d.mts +201 -238
  126. package/dist/guard/is-type.d.mts.map +1 -1
  127. package/dist/guard/is-type.mjs +201 -238
  128. package/dist/guard/is-type.mjs.map +1 -1
  129. package/dist/guard/key-is-in.d.mts +22 -139
  130. package/dist/guard/key-is-in.d.mts.map +1 -1
  131. package/dist/guard/key-is-in.mjs +22 -139
  132. package/dist/guard/key-is-in.mjs.map +1 -1
  133. package/dist/index.d.mts +0 -1
  134. package/dist/index.d.mts.map +1 -1
  135. package/dist/index.mjs +0 -1
  136. package/dist/index.mjs.map +1 -1
  137. package/dist/iterator/range.d.mts +29 -62
  138. package/dist/iterator/range.d.mts.map +1 -1
  139. package/dist/iterator/range.mjs.map +1 -1
  140. package/dist/json/json.d.mts +191 -121
  141. package/dist/json/json.d.mts.map +1 -1
  142. package/dist/json/json.mjs +238 -136
  143. package/dist/json/json.mjs.map +1 -1
  144. package/dist/number/branded-types/finite-number.d.mts +24 -156
  145. package/dist/number/branded-types/finite-number.d.mts.map +1 -1
  146. package/dist/number/branded-types/finite-number.mjs +27 -159
  147. package/dist/number/branded-types/finite-number.mjs.map +1 -1
  148. package/dist/number/branded-types/int.d.mts +122 -120
  149. package/dist/number/branded-types/int.d.mts.map +1 -1
  150. package/dist/number/branded-types/int.mjs +122 -120
  151. package/dist/number/branded-types/int.mjs.map +1 -1
  152. package/dist/number/branded-types/int16.d.mts +22 -30
  153. package/dist/number/branded-types/int16.d.mts.map +1 -1
  154. package/dist/number/branded-types/int16.mjs +22 -30
  155. package/dist/number/branded-types/int16.mjs.map +1 -1
  156. package/dist/number/branded-types/int32.d.mts +22 -31
  157. package/dist/number/branded-types/int32.d.mts.map +1 -1
  158. package/dist/number/branded-types/int32.mjs +22 -31
  159. package/dist/number/branded-types/int32.mjs.map +1 -1
  160. package/dist/number/branded-types/non-negative-finite-number.d.mts +28 -36
  161. package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
  162. package/dist/number/branded-types/non-negative-finite-number.mjs +31 -39
  163. package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
  164. package/dist/number/branded-types/non-negative-int16.d.mts +24 -34
  165. package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
  166. package/dist/number/branded-types/non-negative-int16.mjs +24 -34
  167. package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
  168. package/dist/number/branded-types/non-negative-int32.d.mts +26 -35
  169. package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
  170. package/dist/number/branded-types/non-negative-int32.mjs +26 -35
  171. package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
  172. package/dist/number/branded-types/non-zero-finite-number.d.mts +22 -37
  173. package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
  174. package/dist/number/branded-types/non-zero-finite-number.mjs +25 -40
  175. package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
  176. package/dist/number/branded-types/non-zero-int.d.mts +15 -30
  177. package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
  178. package/dist/number/branded-types/non-zero-int.mjs +15 -30
  179. package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
  180. package/dist/number/branded-types/non-zero-int16.d.mts +27 -35
  181. package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
  182. package/dist/number/branded-types/non-zero-int16.mjs +27 -35
  183. package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
  184. package/dist/number/branded-types/non-zero-int32.d.mts +29 -36
  185. package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
  186. package/dist/number/branded-types/non-zero-int32.mjs +29 -36
  187. package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
  188. package/dist/number/branded-types/non-zero-safe-int.d.mts +37 -38
  189. package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
  190. package/dist/number/branded-types/non-zero-safe-int.mjs +39 -40
  191. package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
  192. package/dist/number/branded-types/non-zero-uint16.d.mts +24 -35
  193. package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
  194. package/dist/number/branded-types/non-zero-uint16.mjs +24 -35
  195. package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
  196. package/dist/number/branded-types/non-zero-uint32.d.mts +24 -35
  197. package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
  198. package/dist/number/branded-types/non-zero-uint32.mjs +24 -35
  199. package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
  200. package/dist/number/branded-types/positive-finite-number.d.mts +26 -40
  201. package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
  202. package/dist/number/branded-types/positive-finite-number.mjs +29 -43
  203. package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
  204. package/dist/number/branded-types/positive-int.d.mts +133 -123
  205. package/dist/number/branded-types/positive-int.d.mts.map +1 -1
  206. package/dist/number/branded-types/positive-int.mjs +133 -123
  207. package/dist/number/branded-types/positive-int.mjs.map +1 -1
  208. package/dist/number/branded-types/positive-int16.d.mts +24 -35
  209. package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
  210. package/dist/number/branded-types/positive-int16.mjs +24 -35
  211. package/dist/number/branded-types/positive-int16.mjs.map +1 -1
  212. package/dist/number/branded-types/positive-int32.d.mts +24 -35
  213. package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
  214. package/dist/number/branded-types/positive-int32.mjs +24 -35
  215. package/dist/number/branded-types/positive-int32.mjs.map +1 -1
  216. package/dist/number/branded-types/positive-safe-int.d.mts +159 -33
  217. package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
  218. package/dist/number/branded-types/positive-safe-int.mjs +160 -34
  219. package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
  220. package/dist/number/branded-types/positive-uint16.d.mts +24 -35
  221. package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
  222. package/dist/number/branded-types/positive-uint16.mjs +24 -35
  223. package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
  224. package/dist/number/branded-types/positive-uint32.d.mts +26 -36
  225. package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
  226. package/dist/number/branded-types/positive-uint32.mjs +26 -36
  227. package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
  228. package/dist/number/branded-types/safe-int.d.mts +140 -99
  229. package/dist/number/branded-types/safe-int.d.mts.map +1 -1
  230. package/dist/number/branded-types/safe-int.mjs +142 -101
  231. package/dist/number/branded-types/safe-int.mjs.map +1 -1
  232. package/dist/number/branded-types/safe-uint.d.mts +24 -33
  233. package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
  234. package/dist/number/branded-types/safe-uint.mjs +25 -34
  235. package/dist/number/branded-types/safe-uint.mjs.map +1 -1
  236. package/dist/number/branded-types/uint.d.mts +121 -30
  237. package/dist/number/branded-types/uint.d.mts.map +1 -1
  238. package/dist/number/branded-types/uint.mjs +121 -30
  239. package/dist/number/branded-types/uint.mjs.map +1 -1
  240. package/dist/number/branded-types/uint16.d.mts +26 -34
  241. package/dist/number/branded-types/uint16.d.mts.map +1 -1
  242. package/dist/number/branded-types/uint16.mjs +26 -34
  243. package/dist/number/branded-types/uint16.mjs.map +1 -1
  244. package/dist/number/branded-types/uint32.d.mts +26 -68
  245. package/dist/number/branded-types/uint32.d.mts.map +1 -1
  246. package/dist/number/branded-types/uint32.mjs +26 -68
  247. package/dist/number/branded-types/uint32.mjs.map +1 -1
  248. package/dist/number/enum/int8.d.mts +37 -101
  249. package/dist/number/enum/int8.d.mts.map +1 -1
  250. package/dist/number/enum/int8.mjs +39 -170
  251. package/dist/number/enum/int8.mjs.map +1 -1
  252. package/dist/number/enum/uint8.d.mts +45 -55
  253. package/dist/number/enum/uint8.d.mts.map +1 -1
  254. package/dist/number/enum/uint8.mjs +46 -155
  255. package/dist/number/enum/uint8.mjs.map +1 -1
  256. package/dist/number/num.d.mts +145 -206
  257. package/dist/number/num.d.mts.map +1 -1
  258. package/dist/number/num.mjs +143 -199
  259. package/dist/number/num.mjs.map +1 -1
  260. package/dist/number/refined-number-utils.d.mts +97 -21
  261. package/dist/number/refined-number-utils.d.mts.map +1 -1
  262. package/dist/number/refined-number-utils.mjs +91 -20
  263. package/dist/number/refined-number-utils.mjs.map +1 -1
  264. package/dist/object/object.d.mts +126 -208
  265. package/dist/object/object.d.mts.map +1 -1
  266. package/dist/object/object.mjs +68 -102
  267. package/dist/object/object.mjs.map +1 -1
  268. package/dist/others/cast-mutable.d.mts +12 -88
  269. package/dist/others/cast-mutable.d.mts.map +1 -1
  270. package/dist/others/cast-mutable.mjs +13 -89
  271. package/dist/others/cast-mutable.mjs.map +1 -1
  272. package/dist/others/cast-readonly.d.mts +12 -168
  273. package/dist/others/cast-readonly.d.mts.map +1 -1
  274. package/dist/others/cast-readonly.mjs +13 -169
  275. package/dist/others/cast-readonly.mjs.map +1 -1
  276. package/dist/others/if-then.d.mts +6 -83
  277. package/dist/others/if-then.d.mts.map +1 -1
  278. package/dist/others/if-then.mjs +6 -83
  279. package/dist/others/if-then.mjs.map +1 -1
  280. package/dist/others/map-nullable.d.mts +12 -136
  281. package/dist/others/map-nullable.d.mts.map +1 -1
  282. package/dist/others/map-nullable.mjs.map +1 -1
  283. package/dist/others/memoize-function.d.mts +14 -157
  284. package/dist/others/memoize-function.d.mts.map +1 -1
  285. package/dist/others/memoize-function.mjs +14 -157
  286. package/dist/others/memoize-function.mjs.map +1 -1
  287. package/dist/others/tuple.d.mts +33 -151
  288. package/dist/others/tuple.d.mts.map +1 -1
  289. package/dist/others/tuple.mjs +33 -151
  290. package/dist/others/tuple.mjs.map +1 -1
  291. package/dist/others/unknown-to-string.d.mts +11 -125
  292. package/dist/others/unknown-to-string.d.mts.map +1 -1
  293. package/dist/others/unknown-to-string.mjs +12 -126
  294. package/dist/others/unknown-to-string.mjs.map +1 -1
  295. package/dist/promise/promise.d.mts +33 -20
  296. package/dist/promise/promise.d.mts.map +1 -1
  297. package/dist/promise/promise.mjs +34 -21
  298. package/dist/promise/promise.mjs.map +1 -1
  299. package/package.json +47 -39
  300. package/src/array/impl/array-utils-creation.mts +192 -0
  301. package/src/array/{array-utils-creation.test.mts → impl/array-utils-creation.test.mts} +121 -72
  302. package/src/array/impl/array-utils-element-access.mts +115 -0
  303. package/src/array/impl/array-utils-element-access.test.mts +151 -0
  304. package/src/array/impl/array-utils-iterators.mts +79 -0
  305. package/src/array/impl/array-utils-iterators.test.mts +98 -0
  306. package/src/array/impl/array-utils-modification.mts +434 -0
  307. package/src/array/{array-utils-modification.test.mts → impl/array-utils-modification.test.mts} +41 -28
  308. package/src/array/{array-utils-overload-type-error.test.mts → impl/array-utils-overload-type-error.test.mts} +33 -33
  309. package/src/array/impl/array-utils-reducing-value.mts +551 -0
  310. package/src/array/{array-utils-reducing-value.test.mts → impl/array-utils-reducing-value.test.mts} +45 -50
  311. package/src/array/impl/array-utils-search.mts +509 -0
  312. package/src/array/impl/array-utils-search.test.mts +346 -0
  313. package/src/array/impl/array-utils-set-op.mts +166 -0
  314. package/src/array/{array-utils-set-op.test.mts → impl/array-utils-set-op.test.mts} +42 -35
  315. package/src/array/impl/array-utils-size.mts +30 -0
  316. package/src/array/impl/array-utils-size.test.mts +9 -0
  317. package/src/array/impl/array-utils-slice-clamped.mts +51 -0
  318. package/src/array/{array-utils-slice-clamped.test.mts → impl/array-utils-slice-clamped.test.mts} +12 -12
  319. package/src/array/impl/array-utils-slicing.mts +275 -0
  320. package/src/array/impl/array-utils-slicing.test.mts +158 -0
  321. package/src/array/impl/array-utils-transformation.mts +746 -0
  322. package/src/array/{array-utils-transformation.test.mts → impl/array-utils-transformation.test.mts} +662 -889
  323. package/src/array/impl/array-utils-validation.mts +241 -0
  324. package/src/array/{array-utils-validation.test.mts → impl/array-utils-validation.test.mts} +194 -107
  325. package/src/array/{array.test.mts → impl/array.test.mts} +2 -2
  326. package/src/array/impl/index.mts +12 -0
  327. package/src/array/index.mts +1 -1
  328. package/src/collections/imap-mapped.mts +99 -265
  329. package/src/collections/imap.mts +477 -174
  330. package/src/collections/imap.test.mts +12 -19
  331. package/src/collections/iset-mapped.mts +892 -358
  332. package/src/collections/iset.mts +429 -213
  333. package/src/collections/queue.mts +174 -200
  334. package/src/collections/stack.mts +172 -245
  335. package/src/collections/stack.test.mts +9 -1
  336. package/src/entry-point.mts +1 -0
  337. package/src/expect-type.mts +43 -172
  338. package/src/functional/match.mts +35 -145
  339. package/src/functional/optional.mts +285 -163
  340. package/src/functional/optional.test.mts +4 -1
  341. package/src/functional/pipe.mts +60 -113
  342. package/src/functional/result.mts +452 -351
  343. package/src/functional/result.test.mts +9 -2
  344. package/src/globals.d.mts +12 -5
  345. package/src/guard/has-key.mts +23 -74
  346. package/src/guard/is-non-empty-string.mts +20 -87
  347. package/src/guard/is-non-null-object.mts +14 -84
  348. package/src/guard/is-non-null-object.test.mts +1 -1
  349. package/src/guard/is-primitive.mts +13 -126
  350. package/src/guard/is-primitive.test.mts +1 -1
  351. package/src/guard/is-record.mts +21 -132
  352. package/src/guard/is-type.mts +201 -238
  353. package/src/guard/is-type.test.mts +7 -7
  354. package/src/guard/key-is-in.mts +22 -139
  355. package/src/index.mts +0 -1
  356. package/src/iterator/range.mts +29 -62
  357. package/src/json/json.mts +202 -134
  358. package/src/json/json.test.mts +1 -3
  359. package/src/number/branded-types/finite-number.mts +27 -159
  360. package/src/number/branded-types/int.mts +122 -120
  361. package/src/number/branded-types/int16.mts +22 -30
  362. package/src/number/branded-types/int16.test.mts +24 -24
  363. package/src/number/branded-types/int32.mts +22 -31
  364. package/src/number/branded-types/int32.test.mts +39 -39
  365. package/src/number/branded-types/non-negative-finite-number.mts +31 -39
  366. package/src/number/branded-types/non-negative-int16.mts +24 -34
  367. package/src/number/branded-types/non-negative-int16.test.mts +16 -16
  368. package/src/number/branded-types/non-negative-int32.mts +26 -35
  369. package/src/number/branded-types/non-negative-int32.test.mts +30 -30
  370. package/src/number/branded-types/non-zero-finite-number.mts +25 -40
  371. package/src/number/branded-types/non-zero-int.mts +15 -30
  372. package/src/number/branded-types/non-zero-int16.mts +27 -35
  373. package/src/number/branded-types/non-zero-int16.test.mts +26 -26
  374. package/src/number/branded-types/non-zero-int32.mts +29 -36
  375. package/src/number/branded-types/non-zero-int32.test.mts +45 -42
  376. package/src/number/branded-types/non-zero-safe-int.mts +39 -40
  377. package/src/number/branded-types/non-zero-uint16.mts +24 -35
  378. package/src/number/branded-types/non-zero-uint16.test.mts +16 -16
  379. package/src/number/branded-types/non-zero-uint32.mts +24 -35
  380. package/src/number/branded-types/non-zero-uint32.test.mts +28 -28
  381. package/src/number/branded-types/positive-finite-number.mts +29 -43
  382. package/src/number/branded-types/positive-int.mts +134 -124
  383. package/src/number/branded-types/positive-int16.mts +24 -35
  384. package/src/number/branded-types/positive-int16.test.mts +14 -14
  385. package/src/number/branded-types/positive-int32.mts +24 -35
  386. package/src/number/branded-types/positive-int32.test.mts +26 -26
  387. package/src/number/branded-types/positive-safe-int.mts +160 -34
  388. package/src/number/branded-types/positive-uint16.mts +24 -35
  389. package/src/number/branded-types/positive-uint16.test.mts +16 -16
  390. package/src/number/branded-types/positive-uint32.mts +26 -36
  391. package/src/number/branded-types/positive-uint32.test.mts +31 -28
  392. package/src/number/branded-types/safe-int.mts +142 -101
  393. package/src/number/branded-types/safe-uint.mts +25 -34
  394. package/src/number/branded-types/uint.mts +121 -30
  395. package/src/number/branded-types/uint16.mts +26 -34
  396. package/src/number/branded-types/uint16.test.mts +16 -16
  397. package/src/number/branded-types/uint32.mts +26 -68
  398. package/src/number/branded-types/uint32.test.mts +28 -28
  399. package/src/number/enum/int8.mts +39 -170
  400. package/src/number/enum/uint8.mts +46 -155
  401. package/src/number/num.mts +157 -212
  402. package/src/number/num.test.mts +4 -4
  403. package/src/number/refined-number-utils.mts +109 -26
  404. package/src/object/object.mts +130 -212
  405. package/src/object/object.test.mts +29 -0
  406. package/src/others/cast-mutable.mts +13 -89
  407. package/src/others/cast-mutable.test.mts +80 -0
  408. package/src/others/cast-readonly.mts +13 -169
  409. package/src/others/if-then.mts +6 -83
  410. package/src/others/map-nullable.mts +12 -136
  411. package/src/others/map-nullable.test.mts +6 -6
  412. package/src/others/memoize-function.mts +14 -157
  413. package/src/others/tuple.mts +33 -151
  414. package/src/others/unknown-to-string.mts +12 -126
  415. package/src/others/unknown-to-string.test.mts +13 -1
  416. package/src/promise/promise.mts +34 -21
  417. package/src/promise/promise.test.mts +43 -0
  418. package/dist/array/array-utils.d.mts +0 -2956
  419. package/dist/array/array-utils.d.mts.map +0 -1
  420. package/dist/array/array-utils.mjs +0 -1838
  421. package/dist/array/array-utils.mjs.map +0 -1
  422. package/src/array/array-utils-search.test.mts +0 -169
  423. package/src/array/array-utils-slicing.test.mts +0 -274
  424. package/src/array/array-utils.mts +0 -4834
@@ -1,102 +1,111 @@
1
- import { expectType } from '../expect-type.mjs';
2
- import { range } from '../iterator/index.mjs';
3
- import { asNonZeroSafeInt, asUint32 } from '../number/index.mjs';
4
- import { Arr } from './array-utils.mjs';
1
+ import { expectType } from '../../expect-type.mjs';
2
+ import { range as rangeIterator } from '../../iterator/index.mjs';
3
+ import { asNonZeroSafeInt, asUint32 } from '../../number/index.mjs';
4
+ import {
5
+ copy,
6
+ create,
7
+ generate,
8
+ generateAsync,
9
+ newArray,
10
+ range,
11
+ seq,
12
+ zeros,
13
+ } from './array-utils-creation.mjs';
5
14
 
6
15
  describe('Arr creations', () => {
7
16
  describe('zeros', () => {
8
17
  test('fixed length', () => {
9
- const result = Arr.zeros(3);
18
+ const result = zeros(3);
10
19
  expectType<typeof result, readonly [0, 0, 0]>('=');
11
20
  expect(result).toStrictEqual([0, 0, 0]);
12
21
  });
13
22
 
14
23
  test('fixed length (empty)', () => {
15
- const result = Arr.zeros(0);
24
+ const result = zeros(0);
16
25
  expectType<typeof result, readonly []>('=');
17
26
  expect(result).toStrictEqual([]);
18
27
  });
19
28
 
20
29
  test('unknown length', () => {
21
30
  const n: number = 3;
22
- const result = Arr.zeros(asUint32(n));
31
+ const result = zeros(asUint32(n));
23
32
  expectType<typeof result, readonly 0[]>('=');
24
33
  expect(result).toStrictEqual([0, 0, 0]);
25
34
  });
26
35
 
27
36
  test('should create array with zero length', () => {
28
- const result = Arr.zeros(0);
37
+ const result = zeros(0);
29
38
  expect(result).toStrictEqual([]);
30
39
  expect(result).toHaveLength(0);
31
40
  });
32
41
 
33
42
  test('should create large arrays', () => {
34
- const result = Arr.zeros(asUint32(1000));
43
+ const result = zeros(asUint32(1000));
35
44
  expect(result).toHaveLength(1000);
36
45
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
37
46
  expect(result.every((x) => x === 0)).toBe(true);
38
47
  });
39
48
 
40
49
  test('should work with curried version', () => {
41
- const createTenZeros = Arr.zeros(10);
50
+ const createTenZeros = zeros(10);
42
51
  expect(createTenZeros).toStrictEqual([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
43
52
  });
44
53
  });
45
54
 
46
55
  describe('seq', () => {
47
56
  test('fixed length', () => {
48
- const result = Arr.seq(5);
57
+ const result = seq(5);
49
58
  expectType<typeof result, readonly [0, 1, 2, 3, 4]>('=');
50
59
  expect(result).toStrictEqual([0, 1, 2, 3, 4]);
51
60
  });
52
61
 
53
62
  test('fixed length (empty)', () => {
54
- const result = Arr.seq(0);
63
+ const result = seq(0);
55
64
  expectType<typeof result, readonly []>('=');
56
65
  expect(result).toStrictEqual([]);
57
66
  });
58
67
 
59
68
  test('unknown length', () => {
60
69
  const n: number = 3;
61
- const result = Arr.seq(asUint32(n));
70
+ const result = seq(asUint32(n));
62
71
  expectType<typeof result, readonly SizeType.Arr[]>('=');
63
72
  expect(result).toStrictEqual([0, 1, 2]);
64
73
  });
65
74
 
66
75
  test('should create sequence with zero length', () => {
67
- const result = Arr.seq(0);
76
+ const result = seq(0);
68
77
  expect(result).toStrictEqual([]);
69
78
  });
70
79
 
71
80
  test('should create sequence with large length', () => {
72
- const result = Arr.seq(asUint32(100));
81
+ const result = seq(asUint32(100));
73
82
  expect(result).toHaveLength(100);
74
83
  expect(result[0]).toBe(0);
75
84
  expect(result[99]).toBe(99);
76
85
  });
77
86
 
78
87
  test('should work with curried version', () => {
79
- const createFiveSeq = Arr.seq(5);
88
+ const createFiveSeq = seq(5);
80
89
  expect(createFiveSeq).toStrictEqual([0, 1, 2, 3, 4]);
81
90
  });
82
91
  });
83
92
 
84
93
  describe('create', () => {
85
94
  test('fixed length with primitive value', () => {
86
- const result = Arr.create(3, 'a');
95
+ const result = create(3, 'a');
87
96
  expectType<typeof result, readonly ['a', 'a', 'a']>('=');
88
97
  expect(result).toStrictEqual(['a', 'a', 'a']);
89
98
  });
90
99
 
91
100
  test('fixed length with null', () => {
92
- const result = Arr.create(2, null);
101
+ const result = create(2, null);
93
102
  expectType<typeof result, readonly [null, null]>('=');
94
103
  expect(result).toStrictEqual([null, null]);
95
104
  });
96
105
 
97
106
  test('fixed length with object (shallow copy)', () => {
98
107
  const obj = { id: 1 };
99
- const result = Arr.create(2, obj);
108
+ const result = create(2, obj);
100
109
  expectType<typeof result, readonly [{ id: number }, { id: number }]>(
101
110
  '~=',
102
111
  );
@@ -106,40 +115,40 @@ describe('Arr creations', () => {
106
115
  });
107
116
 
108
117
  test('fixed length (empty)', () => {
109
- const result = Arr.create(0, 123);
118
+ const result = create(0, 123);
110
119
  expectType<typeof result, readonly []>('=');
111
120
  expect(result).toStrictEqual([]);
112
121
  });
113
122
 
114
123
  test('unknown length', () => {
115
124
  const n: number = 2;
116
- const result = Arr.create(asUint32(n), true);
125
+ const result = create(asUint32(n), true);
117
126
  expectType<typeof result, readonly true[]>('=');
118
127
  expect(result).toStrictEqual([true, true]);
119
128
  });
120
129
 
121
130
  test('should create array with function values', () => {
122
131
  const fn = (): string => 'test';
123
- const result = Arr.create(3, fn);
132
+ const result = create(3, fn);
124
133
  expect(result).toStrictEqual([fn, fn, fn]);
125
134
  expect(result[0]).toBe(fn);
126
135
  });
127
136
 
128
137
  test('should create array with object values', () => {
129
138
  const obj = { a: 1 };
130
- const result = Arr.create(2, obj);
139
+ const result = create(2, obj);
131
140
  expect(result).toStrictEqual([obj, obj]);
132
141
  expect(result[0]).toBe(obj); // Same reference
133
142
  });
134
143
 
135
144
  test('should create empty array when length is 0', () => {
136
- const result = Arr.create(0, 'value');
145
+ const result = create(0, 'value');
137
146
  expect(result).toStrictEqual([]);
138
147
  });
139
148
 
140
149
  test('newArray is alias for create', () => {
141
- const created1 = Arr.create(3, 'test');
142
- const created2 = Arr.newArray(3, 'test');
150
+ const created1 = create(3, 'test');
151
+ const created2 = newArray(3, 'test');
143
152
  expect(created1).toStrictEqual(created2);
144
153
  expect(created1).toStrictEqual(['test', 'test', 'test']);
145
154
  });
@@ -148,7 +157,7 @@ describe('Arr creations', () => {
148
157
  describe('copy', () => {
149
158
  test('should create a shallow copy of an array of primitives', () => {
150
159
  const original = [1, 2, 3] as const;
151
- const copied = Arr.copy(original);
160
+ const copied = copy(original);
152
161
  expectType<typeof copied, readonly [1, 2, 3]>('=');
153
162
  expect(copied).toStrictEqual(original);
154
163
  expect(copied).not.toBe(original);
@@ -158,7 +167,7 @@ describe('Arr creations', () => {
158
167
  const obj1 = { id: 1 };
159
168
  const obj2 = { id: 2 };
160
169
  const original = [obj1, obj2] as const;
161
- const copied = Arr.copy(original);
170
+ const copied = copy(original);
162
171
 
163
172
  expectType<typeof copied, readonly [{ id: number }, { id: number }]>('=');
164
173
  expect(copied).toStrictEqual(original);
@@ -169,7 +178,7 @@ describe('Arr creations', () => {
169
178
 
170
179
  test('should create a copy of an empty array', () => {
171
180
  const original = [] as const;
172
- const copied = Arr.copy(original);
181
+ const copied = copy(original);
173
182
  expectType<typeof copied, readonly []>('=');
174
183
  expect(copied).toStrictEqual(original);
175
184
  expect(copied).not.toBe(original);
@@ -177,7 +186,7 @@ describe('Arr creations', () => {
177
186
 
178
187
  test('should create a copy of an array with mixed types', () => {
179
188
  const original = [1, 'hello', true, null, undefined] as const;
180
- const copied = Arr.copy(original);
189
+ const copied = copy(original);
181
190
  expectType<typeof copied, readonly [1, 'hello', true, null, undefined]>(
182
191
  '=',
183
192
  );
@@ -187,7 +196,7 @@ describe('Arr creations', () => {
187
196
 
188
197
  test('should handle unknown array type', () => {
189
198
  const mut_original: number[] = [1, 2, 3];
190
- const copied = Arr.copy(mut_original);
199
+ const copied = copy(mut_original);
191
200
  expectType<typeof copied, number[]>('=');
192
201
  expect(copied).toStrictEqual(mut_original);
193
202
  expect(copied).not.toBe(mut_original);
@@ -199,7 +208,7 @@ describe('Arr creations', () => {
199
208
 
200
209
  test('should create shallow copy of array', () => {
201
210
  const original = [1, 2, 3] as const;
202
- const copied = Arr.copy(original);
211
+ const copied = copy(original);
203
212
  expectType<typeof copied, readonly [1, 2, 3]>('=');
204
213
  expect(copied).toStrictEqual(original);
205
214
  expect(copied).not.toBe(original);
@@ -207,14 +216,14 @@ describe('Arr creations', () => {
207
216
 
208
217
  test('should work with empty array', () => {
209
218
  const empty = [] as const;
210
- const copied = Arr.copy(empty);
219
+ const copied = copy(empty);
211
220
  expect(copied).toStrictEqual([]);
212
221
  expect(copied).not.toBe(empty);
213
222
  });
214
223
 
215
224
  test('should preserve array type', () => {
216
225
  const mixed = [1, 'hello', true] as const;
217
- const copied = Arr.copy(mixed);
226
+ const copied = copy(mixed);
218
227
  expectType<typeof copied, readonly [1, 'hello', true]>('=');
219
228
  expect(copied).toStrictEqual([1, 'hello', true]);
220
229
  });
@@ -222,51 +231,51 @@ describe('Arr creations', () => {
222
231
 
223
232
  describe('range', () => {
224
233
  test('start < end, step = 1 (default)', () => {
225
- const result = Arr.range(1, 5);
234
+ const result = range(1, 5);
226
235
  expectType<typeof result, readonly [1, 2, 3, 4]>('=');
227
236
  expect(result).toStrictEqual([1, 2, 3, 4]);
228
237
  });
229
238
 
230
239
  test('start === end, step = 1 (default)', () => {
231
- const result = Arr.range(3, 3);
240
+ const result = range(3, 3);
232
241
  expectType<typeof result, readonly []>('=');
233
242
  expect(result).toStrictEqual([]);
234
243
  });
235
244
 
236
245
  test('start > end, step = 1 (default)', () => {
237
- const result = Arr.range(5, 1);
246
+ const result = range(5, 1);
238
247
  expectType<typeof result, readonly []>('=');
239
248
  expect(result).toStrictEqual([]);
240
249
  });
241
250
 
242
251
  test('start < end, step > 1', () => {
243
- const result = Arr.range(0, 6, 2);
252
+ const result = range(0, 6, 2);
244
253
  expectType<typeof result, readonly SafeUint[]>('='); // Type is less specific with explicit step
245
254
  expect(result).toStrictEqual([0, 2, 4]);
246
255
  });
247
256
 
248
257
  test('start < end, step > 1, not reaching end', () => {
249
- const result = Arr.range(0, 5, 2);
258
+ const result = range(0, 5, 2);
250
259
  expect(result).toStrictEqual([0, 2, 4]);
251
260
  });
252
261
 
253
262
  test('start > end, step < 0', () => {
254
- const result = Arr.range(5, 0, -1);
263
+ const result = range(5, 0, -1);
255
264
  expect(result).toStrictEqual([5, 4, 3, 2, 1]);
256
265
  });
257
266
 
258
267
  test('start > end, step < 0, not reaching end', () => {
259
- const result = Arr.range(5, 1, -2);
268
+ const result = range(5, 1, -2);
260
269
  expect(result).toStrictEqual([5, 3]);
261
270
  });
262
271
 
263
272
  test('start < end, step < 0 (empty result)', () => {
264
- const result = Arr.range(1, 5, -1);
273
+ const result = range(1, 5, -1);
265
274
  expect(result).toStrictEqual([]);
266
275
  });
267
276
 
268
277
  test('start > end, step > 0 (empty result)', () => {
269
- const result = Arr.range(5, 1, 1);
278
+ const result = range(5, 1, 1);
270
279
  expect(result).toStrictEqual([]);
271
280
  });
272
281
 
@@ -274,7 +283,7 @@ describe('Arr creations', () => {
274
283
  const start: number = 1;
275
284
  const end: number = 4;
276
285
  const step: number = 1;
277
- const result = Arr.range(
286
+ const result = range(
278
287
  asUint32(start),
279
288
  asUint32(end),
280
289
  asNonZeroSafeInt(step),
@@ -284,7 +293,7 @@ describe('Arr creations', () => {
284
293
  });
285
294
 
286
295
  test('range(1, 3)', () => {
287
- const result = Arr.range(1, 3);
296
+ const result = range(1, 3);
288
297
 
289
298
  expectType<typeof result, readonly [1, 2]>('=');
290
299
 
@@ -292,7 +301,7 @@ describe('Arr creations', () => {
292
301
  });
293
302
 
294
303
  test('range(1, 3, 1)', () => {
295
- const result = Arr.range(1, 3, 1);
304
+ const result = range(1, 3, 1);
296
305
 
297
306
  expectType<typeof result, readonly [1, 2]>('=');
298
307
 
@@ -300,7 +309,7 @@ describe('Arr creations', () => {
300
309
  });
301
310
 
302
311
  test('range(0, 0)', () => {
303
- const result = Arr.range(0, 0);
312
+ const result = range(0, 0);
304
313
 
305
314
  expectType<typeof result, readonly []>('=');
306
315
 
@@ -308,7 +317,7 @@ describe('Arr creations', () => {
308
317
  });
309
318
 
310
319
  test('range(0, 1)', () => {
311
- const result = Arr.range(0, 1);
320
+ const result = range(0, 1);
312
321
 
313
322
  expectType<typeof result, readonly [0]>('=');
314
323
 
@@ -316,7 +325,7 @@ describe('Arr creations', () => {
316
325
  });
317
326
 
318
327
  test('range(0, -1)', () => {
319
- const result = Arr.range(0, -1);
328
+ const result = range(0, -1);
320
329
 
321
330
  expectType<typeof result, readonly SafeInt[]>('=');
322
331
 
@@ -324,7 +333,7 @@ describe('Arr creations', () => {
324
333
  });
325
334
 
326
335
  test('range(SmallUint, SmallUint)', () => {
327
- const result = Arr.range<SmallUint, SmallUint>(0, 1);
336
+ const result = range<SmallUint, SmallUint>(0, 1);
328
337
 
329
338
  expectType<
330
339
  typeof result,
@@ -375,7 +384,7 @@ describe('Arr creations', () => {
375
384
  });
376
385
 
377
386
  test('range(0 | 1 | 2, 1 | 2 | 3)', () => {
378
- const result = Arr.range<0 | 1 | 2, 1 | 2 | 3>(0, 1);
387
+ const result = range<0 | 1 | 2, 1 | 2 | 3>(0, 1);
379
388
 
380
389
  expectType<typeof result, readonly (0 | 1 | 2)[]>('=');
381
390
 
@@ -383,7 +392,7 @@ describe('Arr creations', () => {
383
392
  });
384
393
 
385
394
  test('range(2|3, 5|6|7)', () => {
386
- const result = Arr.range<2 | 3, 5 | 6 | 7>(2, 5);
395
+ const result = range<2 | 3, 5 | 6 | 7>(2, 5);
387
396
 
388
397
  expectType<typeof result, readonly (2 | 3 | 4 | 5 | 6)[]>('=');
389
398
 
@@ -391,7 +400,7 @@ describe('Arr creations', () => {
391
400
  });
392
401
 
393
402
  test('range(0, 10, 2)', () => {
394
- const result = Arr.range(0, 10, 2);
403
+ const result = range(0, 10, 2);
395
404
 
396
405
  expectType<typeof result, readonly SafeUint[]>('=');
397
406
 
@@ -399,7 +408,7 @@ describe('Arr creations', () => {
399
408
  });
400
409
 
401
410
  test('range(0, 11, 2)', () => {
402
- const result = Arr.range(0, 11, 2);
411
+ const result = range(0, 11, 2);
403
412
 
404
413
  expectType<typeof result, readonly SafeUint[]>('=');
405
414
 
@@ -407,7 +416,7 @@ describe('Arr creations', () => {
407
416
  });
408
417
 
409
418
  test('range(1, 12, 2)', () => {
410
- const result = Arr.range(1, 12, 2);
419
+ const result = range(1, 12, 2);
411
420
 
412
421
  expectType<typeof result, readonly SafeUint[]>('=');
413
422
 
@@ -418,25 +427,25 @@ describe('Arr creations', () => {
418
427
  // and doesn't validate inputs in this way
419
428
 
420
429
  test('should handle range with step larger than difference', () => {
421
- const result = Arr.range(0, 5, 10);
430
+ const result = range(0, 5, 10);
422
431
  expect(result).toStrictEqual([0]);
423
432
  });
424
433
 
425
434
  test('should handle negative step with increasing range', () => {
426
- const result = Arr.range(0, 5, -1);
435
+ const result = range(0, 5, -1);
427
436
  expect(result).toStrictEqual([]); // Should be empty when step direction conflicts
428
437
  });
429
438
 
430
439
  test('should work with basic range functionality', () => {
431
440
  // Test basic range functionality without currying assumptions
432
- const result = Arr.range(0, 5, 1);
441
+ const result = range(0, 5, 1);
433
442
  expect(result).toStrictEqual([0, 1, 2, 3, 4]);
434
443
  });
435
444
  });
436
445
 
437
446
  describe('generate', () => {
438
447
  test('basic generator usage', () => {
439
- const result = Arr.generate<number>(function* () {
448
+ const result = generate<number>(function* () {
440
449
  yield 1;
441
450
  yield 2;
442
451
  yield 3;
@@ -447,7 +456,7 @@ describe('Arr creations', () => {
447
456
  });
448
457
 
449
458
  test('generator with yield*', () => {
450
- const result = Arr.generate<number>(function* () {
459
+ const result = generate<number>(function* () {
451
460
  yield 1;
452
461
  yield* [2, 3];
453
462
  yield 4;
@@ -458,7 +467,7 @@ describe('Arr creations', () => {
458
467
  });
459
468
 
460
469
  test('empty generator', () => {
461
- const result = Arr.generate<string>(function* () {
470
+ const result = generate<string>(function* () {
462
471
  // No yields
463
472
  });
464
473
 
@@ -468,7 +477,7 @@ describe('Arr creations', () => {
468
477
 
469
478
  test('generator with conditional logic', () => {
470
479
  const condition = true as boolean; // Simulating a condition
471
- const result = Arr.generate<number>(function* () {
480
+ const result = generate<number>(function* () {
472
481
  yield 1;
473
482
  if (condition) {
474
483
  yield 2;
@@ -482,7 +491,7 @@ describe('Arr creations', () => {
482
491
 
483
492
  test('generator with early return', () => {
484
493
  const condition = true as boolean; // Simulating a condition
485
- const result = Arr.generate<number>(function* () {
494
+ const result = generate<number>(function* () {
486
495
  yield 1;
487
496
  if (condition) {
488
497
  return; // Early return is OK
@@ -495,7 +504,7 @@ describe('Arr creations', () => {
495
504
  });
496
505
 
497
506
  test('generator with complex data types', () => {
498
- const result = Arr.generate<{ id: number; name: string }>(function* () {
507
+ const result = generate<{ id: number; name: string }>(function* () {
499
508
  yield { id: 1, name: 'Alice' };
500
509
  yield { id: 2, name: 'Bob' };
501
510
  });
@@ -508,7 +517,7 @@ describe('Arr creations', () => {
508
517
  });
509
518
 
510
519
  test('generator with different types', () => {
511
- const result = Arr.generate<string | number>(function* () {
520
+ const result = generate<string | number>(function* () {
512
521
  yield 'hello';
513
522
  yield 42;
514
523
  yield 'world';
@@ -519,8 +528,8 @@ describe('Arr creations', () => {
519
528
  });
520
529
 
521
530
  test('generator with loops', () => {
522
- const result = Arr.generate<number>(function* () {
523
- for (const i of range(3)) {
531
+ const result = generate<number>(function* () {
532
+ for (const i of rangeIterator(3)) {
524
533
  yield i;
525
534
  }
526
535
  });
@@ -530,11 +539,51 @@ describe('Arr creations', () => {
530
539
  });
531
540
  });
532
541
 
533
- describe('size/length', () => {
534
- test('length should be alias for size', () => {
535
- const array = [1, 2, 3];
536
- expect(Arr.length(array)).toBe(Arr.size(array));
537
- expect(Arr.length(array)).toBe(3);
542
+ describe('generateAsync', () => {
543
+ test('should generate array from async generator', async () => {
544
+ // eslint-disable-next-line @typescript-eslint/require-await
545
+ const result = await generateAsync<number>(async function* () {
546
+ yield 1;
547
+ yield 2;
548
+ yield 3;
549
+ });
550
+
551
+ expectType<typeof result, readonly number[]>('=');
552
+ expect(result).toStrictEqual([1, 2, 3]);
553
+ });
554
+
555
+ test('should handle async operations in generator', async () => {
556
+ const result = await generateAsync<string>(async function* () {
557
+ await Promise.resolve();
558
+ yield 'a';
559
+ await Promise.resolve();
560
+ yield 'b';
561
+ await Promise.resolve();
562
+ yield 'c';
563
+ });
564
+
565
+ expect(result).toStrictEqual(['a', 'b', 'c']);
566
+ });
567
+
568
+ test('should generate empty array from empty async generator', async () => {
569
+ const result = await generateAsync<number>(async function* () {
570
+ // Empty generator
571
+ });
572
+
573
+ expect(result).toStrictEqual([]);
574
+ });
575
+
576
+ test('should handle async generator with delays', async () => {
577
+ const result = await generateAsync<number>(async function* () {
578
+ // eslint-disable-next-line functional/no-let
579
+ for (let i = 0; i < 3; i++) {
580
+ // eslint-disable-next-line no-promise-executor-return, no-await-in-loop
581
+ await new Promise((resolve) => setTimeout(resolve, 0));
582
+ yield i;
583
+ }
584
+ });
585
+
586
+ expect(result).toStrictEqual([0, 1, 2]);
538
587
  });
539
588
  });
540
589
  });
@@ -0,0 +1,115 @@
1
+ import { Optional, pipe } from '../../functional/index.mjs';
2
+
3
+ /**
4
+ * Safely retrieves an element at a given index from an array, returning an Optional.
5
+ *
6
+ * @example
7
+ *
8
+ * ```ts
9
+ * const letters: readonly string[] = ['a', 'b', 'c'];
10
+ *
11
+ * const two = Arr.at(letters, 1);
12
+ * const last = Arr.at(-1)(letters);
13
+ * const missing = Arr.at(letters, 5);
14
+ *
15
+ * assert.deepStrictEqual(two, Optional.some('b'));
16
+ * assert.deepStrictEqual(last, Optional.some('c'));
17
+ * assert.deepStrictEqual(missing, Optional.none);
18
+ * ```
19
+ */
20
+ export function at<const Ar extends readonly unknown[]>(
21
+ array: Ar,
22
+ index: ArgArrayIndexWithNegative<Ar>,
23
+ ): Optional<Ar[number]>;
24
+
25
+ // Curried version
26
+
27
+ export function at(
28
+ index: SizeType.ArgArrWithNegative,
29
+ ): <E>(array: readonly E[]) => Optional<E>;
30
+
31
+ export function at<E>(
32
+ ...args:
33
+ | readonly [array: readonly E[], index: SizeType.ArgArrWithNegative]
34
+ | readonly [index: SizeType.ArgArrWithNegative]
35
+ ): Optional<E> | ((array: readonly E[]) => Optional<E>) {
36
+ switch (args.length) {
37
+ case 2: {
38
+ const [array, index] = args;
39
+ return pipe(index < 0 ? array.length + index : index).map(
40
+ (normalizedIndex) =>
41
+ normalizedIndex < 0 || normalizedIndex >= array.length
42
+ ? Optional.none
43
+ : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
44
+ Optional.some(array[normalizedIndex]!),
45
+ ).value;
46
+ }
47
+ case 1: {
48
+ const [index] = args;
49
+ return (array) => at(array, index);
50
+ }
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Returns the first element of an array as an Optional.
56
+ *
57
+ * @example
58
+ *
59
+ * ```ts
60
+ * const users = [{ id: 1 }, { id: 2 }];
61
+ * const empty: { id: number }[] = [];
62
+ *
63
+ * const first = Arr.head(users);
64
+ * const none = Arr.head(empty);
65
+ *
66
+ * assert.deepStrictEqual(first, Optional.some({ id: 1 }));
67
+ * assert.deepStrictEqual(none, Optional.none);
68
+ * ```
69
+ */
70
+ export const head = <const Ar extends readonly unknown[]>(
71
+ array: Ar,
72
+ ): Ar extends readonly []
73
+ ? Optional.None
74
+ : Ar extends readonly [infer E, ...unknown[]]
75
+ ? Optional.Some<E>
76
+ : Ar extends NonEmptyArray<infer E>
77
+ ? Optional.Some<E>
78
+ : Optional<Ar[number]> =>
79
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
80
+ (array.length === 0 ? Optional.none : Optional.some(array.at(0))) as never;
81
+
82
+ /**
83
+ * Returns the last element of an array as an Optional.
84
+ *
85
+ * @example
86
+ *
87
+ * ```ts
88
+ * const queue = ['first', 'second'];
89
+ * const emptyQueue: string[] = [];
90
+ *
91
+ * const lastValue = Arr.last(queue);
92
+ * const none = Arr.last(emptyQueue);
93
+ *
94
+ * assert.deepStrictEqual(lastValue, Optional.some('second'));
95
+ * assert.deepStrictEqual(none, Optional.none);
96
+ * ```
97
+ */
98
+ export const last = <const Ar extends readonly unknown[]>(
99
+ array: Ar,
100
+ ): Ar extends readonly []
101
+ ? Optional.None
102
+ : Ar extends readonly [...unknown[], infer E]
103
+ ? Optional.Some<E>
104
+ : Ar extends NonEmptyArray<infer E>
105
+ ? Optional.Some<E>
106
+ : Optional<Ar[number]> =>
107
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
108
+ (array.length === 0 ? Optional.none : Optional.some(array.at(-1))) as never;
109
+
110
+ /**
111
+ * Alias for `head`.
112
+ *
113
+ * @see {@link head}
114
+ */
115
+ export const first = head;