@vielzeug/toolkit 1.1.3 → 2.1.0

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 (764) hide show
  1. package/README.md +325 -452
  2. package/dist/array/chunk.cjs +2 -2
  3. package/dist/array/chunk.cjs.map +1 -1
  4. package/dist/array/chunk.d.ts +29 -0
  5. package/dist/array/chunk.d.ts.map +1 -0
  6. package/dist/array/chunk.js +22 -24
  7. package/dist/array/chunk.js.map +1 -1
  8. package/dist/array/contains.cjs +2 -2
  9. package/dist/array/contains.cjs.map +1 -1
  10. package/dist/array/contains.d.ts +19 -0
  11. package/dist/array/contains.d.ts.map +1 -0
  12. package/dist/array/contains.js +12 -9
  13. package/dist/array/contains.js.map +1 -1
  14. package/dist/array/fold.cjs +2 -0
  15. package/dist/array/fold.cjs.map +1 -0
  16. package/dist/array/fold.d.ts +21 -0
  17. package/dist/array/fold.d.ts.map +1 -0
  18. package/dist/array/fold.js +19 -0
  19. package/dist/array/fold.js.map +1 -0
  20. package/dist/array/group.cjs +2 -2
  21. package/dist/array/group.cjs.map +1 -1
  22. package/dist/array/group.d.ts +19 -0
  23. package/dist/array/group.d.ts.map +1 -0
  24. package/dist/array/group.js +18 -15
  25. package/dist/array/group.js.map +1 -1
  26. package/dist/array/index.d.ts +16 -0
  27. package/dist/array/index.d.ts.map +1 -0
  28. package/dist/array/keyBy.cjs +2 -0
  29. package/dist/array/keyBy.cjs.map +1 -0
  30. package/dist/array/keyBy.d.ts +20 -0
  31. package/dist/array/keyBy.d.ts.map +1 -0
  32. package/dist/array/keyBy.js +19 -0
  33. package/dist/array/keyBy.js.map +1 -0
  34. package/dist/array/list.cjs +2 -2
  35. package/dist/array/list.cjs.map +1 -1
  36. package/dist/array/list.d.ts +58 -0
  37. package/dist/array/list.d.ts.map +1 -0
  38. package/dist/array/list.js +103 -106
  39. package/dist/array/list.js.map +1 -1
  40. package/dist/array/pick.cjs +2 -2
  41. package/dist/array/pick.cjs.map +1 -1
  42. package/dist/array/pick.d.ts +19 -0
  43. package/dist/array/pick.d.ts.map +1 -0
  44. package/dist/array/pick.js +15 -14
  45. package/dist/array/pick.js.map +1 -1
  46. package/dist/array/remoteList.cjs +2 -2
  47. package/dist/array/remoteList.cjs.map +1 -1
  48. package/dist/array/remoteList.d.ts +64 -0
  49. package/dist/array/remoteList.d.ts.map +1 -0
  50. package/dist/array/remoteList.js +121 -122
  51. package/dist/array/remoteList.js.map +1 -1
  52. package/dist/array/replace.cjs +2 -0
  53. package/dist/array/replace.cjs.map +1 -0
  54. package/dist/array/replace.d.ts +20 -0
  55. package/dist/array/replace.d.ts.map +1 -0
  56. package/dist/array/replace.js +19 -0
  57. package/dist/array/replace.js.map +1 -0
  58. package/dist/array/rotate.cjs +2 -0
  59. package/dist/array/rotate.cjs.map +1 -0
  60. package/dist/array/rotate.d.ts +22 -0
  61. package/dist/array/rotate.d.ts.map +1 -0
  62. package/dist/array/rotate.js +19 -0
  63. package/dist/array/rotate.js.map +1 -0
  64. package/dist/array/search.cjs +2 -2
  65. package/dist/array/search.cjs.map +1 -1
  66. package/dist/array/search.d.ts +19 -0
  67. package/dist/array/search.d.ts.map +1 -0
  68. package/dist/array/search.js +23 -13
  69. package/dist/array/search.js.map +1 -1
  70. package/dist/array/select.cjs +2 -2
  71. package/dist/array/select.cjs.map +1 -1
  72. package/dist/array/select.d.ts +21 -0
  73. package/dist/array/select.d.ts.map +1 -0
  74. package/dist/array/select.js +16 -15
  75. package/dist/array/select.js.map +1 -1
  76. package/dist/array/sort.cjs +2 -2
  77. package/dist/array/sort.cjs.map +1 -1
  78. package/dist/array/sort.d.ts +26 -0
  79. package/dist/array/sort.d.ts.map +1 -0
  80. package/dist/array/sort.js +18 -12
  81. package/dist/array/sort.js.map +1 -1
  82. package/dist/array/toggle.cjs +2 -0
  83. package/dist/array/toggle.cjs.map +1 -0
  84. package/dist/array/toggle.d.ts +29 -0
  85. package/dist/array/toggle.d.ts.map +1 -0
  86. package/dist/array/toggle.js +9 -0
  87. package/dist/array/toggle.js.map +1 -0
  88. package/dist/array/uniq.cjs +2 -2
  89. package/dist/array/uniq.cjs.map +1 -1
  90. package/dist/array/uniq.d.ts +21 -0
  91. package/dist/array/uniq.d.ts.map +1 -0
  92. package/dist/array/uniq.js +15 -17
  93. package/dist/array/uniq.js.map +1 -1
  94. package/dist/async/attempt.cjs +2 -2
  95. package/dist/async/attempt.cjs.map +1 -1
  96. package/dist/async/attempt.d.ts +40 -0
  97. package/dist/async/attempt.d.ts.map +1 -0
  98. package/dist/async/attempt.js +19 -14
  99. package/dist/async/attempt.js.map +1 -1
  100. package/dist/async/defer.cjs +2 -2
  101. package/dist/async/defer.cjs.map +1 -1
  102. package/dist/async/defer.d.ts +23 -0
  103. package/dist/async/defer.d.ts.map +1 -0
  104. package/dist/async/defer.js +12 -9
  105. package/dist/async/defer.js.map +1 -1
  106. package/dist/async/index.d.ts +12 -0
  107. package/dist/async/index.d.ts.map +1 -0
  108. package/dist/async/parallel.cjs +2 -2
  109. package/dist/async/parallel.cjs.map +1 -1
  110. package/dist/async/parallel.d.ts +31 -0
  111. package/dist/async/parallel.d.ts.map +1 -0
  112. package/dist/async/parallel.js +26 -27
  113. package/dist/async/parallel.js.map +1 -1
  114. package/dist/async/pool.cjs +2 -2
  115. package/dist/async/pool.cjs.map +1 -1
  116. package/dist/async/pool.d.ts +21 -0
  117. package/dist/async/pool.d.ts.map +1 -0
  118. package/dist/async/pool.js +23 -21
  119. package/dist/async/pool.js.map +1 -1
  120. package/dist/async/predict.cjs +2 -2
  121. package/dist/async/predict.cjs.map +1 -1
  122. package/dist/async/predict.d.ts +24 -0
  123. package/dist/async/predict.d.ts.map +1 -0
  124. package/dist/async/predict.js +10 -12
  125. package/dist/async/predict.js.map +1 -1
  126. package/dist/async/queue.cjs +2 -2
  127. package/dist/async/queue.cjs.map +1 -1
  128. package/dist/async/queue.d.ts +43 -0
  129. package/dist/async/queue.d.ts.map +1 -0
  130. package/dist/async/queue.js +52 -56
  131. package/dist/async/queue.js.map +1 -1
  132. package/dist/async/race.cjs +2 -2
  133. package/dist/async/race.cjs.map +1 -1
  134. package/dist/async/race.d.ts +16 -0
  135. package/dist/async/race.d.ts.map +1 -0
  136. package/dist/async/race.js +8 -7
  137. package/dist/async/race.js.map +1 -1
  138. package/dist/async/retry.cjs +2 -2
  139. package/dist/async/retry.cjs.map +1 -1
  140. package/dist/async/retry.d.ts +32 -0
  141. package/dist/async/retry.d.ts.map +1 -0
  142. package/dist/async/retry.js +19 -24
  143. package/dist/async/retry.js.map +1 -1
  144. package/dist/async/scheduler.cjs +2 -0
  145. package/dist/async/scheduler.cjs.map +1 -0
  146. package/dist/async/scheduler.d.ts +51 -0
  147. package/dist/async/scheduler.d.ts.map +1 -0
  148. package/dist/async/scheduler.js +43 -0
  149. package/dist/async/scheduler.js.map +1 -0
  150. package/dist/async/sleep.cjs +2 -2
  151. package/dist/async/sleep.cjs.map +1 -1
  152. package/dist/async/sleep.d.ts +16 -0
  153. package/dist/async/sleep.d.ts.map +1 -0
  154. package/dist/async/sleep.js +11 -11
  155. package/dist/async/sleep.js.map +1 -1
  156. package/dist/async/waitFor.cjs +2 -2
  157. package/dist/async/waitFor.cjs.map +1 -1
  158. package/dist/async/waitFor.d.ts +33 -0
  159. package/dist/async/waitFor.d.ts.map +1 -0
  160. package/dist/async/waitFor.js +29 -36
  161. package/dist/async/waitFor.js.map +1 -1
  162. package/dist/date/expires.cjs +2 -2
  163. package/dist/date/expires.cjs.map +1 -1
  164. package/dist/date/expires.d.ts +15 -0
  165. package/dist/date/expires.d.ts.map +1 -0
  166. package/dist/date/expires.js +11 -10
  167. package/dist/date/expires.js.map +1 -1
  168. package/dist/date/index.d.ts +4 -0
  169. package/dist/date/index.d.ts.map +1 -0
  170. package/dist/date/interval.cjs +2 -2
  171. package/dist/date/interval.cjs.map +1 -1
  172. package/dist/date/interval.d.ts +25 -0
  173. package/dist/date/interval.d.ts.map +1 -0
  174. package/dist/date/interval.js +31 -37
  175. package/dist/date/interval.js.map +1 -1
  176. package/dist/date/timeDiff.cjs +2 -2
  177. package/dist/date/timeDiff.cjs.map +1 -1
  178. package/dist/date/timeDiff.d.ts +24 -0
  179. package/dist/date/timeDiff.d.ts.map +1 -0
  180. package/dist/date/timeDiff.js +58 -25
  181. package/dist/date/timeDiff.js.map +1 -1
  182. package/dist/function/assert.cjs +2 -3
  183. package/dist/function/assert.cjs.map +1 -1
  184. package/dist/function/assert.d.ts +38 -0
  185. package/dist/function/assert.d.ts.map +1 -0
  186. package/dist/function/assert.js +13 -11
  187. package/dist/function/assert.js.map +1 -1
  188. package/dist/function/assertParams.cjs +2 -2
  189. package/dist/function/assertParams.cjs.map +1 -1
  190. package/dist/function/assertParams.d.ts +24 -0
  191. package/dist/function/assertParams.d.ts.map +1 -0
  192. package/dist/function/assertParams.js +13 -12
  193. package/dist/function/assertParams.js.map +1 -1
  194. package/dist/function/compare.cjs +2 -2
  195. package/dist/function/compare.cjs.map +1 -1
  196. package/dist/function/compare.d.ts +23 -0
  197. package/dist/function/compare.d.ts.map +1 -0
  198. package/dist/function/compare.js +22 -21
  199. package/dist/function/compare.js.map +1 -1
  200. package/dist/function/compareBy.cjs +2 -2
  201. package/dist/function/compareBy.cjs.map +1 -1
  202. package/dist/function/compareBy.d.ts +24 -0
  203. package/dist/function/compareBy.d.ts.map +1 -0
  204. package/dist/function/compareBy.js +15 -14
  205. package/dist/function/compareBy.js.map +1 -1
  206. package/dist/function/compose.cjs +2 -2
  207. package/dist/function/compose.cjs.map +1 -1
  208. package/dist/function/compose.d.ts +22 -0
  209. package/dist/function/compose.d.ts.map +1 -0
  210. package/dist/function/compose.js +10 -13
  211. package/dist/function/compose.js.map +1 -1
  212. package/dist/function/curry.cjs +2 -2
  213. package/dist/function/curry.cjs.map +1 -1
  214. package/dist/function/curry.d.ts +21 -0
  215. package/dist/function/curry.d.ts.map +1 -0
  216. package/dist/function/curry.js +8 -7
  217. package/dist/function/curry.js.map +1 -1
  218. package/dist/function/debounce.cjs +2 -2
  219. package/dist/function/debounce.cjs.map +1 -1
  220. package/dist/function/debounce.d.ts +12 -0
  221. package/dist/function/debounce.d.ts.map +1 -0
  222. package/dist/function/debounce.js +34 -26
  223. package/dist/function/debounce.js.map +1 -1
  224. package/dist/function/fp.cjs +2 -2
  225. package/dist/function/fp.cjs.map +1 -1
  226. package/dist/function/fp.d.ts +24 -0
  227. package/dist/function/fp.d.ts.map +1 -0
  228. package/dist/function/fp.js +6 -10
  229. package/dist/function/fp.js.map +1 -1
  230. package/dist/function/index.d.ts +13 -0
  231. package/dist/function/index.d.ts.map +1 -0
  232. package/dist/function/memo.cjs +2 -2
  233. package/dist/function/memo.cjs.map +1 -1
  234. package/dist/function/memo.d.ts +30 -0
  235. package/dist/function/memo.d.ts.map +1 -0
  236. package/dist/function/memo.js +16 -24
  237. package/dist/function/memo.js.map +1 -1
  238. package/dist/function/once.cjs +2 -2
  239. package/dist/function/once.cjs.map +1 -1
  240. package/dist/function/once.d.ts +24 -0
  241. package/dist/function/once.d.ts.map +1 -0
  242. package/dist/function/once.js +10 -10
  243. package/dist/function/once.js.map +1 -1
  244. package/dist/function/pipe.cjs +2 -2
  245. package/dist/function/pipe.cjs.map +1 -1
  246. package/dist/function/pipe.d.ts +23 -0
  247. package/dist/function/pipe.d.ts.map +1 -0
  248. package/dist/function/pipe.js +10 -10
  249. package/dist/function/pipe.js.map +1 -1
  250. package/dist/function/throttle.cjs +2 -2
  251. package/dist/function/throttle.cjs.map +1 -1
  252. package/dist/function/throttle.d.ts +21 -0
  253. package/dist/function/throttle.d.ts.map +1 -0
  254. package/dist/function/throttle.js +45 -37
  255. package/dist/function/throttle.js.map +1 -1
  256. package/dist/index.cjs +1 -2
  257. package/dist/index.d.ts +77 -2813
  258. package/dist/index.d.ts.map +1 -0
  259. package/dist/index.js +75 -253
  260. package/dist/math/abs.cjs +2 -2
  261. package/dist/math/abs.cjs.map +1 -1
  262. package/dist/math/abs.d.ts +17 -0
  263. package/dist/math/abs.d.ts.map +1 -0
  264. package/dist/math/abs.js +7 -6
  265. package/dist/math/abs.js.map +1 -1
  266. package/dist/math/allocate.cjs +2 -2
  267. package/dist/math/allocate.cjs.map +1 -1
  268. package/dist/math/allocate.d.ts +24 -0
  269. package/dist/math/allocate.d.ts.map +1 -0
  270. package/dist/math/allocate.js +20 -28
  271. package/dist/math/allocate.js.map +1 -1
  272. package/dist/math/average.cjs +2 -2
  273. package/dist/math/average.cjs.map +1 -1
  274. package/dist/math/average.d.ts +16 -0
  275. package/dist/math/average.d.ts.map +1 -0
  276. package/dist/math/average.js +13 -24
  277. package/dist/math/average.js.map +1 -1
  278. package/dist/math/clamp.cjs +2 -2
  279. package/dist/math/clamp.cjs.map +1 -1
  280. package/dist/math/clamp.d.ts +18 -0
  281. package/dist/math/clamp.d.ts.map +1 -0
  282. package/dist/math/clamp.js +7 -6
  283. package/dist/math/clamp.js.map +1 -1
  284. package/dist/math/distribute.cjs +2 -2
  285. package/dist/math/distribute.cjs.map +1 -1
  286. package/dist/math/distribute.d.ts +24 -0
  287. package/dist/math/distribute.d.ts.map +1 -0
  288. package/dist/math/distribute.js +14 -17
  289. package/dist/math/distribute.js.map +1 -1
  290. package/dist/math/index.d.ts +14 -0
  291. package/dist/math/index.d.ts.map +1 -0
  292. package/dist/math/linspace.cjs +2 -0
  293. package/dist/math/linspace.cjs.map +1 -0
  294. package/dist/math/linspace.d.ts +19 -0
  295. package/dist/math/linspace.d.ts.map +1 -0
  296. package/dist/math/linspace.js +11 -0
  297. package/dist/math/linspace.js.map +1 -0
  298. package/dist/math/max.cjs +2 -2
  299. package/dist/math/max.cjs.map +1 -1
  300. package/dist/math/max.d.ts +23 -0
  301. package/dist/math/max.d.ts.map +1 -0
  302. package/dist/math/max.js +10 -11
  303. package/dist/math/max.js.map +1 -1
  304. package/dist/math/median.cjs +2 -2
  305. package/dist/math/median.cjs.map +1 -1
  306. package/dist/math/median.d.ts +17 -0
  307. package/dist/math/median.d.ts.map +1 -0
  308. package/dist/math/median.js +11 -10
  309. package/dist/math/median.js.map +1 -1
  310. package/dist/math/min.cjs +2 -2
  311. package/dist/math/min.cjs.map +1 -1
  312. package/dist/math/min.d.ts +23 -0
  313. package/dist/math/min.d.ts.map +1 -0
  314. package/dist/math/min.js +10 -11
  315. package/dist/math/min.js.map +1 -1
  316. package/dist/math/percent.cjs +2 -0
  317. package/dist/math/percent.cjs.map +1 -0
  318. package/dist/math/percent.d.ts +19 -0
  319. package/dist/math/percent.d.ts.map +1 -0
  320. package/dist/math/percent.js +8 -0
  321. package/dist/math/percent.js.map +1 -0
  322. package/dist/math/range.cjs +2 -2
  323. package/dist/math/range.cjs.map +1 -1
  324. package/dist/math/range.d.ts +23 -0
  325. package/dist/math/range.d.ts.map +1 -0
  326. package/dist/math/range.js +28 -17
  327. package/dist/math/range.js.map +1 -1
  328. package/dist/math/round.cjs +2 -2
  329. package/dist/math/round.cjs.map +1 -1
  330. package/dist/math/round.d.ts +21 -0
  331. package/dist/math/round.d.ts.map +1 -0
  332. package/dist/math/round.js +9 -8
  333. package/dist/math/round.js.map +1 -1
  334. package/dist/math/sum.cjs +2 -2
  335. package/dist/math/sum.cjs.map +1 -1
  336. package/dist/math/sum.d.ts +17 -0
  337. package/dist/math/sum.d.ts.map +1 -0
  338. package/dist/math/sum.js +11 -14
  339. package/dist/math/sum.js.map +1 -1
  340. package/dist/money/currency.cjs +2 -2
  341. package/dist/money/currency.cjs.map +1 -1
  342. package/dist/money/currency.d.ts +30 -0
  343. package/dist/money/currency.d.ts.map +1 -0
  344. package/dist/money/currency.js +19 -47
  345. package/dist/money/currency.js.map +1 -1
  346. package/dist/money/exchange.cjs +2 -2
  347. package/dist/money/exchange.cjs.map +1 -1
  348. package/dist/money/exchange.d.ts +29 -0
  349. package/dist/money/exchange.d.ts.map +1 -0
  350. package/dist/money/exchange.js +12 -12
  351. package/dist/money/exchange.js.map +1 -1
  352. package/dist/money/index.d.ts +4 -0
  353. package/dist/money/index.d.ts.map +1 -0
  354. package/dist/money/types.d.ts +9 -0
  355. package/dist/money/types.d.ts.map +1 -0
  356. package/dist/object/diff.cjs +2 -2
  357. package/dist/object/diff.cjs.map +1 -1
  358. package/dist/object/diff.d.ts +26 -0
  359. package/dist/object/diff.d.ts.map +1 -0
  360. package/dist/object/diff.js +19 -17
  361. package/dist/object/diff.js.map +1 -1
  362. package/dist/object/index.d.ts +9 -0
  363. package/dist/object/index.d.ts.map +1 -0
  364. package/dist/object/merge.cjs +2 -2
  365. package/dist/object/merge.cjs.map +1 -1
  366. package/dist/object/merge.d.ts +44 -0
  367. package/dist/object/merge.d.ts.map +1 -0
  368. package/dist/object/merge.js +27 -21
  369. package/dist/object/merge.js.map +1 -1
  370. package/dist/object/parseJSON.cjs +2 -2
  371. package/dist/object/parseJSON.cjs.map +1 -1
  372. package/dist/object/parseJSON.d.ts +32 -0
  373. package/dist/object/parseJSON.d.ts.map +1 -0
  374. package/dist/object/parseJSON.js +17 -18
  375. package/dist/object/parseJSON.js.map +1 -1
  376. package/dist/object/path.cjs +2 -2
  377. package/dist/object/path.cjs.map +1 -1
  378. package/dist/object/path.d.ts +32 -0
  379. package/dist/object/path.d.ts.map +1 -0
  380. package/dist/object/path.js +25 -23
  381. package/dist/object/path.js.map +1 -1
  382. package/dist/object/proxy.cjs +2 -0
  383. package/dist/object/proxy.cjs.map +1 -0
  384. package/dist/object/proxy.d.ts +30 -0
  385. package/dist/object/proxy.d.ts.map +1 -0
  386. package/dist/object/proxy.js +21 -0
  387. package/dist/object/proxy.js.map +1 -0
  388. package/dist/object/prune.cjs +2 -0
  389. package/dist/object/prune.cjs.map +1 -0
  390. package/dist/object/prune.d.ts +21 -0
  391. package/dist/object/prune.d.ts.map +1 -0
  392. package/dist/object/prune.js +31 -0
  393. package/dist/object/prune.js.map +1 -0
  394. package/dist/object/seek.cjs +2 -2
  395. package/dist/object/seek.cjs.map +1 -1
  396. package/dist/object/seek.d.ts +2 -0
  397. package/dist/object/seek.d.ts.map +1 -0
  398. package/dist/object/seek.js +25 -12
  399. package/dist/object/seek.js.map +1 -1
  400. package/dist/object/stash.cjs +2 -0
  401. package/dist/object/stash.cjs.map +1 -0
  402. package/dist/object/stash.d.ts +45 -0
  403. package/dist/object/stash.d.ts.map +1 -0
  404. package/dist/object/stash.js +99 -0
  405. package/dist/object/stash.js.map +1 -0
  406. package/dist/random/draw.cjs +2 -2
  407. package/dist/random/draw.cjs.map +1 -1
  408. package/dist/random/draw.d.ts +16 -0
  409. package/dist/random/draw.d.ts.map +1 -0
  410. package/dist/random/draw.js +13 -10
  411. package/dist/random/draw.js.map +1 -1
  412. package/dist/random/index.d.ts +5 -0
  413. package/dist/random/index.d.ts.map +1 -0
  414. package/dist/random/random.cjs +2 -2
  415. package/dist/random/random.cjs.map +1 -1
  416. package/dist/random/random.d.ts +14 -0
  417. package/dist/random/random.d.ts.map +1 -0
  418. package/dist/random/random.js +16 -9
  419. package/dist/random/random.js.map +1 -1
  420. package/dist/random/shuffle.cjs +2 -2
  421. package/dist/random/shuffle.cjs.map +1 -1
  422. package/dist/random/shuffle.d.ts +17 -0
  423. package/dist/random/shuffle.d.ts.map +1 -0
  424. package/dist/random/shuffle.js +18 -14
  425. package/dist/random/shuffle.js.map +1 -1
  426. package/dist/random/uuid.cjs +2 -2
  427. package/dist/random/uuid.cjs.map +1 -1
  428. package/dist/random/uuid.d.ts +12 -0
  429. package/dist/random/uuid.d.ts.map +1 -0
  430. package/dist/random/uuid.js +7 -9
  431. package/dist/random/uuid.js.map +1 -1
  432. package/dist/string/_caseUtils.cjs +2 -2
  433. package/dist/string/_caseUtils.cjs.map +1 -1
  434. package/dist/string/_caseUtils.d.ts +13 -0
  435. package/dist/string/_caseUtils.d.ts.map +1 -0
  436. package/dist/string/_caseUtils.js +8 -8
  437. package/dist/string/_caseUtils.js.map +1 -1
  438. package/dist/string/camelCase.cjs +2 -2
  439. package/dist/string/camelCase.cjs.map +1 -1
  440. package/dist/string/camelCase.d.ts +14 -0
  441. package/dist/string/camelCase.d.ts.map +1 -0
  442. package/dist/string/camelCase.js +8 -7
  443. package/dist/string/camelCase.js.map +1 -1
  444. package/dist/string/index.d.ts +7 -0
  445. package/dist/string/index.d.ts.map +1 -0
  446. package/dist/string/kebabCase.cjs +2 -2
  447. package/dist/string/kebabCase.cjs.map +1 -1
  448. package/dist/string/kebabCase.d.ts +15 -0
  449. package/dist/string/kebabCase.d.ts.map +1 -0
  450. package/dist/string/kebabCase.js +8 -7
  451. package/dist/string/kebabCase.js.map +1 -1
  452. package/dist/string/pascalCase.cjs +2 -2
  453. package/dist/string/pascalCase.cjs.map +1 -1
  454. package/dist/string/pascalCase.d.ts +15 -0
  455. package/dist/string/pascalCase.d.ts.map +1 -0
  456. package/dist/string/pascalCase.js +8 -7
  457. package/dist/string/pascalCase.js.map +1 -1
  458. package/dist/string/similarity.cjs +2 -2
  459. package/dist/string/similarity.cjs.map +1 -1
  460. package/dist/string/similarity.d.ts +20 -0
  461. package/dist/string/similarity.d.ts.map +1 -0
  462. package/dist/string/similarity.js +20 -36
  463. package/dist/string/similarity.js.map +1 -1
  464. package/dist/string/snakeCase.cjs +2 -2
  465. package/dist/string/snakeCase.cjs.map +1 -1
  466. package/dist/string/snakeCase.d.ts +15 -0
  467. package/dist/string/snakeCase.d.ts.map +1 -0
  468. package/dist/string/snakeCase.js +8 -7
  469. package/dist/string/snakeCase.js.map +1 -1
  470. package/dist/string/truncate.cjs +2 -2
  471. package/dist/string/truncate.cjs.map +1 -1
  472. package/dist/string/truncate.d.ts +28 -0
  473. package/dist/string/truncate.d.ts.map +1 -0
  474. package/dist/string/truncate.js +20 -17
  475. package/dist/string/truncate.js.map +1 -1
  476. package/dist/toolkit.cjs +2 -0
  477. package/dist/toolkit.cjs.map +1 -0
  478. package/dist/toolkit.js +1523 -0
  479. package/dist/toolkit.js.map +1 -0
  480. package/dist/typed/index.d.ts +24 -0
  481. package/dist/typed/index.d.ts.map +1 -0
  482. package/dist/typed/is.cjs +2 -2
  483. package/dist/typed/is.cjs.map +1 -1
  484. package/dist/typed/is.d.ts +95 -0
  485. package/dist/typed/is.d.ts.map +1 -0
  486. package/dist/typed/is.js +54 -42
  487. package/dist/typed/is.js.map +1 -1
  488. package/dist/typed/isArray.cjs +2 -2
  489. package/dist/typed/isArray.cjs.map +1 -1
  490. package/dist/typed/isArray.d.ts +16 -0
  491. package/dist/typed/isArray.d.ts.map +1 -0
  492. package/dist/typed/isArray.js +8 -8
  493. package/dist/typed/isArray.js.map +1 -1
  494. package/dist/typed/isBoolean.cjs +2 -2
  495. package/dist/typed/isBoolean.cjs.map +1 -1
  496. package/dist/typed/isBoolean.d.ts +23 -0
  497. package/dist/typed/isBoolean.d.ts.map +1 -0
  498. package/dist/typed/isBoolean.js +7 -6
  499. package/dist/typed/isBoolean.js.map +1 -1
  500. package/dist/typed/isDate.cjs +2 -2
  501. package/dist/typed/isDate.cjs.map +1 -1
  502. package/dist/typed/isDate.d.ts +16 -0
  503. package/dist/typed/isDate.d.ts.map +1 -0
  504. package/dist/typed/isDate.js +7 -8
  505. package/dist/typed/isDate.js.map +1 -1
  506. package/dist/typed/isDefined.cjs +2 -2
  507. package/dist/typed/isDefined.cjs.map +1 -1
  508. package/dist/typed/isDefined.d.ts +19 -0
  509. package/dist/typed/isDefined.d.ts.map +1 -0
  510. package/dist/typed/isDefined.js +7 -6
  511. package/dist/typed/isDefined.js.map +1 -1
  512. package/dist/typed/isEmpty.cjs +2 -2
  513. package/dist/typed/isEmpty.cjs.map +1 -1
  514. package/dist/typed/isEmpty.d.ts +24 -0
  515. package/dist/typed/isEmpty.d.ts.map +1 -0
  516. package/dist/typed/isEmpty.js +8 -9
  517. package/dist/typed/isEmpty.js.map +1 -1
  518. package/dist/typed/isEqual.cjs +2 -2
  519. package/dist/typed/isEqual.cjs.map +1 -1
  520. package/dist/typed/isEqual.d.ts +24 -0
  521. package/dist/typed/isEqual.d.ts.map +1 -0
  522. package/dist/typed/isEqual.js +27 -28
  523. package/dist/typed/isEqual.js.map +1 -1
  524. package/dist/typed/isEven.cjs +2 -2
  525. package/dist/typed/isEven.cjs.map +1 -1
  526. package/dist/typed/isEven.d.ts +9 -0
  527. package/dist/typed/isEven.d.ts.map +1 -0
  528. package/dist/typed/isEven.js +7 -6
  529. package/dist/typed/isEven.js.map +1 -1
  530. package/dist/typed/isFunction.cjs +2 -2
  531. package/dist/typed/isFunction.cjs.map +1 -1
  532. package/dist/typed/isFunction.d.ts +16 -0
  533. package/dist/typed/isFunction.d.ts.map +1 -0
  534. package/dist/typed/isFunction.js +7 -8
  535. package/dist/typed/isFunction.js.map +1 -1
  536. package/dist/typed/isMatch.cjs +2 -2
  537. package/dist/typed/isMatch.cjs.map +1 -1
  538. package/dist/typed/isMatch.d.ts +23 -0
  539. package/dist/typed/isMatch.d.ts.map +1 -0
  540. package/dist/typed/isMatch.js +16 -18
  541. package/dist/typed/isMatch.js.map +1 -1
  542. package/dist/typed/isNegative.cjs +2 -2
  543. package/dist/typed/isNegative.cjs.map +1 -1
  544. package/dist/typed/isNegative.d.ts +26 -0
  545. package/dist/typed/isNegative.d.ts.map +1 -0
  546. package/dist/typed/isNegative.js +7 -6
  547. package/dist/typed/isNegative.js.map +1 -1
  548. package/dist/typed/isNil.cjs +2 -2
  549. package/dist/typed/isNil.cjs.map +1 -1
  550. package/dist/typed/isNil.d.ts +17 -0
  551. package/dist/typed/isNil.d.ts.map +1 -0
  552. package/dist/typed/isNil.js +7 -8
  553. package/dist/typed/isNil.js.map +1 -1
  554. package/dist/typed/isNumber.cjs +2 -2
  555. package/dist/typed/isNumber.cjs.map +1 -1
  556. package/dist/typed/isNumber.d.ts +16 -0
  557. package/dist/typed/isNumber.d.ts.map +1 -0
  558. package/dist/typed/isNumber.js +8 -8
  559. package/dist/typed/isNumber.js.map +1 -1
  560. package/dist/typed/isObject.cjs +2 -2
  561. package/dist/typed/isObject.cjs.map +1 -1
  562. package/dist/typed/isObject.d.ts +19 -0
  563. package/dist/typed/isObject.d.ts.map +1 -0
  564. package/dist/typed/isObject.js +8 -8
  565. package/dist/typed/isObject.js.map +1 -1
  566. package/dist/typed/isOdd.cjs +2 -2
  567. package/dist/typed/isOdd.cjs.map +1 -1
  568. package/dist/typed/isOdd.d.ts +9 -0
  569. package/dist/typed/isOdd.d.ts.map +1 -0
  570. package/dist/typed/isOdd.js +7 -6
  571. package/dist/typed/isOdd.js.map +1 -1
  572. package/dist/typed/isPositive.cjs +2 -2
  573. package/dist/typed/isPositive.cjs.map +1 -1
  574. package/dist/typed/isPositive.d.ts +26 -0
  575. package/dist/typed/isPositive.d.ts.map +1 -0
  576. package/dist/typed/isPositive.js +7 -6
  577. package/dist/typed/isPositive.js.map +1 -1
  578. package/dist/typed/isPrimitive.cjs +2 -2
  579. package/dist/typed/isPrimitive.cjs.map +1 -1
  580. package/dist/typed/isPrimitive.d.ts +18 -0
  581. package/dist/typed/isPrimitive.d.ts.map +1 -0
  582. package/dist/typed/isPrimitive.js +8 -9
  583. package/dist/typed/isPrimitive.js.map +1 -1
  584. package/dist/typed/isPromise.cjs +2 -2
  585. package/dist/typed/isPromise.cjs.map +1 -1
  586. package/dist/typed/isPromise.d.ts +17 -0
  587. package/dist/typed/isPromise.d.ts.map +1 -0
  588. package/dist/typed/isPromise.js +7 -9
  589. package/dist/typed/isPromise.js.map +1 -1
  590. package/dist/typed/isRegex.cjs +2 -2
  591. package/dist/typed/isRegex.cjs.map +1 -1
  592. package/dist/typed/isRegex.d.ts +21 -0
  593. package/dist/typed/isRegex.d.ts.map +1 -0
  594. package/dist/typed/isRegex.js +7 -6
  595. package/dist/typed/isRegex.js.map +1 -1
  596. package/dist/typed/isString.cjs +2 -2
  597. package/dist/typed/isString.cjs.map +1 -1
  598. package/dist/typed/isString.d.ts +16 -0
  599. package/dist/typed/isString.d.ts.map +1 -0
  600. package/dist/typed/isString.js +8 -8
  601. package/dist/typed/isString.js.map +1 -1
  602. package/dist/typed/isWithin.cjs +2 -2
  603. package/dist/typed/isWithin.cjs.map +1 -1
  604. package/dist/typed/isWithin.d.ts +20 -0
  605. package/dist/typed/isWithin.d.ts.map +1 -0
  606. package/dist/typed/isWithin.js +9 -9
  607. package/dist/typed/isWithin.js.map +1 -1
  608. package/dist/typed/isZero.cjs +2 -2
  609. package/dist/typed/isZero.cjs.map +1 -1
  610. package/dist/typed/isZero.d.ts +25 -0
  611. package/dist/typed/isZero.d.ts.map +1 -0
  612. package/dist/typed/isZero.js +7 -6
  613. package/dist/typed/isZero.js.map +1 -1
  614. package/dist/typed/typeOf.cjs +2 -2
  615. package/dist/typed/typeOf.cjs.map +1 -1
  616. package/dist/typed/typeOf.d.ts +30 -0
  617. package/dist/typed/typeOf.d.ts.map +1 -0
  618. package/dist/typed/typeOf.js +11 -13
  619. package/dist/typed/typeOf.js.map +1 -1
  620. package/dist/types.d.ts +9 -0
  621. package/dist/types.d.ts.map +1 -0
  622. package/package.json +77 -12
  623. package/dist/array/aggregate.cjs +0 -2
  624. package/dist/array/aggregate.cjs.map +0 -1
  625. package/dist/array/aggregate.js +0 -16
  626. package/dist/array/aggregate.js.map +0 -1
  627. package/dist/array/alternate.cjs +0 -2
  628. package/dist/array/alternate.cjs.map +0 -1
  629. package/dist/array/alternate.js +0 -9
  630. package/dist/array/alternate.js.map +0 -1
  631. package/dist/array/arrange.cjs +0 -2
  632. package/dist/array/arrange.cjs.map +0 -1
  633. package/dist/array/arrange.js +0 -6
  634. package/dist/array/arrange.js.map +0 -1
  635. package/dist/array/compact.cjs +0 -2
  636. package/dist/array/compact.cjs.map +0 -1
  637. package/dist/array/compact.js +0 -9
  638. package/dist/array/compact.js.map +0 -1
  639. package/dist/array/every.cjs +0 -2
  640. package/dist/array/every.cjs.map +0 -1
  641. package/dist/array/every.js +0 -14
  642. package/dist/array/every.js.map +0 -1
  643. package/dist/array/filter.cjs +0 -2
  644. package/dist/array/filter.cjs.map +0 -1
  645. package/dist/array/filter.js +0 -14
  646. package/dist/array/filter.js.map +0 -1
  647. package/dist/array/find.cjs +0 -2
  648. package/dist/array/find.cjs.map +0 -1
  649. package/dist/array/find.js +0 -14
  650. package/dist/array/find.js.map +0 -1
  651. package/dist/array/findIndex.cjs +0 -2
  652. package/dist/array/findIndex.cjs.map +0 -1
  653. package/dist/array/findIndex.js +0 -14
  654. package/dist/array/findIndex.js.map +0 -1
  655. package/dist/array/findLast.cjs +0 -2
  656. package/dist/array/findLast.cjs.map +0 -1
  657. package/dist/array/findLast.js +0 -14
  658. package/dist/array/findLast.js.map +0 -1
  659. package/dist/array/flatten.cjs +0 -2
  660. package/dist/array/flatten.cjs.map +0 -1
  661. package/dist/array/flatten.js +0 -7
  662. package/dist/array/flatten.js.map +0 -1
  663. package/dist/array/map.cjs +0 -2
  664. package/dist/array/map.cjs.map +0 -1
  665. package/dist/array/map.js +0 -18
  666. package/dist/array/map.js.map +0 -1
  667. package/dist/array/reduce.cjs +0 -2
  668. package/dist/array/reduce.cjs.map +0 -1
  669. package/dist/array/reduce.js +0 -16
  670. package/dist/array/reduce.js.map +0 -1
  671. package/dist/array/shift.cjs +0 -2
  672. package/dist/array/shift.cjs.map +0 -1
  673. package/dist/array/shift.js +0 -13
  674. package/dist/array/shift.js.map +0 -1
  675. package/dist/array/some.cjs +0 -2
  676. package/dist/array/some.cjs.map +0 -1
  677. package/dist/array/some.js +0 -14
  678. package/dist/array/some.js.map +0 -1
  679. package/dist/array/substitute.cjs +0 -2
  680. package/dist/array/substitute.cjs.map +0 -1
  681. package/dist/array/substitute.js +0 -13
  682. package/dist/array/substitute.js.map +0 -1
  683. package/dist/async/delay.cjs +0 -2
  684. package/dist/async/delay.cjs.map +0 -1
  685. package/dist/async/delay.js +0 -8
  686. package/dist/async/delay.js.map +0 -1
  687. package/dist/function/proxy.cjs +0 -2
  688. package/dist/function/proxy.cjs.map +0 -1
  689. package/dist/function/proxy.js +0 -22
  690. package/dist/function/proxy.js.map +0 -1
  691. package/dist/function/prune.cjs +0 -2
  692. package/dist/function/prune.cjs.map +0 -1
  693. package/dist/function/prune.js +0 -30
  694. package/dist/function/prune.js.map +0 -1
  695. package/dist/function/worker.cjs +0 -14
  696. package/dist/function/worker.cjs.map +0 -1
  697. package/dist/function/worker.js +0 -29
  698. package/dist/function/worker.js.map +0 -1
  699. package/dist/index.cjs.map +0 -1
  700. package/dist/index.js.map +0 -1
  701. package/dist/logit/dist/logit.cjs +0 -2
  702. package/dist/logit/dist/logit.cjs.map +0 -1
  703. package/dist/logit/dist/logit.js +0 -263
  704. package/dist/logit/dist/logit.js.map +0 -1
  705. package/dist/math/add.cjs +0 -2
  706. package/dist/math/add.cjs.map +0 -1
  707. package/dist/math/add.js +0 -9
  708. package/dist/math/add.js.map +0 -1
  709. package/dist/math/boil.cjs +0 -2
  710. package/dist/math/boil.cjs.map +0 -1
  711. package/dist/math/boil.js +0 -17
  712. package/dist/math/boil.js.map +0 -1
  713. package/dist/math/divide.cjs +0 -2
  714. package/dist/math/divide.cjs.map +0 -1
  715. package/dist/math/divide.js +0 -11
  716. package/dist/math/divide.js.map +0 -1
  717. package/dist/math/multiply.cjs +0 -2
  718. package/dist/math/multiply.cjs.map +0 -1
  719. package/dist/math/multiply.js +0 -9
  720. package/dist/math/multiply.js.map +0 -1
  721. package/dist/math/rate.cjs +0 -2
  722. package/dist/math/rate.cjs.map +0 -1
  723. package/dist/math/rate.js +0 -9
  724. package/dist/math/rate.js.map +0 -1
  725. package/dist/math/subtract.cjs +0 -2
  726. package/dist/math/subtract.cjs.map +0 -1
  727. package/dist/math/subtract.js +0 -9
  728. package/dist/math/subtract.js.map +0 -1
  729. package/dist/object/cache.cjs +0 -2
  730. package/dist/object/cache.cjs.map +0 -1
  731. package/dist/object/cache.js +0 -63
  732. package/dist/object/cache.js.map +0 -1
  733. package/dist/object/clone.cjs +0 -2
  734. package/dist/object/clone.cjs.map +0 -1
  735. package/dist/object/clone.js +0 -17
  736. package/dist/object/clone.js.map +0 -1
  737. package/dist/object/entries.cjs +0 -2
  738. package/dist/object/entries.cjs.map +0 -1
  739. package/dist/object/entries.js +0 -9
  740. package/dist/object/entries.js.map +0 -1
  741. package/dist/object/keys.cjs +0 -2
  742. package/dist/object/keys.cjs.map +0 -1
  743. package/dist/object/keys.js +0 -9
  744. package/dist/object/keys.js.map +0 -1
  745. package/dist/object/values.cjs +0 -2
  746. package/dist/object/values.cjs.map +0 -1
  747. package/dist/object/values.js +0 -9
  748. package/dist/object/values.js.map +0 -1
  749. package/dist/typed/ge.cjs +0 -2
  750. package/dist/typed/ge.cjs.map +0 -1
  751. package/dist/typed/ge.js +0 -7
  752. package/dist/typed/ge.js.map +0 -1
  753. package/dist/typed/gt.cjs +0 -2
  754. package/dist/typed/gt.cjs.map +0 -1
  755. package/dist/typed/gt.js +0 -7
  756. package/dist/typed/gt.js.map +0 -1
  757. package/dist/typed/le.cjs +0 -2
  758. package/dist/typed/le.cjs.map +0 -1
  759. package/dist/typed/le.js +0 -7
  760. package/dist/typed/le.js.map +0 -1
  761. package/dist/typed/lt.cjs +0 -2
  762. package/dist/typed/lt.cjs.map +0 -1
  763. package/dist/typed/lt.js +0 -7
  764. package/dist/typed/lt.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"fp.js","sources":["../../src/function/fp.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { assert } from './assert';\n\n// biome-ignore lint/suspicious/noExplicitAny: -\ntype RemoveFirstParameter<T extends Fn> = T extends (first: any, ...rest: infer R) => any ? R : never;\n\n/**\n * Creates a function that can be used in functional programming mode.\n * This function is a wrapper around the original function, allowing you to pass the first argument as an array.\n *\n * @example\n * ```ts\n * import { fp } from './fp';\n * import { map } from './map';\n *\n * const double = (num: number) => num * 2;\n * const doubleArray = fp(map, double);\n *\n * doubleArray([1, 2, 3]) // [2, 4, 6]\n * ```\n *\n * @param callback - The function to be wrapped.\n * @param args - The arguments to be passed to the function.\n *\n * @returns A function that takes an array and applies the original function to it.\n *\n * @throws {TypeError} If the function cannot be used in functional programming mode.\n */\nexport const fp = <T, F extends Fn = Fn>(callback: F, ...args: RemoveFirstParameter<F>) => {\n assert(\n // biome-ignore lint/suspicious/noExplicitAny: -\n (callback as any).fp,\n `\"${callback.name}\" cannot be used in functional programming mode. Please use the original function.`,\n );\n return (array: T[]) => callback(array, ...args);\n};\n"],"names":["fp","callback","args","assert","array"],"mappings":";AA4BO,MAAMA,IAAK,CAAuBC,MAAgBC,OACvDC;AAAA;AAAA,EAEGF,EAAiB;AAAA,EAClB,IAAIA,EAAS,IAAI;AAAA,GAEZ,CAACG,MAAeH,EAASG,GAAO,GAAGF,CAAI;"}
1
+ {"version":3,"file":"fp.js","names":[],"sources":["../../src/function/fp.ts"],"sourcesContent":["import type { Fn } from '../types';\n\ntype RemoveFirstParameter<T extends Fn> = T extends (first: any, ...rest: infer R) => any ? R : never;\ntype FirstParameter<T extends Fn> = T extends (first: infer A, ...rest: any[]) => any ? A : never;\n\n/**\n * Partially applies a multi-arg function by pre-filling every argument\n * except the first returning a unary function useful for pipeline composition.\n *\n * @example\n * ```ts\n * const double = (num: number) => num * 2;\n * const doubleAll = partial(select, double);\n * doubleAll([1, 2, 3]); // [2, 4, 6]\n *\n * // In a pipe\n * pipe(partial(select, (x: number) => x > 1 ? x * 2 : null))([1, 2, 3]); // [4, 6]\n * ```\n *\n * @param callback - Any function whose first argument is the collection.\n * @param args - The remaining arguments to pre-apply.\n * @returns A unary function `(collection) => ReturnType<F>`.\n */\nexport const partial = <F extends Fn>(callback: F, ...args: RemoveFirstParameter<F>) => {\n return (collection: FirstParameter<F>) => callback(collection, ...args);\n};\n"],"mappings":";AAuBA,IAAa,KAAyB,GAAa,GAAG,OAC5C,MAAkC,EAAS,GAAY,GAAG,EAAK"}
@@ -0,0 +1,13 @@
1
+ export * from './assert';
2
+ export * from './assertParams';
3
+ export * from './compare';
4
+ export * from './compareBy';
5
+ export * from './compose';
6
+ export * from './curry';
7
+ export * from './debounce';
8
+ export * from './fp';
9
+ export * from './memo';
10
+ export * from './once';
11
+ export * from './pipe';
12
+ export * from './throttle';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/function/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,MAAM,CAAC;AACrB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function m(f,{ttl:o,maxSize:i,resolver:c}={}){const n=new Map,s=t=>{if(c)return c(...t);if(t.length===0)return"__empty__";if(t.length===1){const e=t[0],r=typeof e;if(r==="string"||r==="number"||r==="boolean")return`${r}:${e}`;if(e===null)return"null";if(e===void 0)return"undefined"}return JSON.stringify(t)};return(...t)=>{const e=s(t),r=Date.now(),u=n.get(e);if(u&&(!o||r-u.timestamp<o))return n.delete(e),n.set(e,u),u.value;const l=f(...t);return n.set(e,{timestamp:r,value:l}),i&&n.size>i&&n.delete(n.keys().next().value),l}}exports.memo=m;
2
- //# sourceMappingURL=memo.cjs.map
1
+ function e(e,{maxSize:t,resolver:n,ttl:r}={}){let i=new Map,a=e=>n?n(...e):JSON.stringify(e,(e,t)=>t===void 0?`__undefined__`:t);return(...n)=>{let o=a(n),s=Date.now(),c=i.get(o);if(c&&(!r||s-c.timestamp<r))return i.delete(o),i.set(o,c),c.value;let l=e(...n);return i.set(o,{timestamp:s,value:l}),l instanceof Promise&&l.catch(()=>i.delete(o)),t&&i.size>t&&i.delete(i.keys().next().value),l}}exports.memo=e;
2
+ //# sourceMappingURL=memo.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"memo.cjs","sources":["../../src/function/memo.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport type { Fn } from '../types';\n\n// #region MemoizeOptions\ntype MemoizeOptions<T extends Fn> = {\n ttl?: number; // Time-to-live in milliseconds\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n};\n// #endregion MemoizeOptions\n\ntype CacheEntry<T extends Fn> = {\n value: ReturnType<T>;\n timestamp: number;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { ttl, maxSize, resolver }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: -\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n if (args.length === 0) return '__empty__';\n if (args.length === 1) {\n const arg = args[0];\n const argType = typeof arg;\n if (argType === 'string' || argType === 'number' || argType === 'boolean') {\n return `${argType}:${arg}`;\n }\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n }\n return JSON.stringify(args);\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n return cached.value;\n }\n\n const result = fn(...args);\n cache.set(key, { timestamp: now, value: result });\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"names":["memo","fn","ttl","maxSize","resolver","cache","keyGen","args","arg","argType","key","now","cached","result"],"mappings":"gFAqCO,SAASA,EACdC,EACA,CAAE,IAAAC,EAAK,QAAAC,EAAS,SAAAC,CAAA,EAAgC,GACL,CAC3C,MAAMC,MAAY,IAGZC,EAAUC,GAAgC,CAC9C,GAAIH,EAAU,OAAOA,EAAS,GAAGG,CAAI,EACrC,GAAIA,EAAK,SAAW,EAAG,MAAO,YAC9B,GAAIA,EAAK,SAAW,EAAG,CACrB,MAAMC,EAAMD,EAAK,CAAC,EACZE,EAAU,OAAOD,EACvB,GAAIC,IAAY,UAAYA,IAAY,UAAYA,IAAY,UAC9D,MAAO,GAAGA,CAAO,IAAID,CAAG,GAE1B,GAAIA,IAAQ,KAAM,MAAO,OACzB,GAAIA,IAAQ,OAAW,MAAO,WAChC,CACA,OAAO,KAAK,UAAUD,CAAI,CAC5B,EAEA,MAAO,IAAIA,IAAuC,CAChD,MAAMG,EAAMJ,EAAOC,CAAI,EACjBI,EAAM,KAAK,IAAA,EACXC,EAASP,EAAM,IAAIK,CAAG,EAE5B,GAAIE,IAAW,CAACV,GAAOS,EAAMC,EAAO,UAAYV,GAC9C,OAAAG,EAAM,OAAOK,CAAG,EAChBL,EAAM,IAAIK,EAAKE,CAAM,EACdA,EAAO,MAGhB,MAAMC,EAASZ,EAAG,GAAGM,CAAI,EACzB,OAAAF,EAAM,IAAIK,EAAK,CAAE,UAAWC,EAAK,MAAOE,EAAQ,EAE5CV,GAAWE,EAAM,KAAOF,GAC1BE,EAAM,OAAOA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAM,EAGlCQ,CACT,CACF"}
1
+ {"version":3,"file":"memo.cjs","names":[],"sources":["../../src/function/memo.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n// #region MemoizeOptions\ntype MemoizeOptions<T extends Fn> = {\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n ttl?: number; // Time-to-live in milliseconds\n};\n// #endregion MemoizeOptions\n\ntype CacheEntry<T extends Fn> = {\n timestamp: number;\n value: ReturnType<T>;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { maxSize, resolver, ttl }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n\n // Use a replacer to distinguish undefined from null (JSON.stringify collapses both to null)\n return JSON.stringify(args, (_, v) => (v === undefined ? '__undefined__' : v));\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n\n return cached.value;\n }\n\n const result = fn(...args);\n\n cache.set(key, { timestamp: now, value: result });\n\n if (result instanceof Promise) {\n // Evict on rejection so subsequent calls retry instead of returning a settled failure\n (result as Promise<unknown>).catch(() => cache.delete(key));\n }\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"mappings":"AAoCA,SAAgB,EACd,EACA,CAAE,UAAS,WAAU,OAA2B,EAAE,CACP,CAC3C,IAAM,EAAQ,IAAI,IAEZ,EAAU,GACV,EAAiB,EAAS,GAAG,EAAK,CAG/B,KAAK,UAAU,GAAO,EAAG,IAAO,IAAM,IAAA,GAAY,gBAAkB,EAAG,CAGhF,OAAQ,GAAG,IAAuC,CAChD,IAAM,EAAM,EAAO,EAAK,CAClB,EAAM,KAAK,KAAK,CAChB,EAAS,EAAM,IAAI,EAAI,CAE7B,GAAI,IAAW,CAAC,GAAO,EAAM,EAAO,UAAY,GAI9C,OAHA,EAAM,OAAO,EAAI,CACjB,EAAM,IAAI,EAAK,EAAO,CAEf,EAAO,MAGhB,IAAM,EAAS,EAAG,GAAG,EAAK,CAa1B,OAXA,EAAM,IAAI,EAAK,CAAE,UAAW,EAAK,MAAO,EAAQ,CAAC,CAE7C,aAAkB,SAEnB,EAA4B,UAAY,EAAM,OAAO,EAAI,CAAC,CAGzD,GAAW,EAAM,KAAO,GAC1B,EAAM,OAAO,EAAM,MAAM,CAAC,MAAM,CAAC,MAAO,CAGnC"}
@@ -0,0 +1,30 @@
1
+ import type { Fn } from '../types';
2
+ type MemoizeOptions<T extends Fn> = {
3
+ maxSize?: number;
4
+ resolver?: (...args: Parameters<T>) => string;
5
+ ttl?: number;
6
+ };
7
+ /**
8
+ * Creates a function that memorizes the result of the provided function.
9
+ * Supports expiration (TTL) and limited cache size (LRU).
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const add = (x, y) => x + y;
14
+ * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });
15
+ *
16
+ * memoizedAdd(1, 2); // 3 (caches the result)
17
+ * memoizedAdd(1, 2); // 3 (from cache)
18
+ * ```
19
+ *
20
+ * @param fn - The function to memorize.
21
+ * @param options - Memoization options.
22
+ * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).
23
+ * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).
24
+ * @param [options.resolver] - (optional) custom function to resolve the cache key.
25
+ *
26
+ * @returns A new function that memorizes the input function.
27
+ */
28
+ export declare function memo<T extends Fn>(fn: T, { maxSize, resolver, ttl }?: MemoizeOptions<T>): (...args: Parameters<T>) => ReturnType<T>;
29
+ export {};
30
+ //# sourceMappingURL=memo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/function/memo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAGnC,KAAK,cAAc,CAAC,CAAC,SAAS,EAAE,IAAI;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAQF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,EAAE,EAC/B,EAAE,EAAE,CAAC,EACL,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,cAAc,CAAC,CAAC,CAAM,GACjD,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAqC3C"}
@@ -1,25 +1,17 @@
1
- function m(l, { ttl: i, maxSize: o, resolver: c } = {}) {
2
- const n = /* @__PURE__ */ new Map(), s = (t) => {
3
- if (c) return c(...t);
4
- if (t.length === 0) return "__empty__";
5
- if (t.length === 1) {
6
- const e = t[0], r = typeof e;
7
- if (r === "string" || r === "number" || r === "boolean")
8
- return `${r}:${e}`;
9
- if (e === null) return "null";
10
- if (e === void 0) return "undefined";
11
- }
12
- return JSON.stringify(t);
13
- };
14
- return (...t) => {
15
- const e = s(t), r = Date.now(), u = n.get(e);
16
- if (u && (!i || r - u.timestamp < i))
17
- return n.delete(e), n.set(e, u), u.value;
18
- const f = l(...t);
19
- return n.set(e, { timestamp: r, value: f }), o && n.size > o && n.delete(n.keys().next().value), f;
20
- };
1
+ //#region src/function/memo.ts
2
+ function e(e, { maxSize: t, resolver: n, ttl: r } = {}) {
3
+ let i = /* @__PURE__ */ new Map(), a = (e) => n ? n(...e) : JSON.stringify(e, (e, t) => t === void 0 ? "__undefined__" : t);
4
+ return (...n) => {
5
+ let o = a(n), s = Date.now(), c = i.get(o);
6
+ if (c && (!r || s - c.timestamp < r)) return i.delete(o), i.set(o, c), c.value;
7
+ let l = e(...n);
8
+ return i.set(o, {
9
+ timestamp: s,
10
+ value: l
11
+ }), l instanceof Promise && l.catch(() => i.delete(o)), t && i.size > t && i.delete(i.keys().next().value), l;
12
+ };
21
13
  }
22
- export {
23
- m as memo
24
- };
25
- //# sourceMappingURL=memo.js.map
14
+ //#endregion
15
+ export { e as memo };
16
+
17
+ //# sourceMappingURL=memo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memo.js","sources":["../../src/function/memo.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport type { Fn } from '../types';\n\n// #region MemoizeOptions\ntype MemoizeOptions<T extends Fn> = {\n ttl?: number; // Time-to-live in milliseconds\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n};\n// #endregion MemoizeOptions\n\ntype CacheEntry<T extends Fn> = {\n value: ReturnType<T>;\n timestamp: number;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { ttl, maxSize, resolver }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: -\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n if (args.length === 0) return '__empty__';\n if (args.length === 1) {\n const arg = args[0];\n const argType = typeof arg;\n if (argType === 'string' || argType === 'number' || argType === 'boolean') {\n return `${argType}:${arg}`;\n }\n if (arg === null) return 'null';\n if (arg === undefined) return 'undefined';\n }\n return JSON.stringify(args);\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n return cached.value;\n }\n\n const result = fn(...args);\n cache.set(key, { timestamp: now, value: result });\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"names":["memo","fn","ttl","maxSize","resolver","cache","keyGen","args","arg","argType","key","now","cached","result"],"mappings":"AAqCO,SAASA,EACdC,GACA,EAAE,KAAAC,GAAK,SAAAC,GAAS,UAAAC,EAAA,IAAgC,IACL;AAC3C,QAAMC,wBAAY,IAAA,GAGZC,IAAS,CAACC,MAAgC;AAC9C,QAAIH,EAAU,QAAOA,EAAS,GAAGG,CAAI;AACrC,QAAIA,EAAK,WAAW,EAAG,QAAO;AAC9B,QAAIA,EAAK,WAAW,GAAG;AACrB,YAAMC,IAAMD,EAAK,CAAC,GACZE,IAAU,OAAOD;AACvB,UAAIC,MAAY,YAAYA,MAAY,YAAYA,MAAY;AAC9D,eAAO,GAAGA,CAAO,IAAID,CAAG;AAE1B,UAAIA,MAAQ,KAAM,QAAO;AACzB,UAAIA,MAAQ,OAAW,QAAO;AAAA,IAChC;AACA,WAAO,KAAK,UAAUD,CAAI;AAAA,EAC5B;AAEA,SAAO,IAAIA,MAAuC;AAChD,UAAMG,IAAMJ,EAAOC,CAAI,GACjBI,IAAM,KAAK,IAAA,GACXC,IAASP,EAAM,IAAIK,CAAG;AAE5B,QAAIE,MAAW,CAACV,KAAOS,IAAMC,EAAO,YAAYV;AAC9C,aAAAG,EAAM,OAAOK,CAAG,GAChBL,EAAM,IAAIK,GAAKE,CAAM,GACdA,EAAO;AAGhB,UAAMC,IAASZ,EAAG,GAAGM,CAAI;AACzB,WAAAF,EAAM,IAAIK,GAAK,EAAE,WAAWC,GAAK,OAAOE,GAAQ,GAE5CV,KAAWE,EAAM,OAAOF,KAC1BE,EAAM,OAAOA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAM,GAGlCQ;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"memo.js","names":[],"sources":["../../src/function/memo.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n// #region MemoizeOptions\ntype MemoizeOptions<T extends Fn> = {\n maxSize?: number; // Maximum number of items in cache\n resolver?: (...args: Parameters<T>) => string; // Custom key generator\n ttl?: number; // Time-to-live in milliseconds\n};\n// #endregion MemoizeOptions\n\ntype CacheEntry<T extends Fn> = {\n timestamp: number;\n value: ReturnType<T>;\n};\n\n/**\n * Creates a function that memorizes the result of the provided function.\n * Supports expiration (TTL) and limited cache size (LRU).\n *\n * @example\n * ```ts\n * const add = (x, y) => x + y;\n * const memoizedAdd = memo(add, { ttl: 5000, maxSize: 10 });\n *\n * memoizedAdd(1, 2); // 3 (caches the result)\n * memoizedAdd(1, 2); // 3 (from cache)\n * ```\n *\n * @param fn - The function to memorize.\n * @param options - Memoization options.\n * @param [options.ttl] - (optional) time-to-live (TTL) for cache expiration (in milliseconds).\n * @param [options.maxSize] - (optional) maximum cache size (LRU eviction).\n * @param [options.resolver] - (optional) custom function to resolve the cache key.\n *\n * @returns A new function that memorizes the input function.\n */\nexport function memo<T extends Fn>(\n fn: T,\n { maxSize, resolver, ttl }: MemoizeOptions<T> = {},\n): (...args: Parameters<T>) => ReturnType<T> {\n const cache = new Map<string, CacheEntry<T>>();\n\n const keyGen = (args: Parameters<T>): string => {\n if (resolver) return resolver(...args);\n\n // Use a replacer to distinguish undefined from null (JSON.stringify collapses both to null)\n return JSON.stringify(args, (_, v) => (v === undefined ? '__undefined__' : v));\n };\n\n return (...args: Parameters<T>): ReturnType<T> => {\n const key = keyGen(args);\n const now = Date.now();\n const cached = cache.get(key);\n\n if (cached && (!ttl || now - cached.timestamp < ttl)) {\n cache.delete(key);\n cache.set(key, cached); // Move to end (most recently used)\n\n return cached.value;\n }\n\n const result = fn(...args);\n\n cache.set(key, { timestamp: now, value: result });\n\n if (result instanceof Promise) {\n // Evict on rejection so subsequent calls retry instead of returning a settled failure\n (result as Promise<unknown>).catch(() => cache.delete(key));\n }\n\n if (maxSize && cache.size > maxSize) {\n cache.delete(cache.keys().next().value!); // Remove least recently used\n }\n\n return result;\n };\n}\n"],"mappings":";AAoCA,SAAgB,EACd,GACA,EAAE,YAAS,aAAU,WAA2B,EAAE,EACP;CAC3C,IAAM,oBAAQ,IAAI,KAA4B,EAExC,KAAU,MACV,IAAiB,EAAS,GAAG,EAAK,GAG/B,KAAK,UAAU,IAAO,GAAG,MAAO,MAAM,KAAA,IAAY,kBAAkB,EAAG;AAGhF,SAAQ,GAAG,MAAuC;EAChD,IAAM,IAAM,EAAO,EAAK,EAClB,IAAM,KAAK,KAAK,EAChB,IAAS,EAAM,IAAI,EAAI;AAE7B,MAAI,MAAW,CAAC,KAAO,IAAM,EAAO,YAAY,GAI9C,QAHA,EAAM,OAAO,EAAI,EACjB,EAAM,IAAI,GAAK,EAAO,EAEf,EAAO;EAGhB,IAAM,IAAS,EAAG,GAAG,EAAK;AAa1B,SAXA,EAAM,IAAI,GAAK;GAAE,WAAW;GAAK,OAAO;GAAQ,CAAC,EAE7C,aAAkB,WAEnB,EAA4B,YAAY,EAAM,OAAO,EAAI,CAAC,EAGzD,KAAW,EAAM,OAAO,KAC1B,EAAM,OAAO,EAAM,MAAM,CAAC,MAAM,CAAC,MAAO,EAGnC"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=l=>{let e,t=!1;const r=((...n)=>(t||(e=l(...n),t=!0),e));return r.reset=()=>{e=void 0,t=!1},r};exports.once=o;
2
- //# sourceMappingURL=once.cjs.map
1
+ var e=e=>{let t,n=!1,r=((...r)=>(n||=(t=e(...r),!0),t));return r.reset=()=>{t=void 0,n=!1},r};exports.once=e;
2
+ //# sourceMappingURL=once.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"once.cjs","sources":["../../src/function/once.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n/**\n * Create a function that runs once and returns the first result.\n *\n * @example\n * ```ts\n * const onceRandom = once(() => Math.random())\n * onceRandom() // 0.3\n * onceRandom() // 0.3\n *\n * onceRandom.reset()\n *\n * onceRandom() // 0.2\n * onceRandom() // 0.2\n * ```\n *\n * @param fn - The function to wrap.\n *\n * @returns A function that can only be called once.\n */\nexport const once = <T extends Fn>(fn: T): T & { reset: () => void } => {\n let result: ReturnType<T> | undefined;\n let called = false;\n\n const wrappedFn = ((...args: Parameters<T>): ReturnType<T> => {\n if (!called) {\n result = fn(...args);\n called = true;\n }\n return result as ReturnType<T>;\n }) as T & { reset: () => void };\n\n wrappedFn.reset = () => {\n result = undefined;\n called = false;\n };\n\n return wrappedFn;\n};\n"],"names":["once","fn","result","called","wrappedFn","args"],"mappings":"gFAqBO,MAAMA,EAAsBC,GAAqC,CACtE,IAAIC,EACAC,EAAS,GAEb,MAAMC,GAAa,IAAIC,KAChBF,IACHD,EAASD,EAAG,GAAGI,CAAI,EACnBF,EAAS,IAEJD,IAGT,OAAAE,EAAU,MAAQ,IAAM,CACtBF,EAAS,OACTC,EAAS,EACX,EAEOC,CACT"}
1
+ {"version":3,"file":"once.cjs","names":[],"sources":["../../src/function/once.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n/**\n * Create a function that runs once and returns the first result.\n *\n * @example\n * ```ts\n * const onceRandom = once(() => Math.random())\n * onceRandom() // 0.3\n * onceRandom() // 0.3\n *\n * onceRandom.reset()\n *\n * onceRandom() // 0.2\n * onceRandom() // 0.2\n * ```\n *\n * @param fn - The function to wrap.\n *\n * @returns A function that can only be called once.\n */\nexport const once = <T extends Fn>(fn: T): T & { reset: () => void } => {\n let result: ReturnType<T> | undefined;\n let called = false;\n\n const wrappedFn = ((...args: Parameters<T>): ReturnType<T> => {\n if (!called) {\n result = fn(...args);\n called = true;\n }\n\n return result as ReturnType<T>;\n }) as T & { reset: () => void };\n\n wrappedFn.reset = () => {\n result = undefined;\n called = false;\n };\n\n return wrappedFn;\n};\n"],"mappings":"AAqBA,IAAa,EAAsB,GAAqC,CACtE,IAAI,EACA,EAAS,GAEP,IAAc,GAAG,KACrB,AAEE,KADA,EAAS,EAAG,GAAG,EAAK,CACX,IAGJ,IAQT,MALA,GAAU,UAAc,CACtB,EAAS,IAAA,GACT,EAAS,IAGJ"}
@@ -0,0 +1,24 @@
1
+ import type { Fn } from '../types';
2
+ /**
3
+ * Create a function that runs once and returns the first result.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const onceRandom = once(() => Math.random())
8
+ * onceRandom() // 0.3
9
+ * onceRandom() // 0.3
10
+ *
11
+ * onceRandom.reset()
12
+ *
13
+ * onceRandom() // 0.2
14
+ * onceRandom() // 0.2
15
+ * ```
16
+ *
17
+ * @param fn - The function to wrap.
18
+ *
19
+ * @returns A function that can only be called once.
20
+ */
21
+ export declare const once: <T extends Fn>(fn: T) => T & {
22
+ reset: () => void;
23
+ };
24
+ //# sourceMappingURL=once.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"once.d.ts","sourceRoot":"","sources":["../../src/function/once.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,KAAG,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAmBjE,CAAC"}
@@ -1,11 +1,11 @@
1
- const s = (l) => {
2
- let e, t = !1;
3
- const r = ((...n) => (t || (e = l(...n), t = !0), e));
4
- return r.reset = () => {
5
- e = void 0, t = !1;
6
- }, r;
1
+ //#region src/function/once.ts
2
+ var e = (e) => {
3
+ let t, n = !1, r = ((...r) => (n ||= (t = e(...r), !0), t));
4
+ return r.reset = () => {
5
+ t = void 0, n = !1;
6
+ }, r;
7
7
  };
8
- export {
9
- s as once
10
- };
11
- //# sourceMappingURL=once.js.map
8
+ //#endregion
9
+ export { e as once };
10
+
11
+ //# sourceMappingURL=once.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"once.js","sources":["../../src/function/once.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n/**\n * Create a function that runs once and returns the first result.\n *\n * @example\n * ```ts\n * const onceRandom = once(() => Math.random())\n * onceRandom() // 0.3\n * onceRandom() // 0.3\n *\n * onceRandom.reset()\n *\n * onceRandom() // 0.2\n * onceRandom() // 0.2\n * ```\n *\n * @param fn - The function to wrap.\n *\n * @returns A function that can only be called once.\n */\nexport const once = <T extends Fn>(fn: T): T & { reset: () => void } => {\n let result: ReturnType<T> | undefined;\n let called = false;\n\n const wrappedFn = ((...args: Parameters<T>): ReturnType<T> => {\n if (!called) {\n result = fn(...args);\n called = true;\n }\n return result as ReturnType<T>;\n }) as T & { reset: () => void };\n\n wrappedFn.reset = () => {\n result = undefined;\n called = false;\n };\n\n return wrappedFn;\n};\n"],"names":["once","fn","result","called","wrappedFn","args"],"mappings":"AAqBO,MAAMA,IAAO,CAAeC,MAAqC;AACtE,MAAIC,GACAC,IAAS;AAEb,QAAMC,KAAa,IAAIC,OAChBF,MACHD,IAASD,EAAG,GAAGI,CAAI,GACnBF,IAAS,KAEJD;AAGT,SAAAE,EAAU,QAAQ,MAAM;AACtB,IAAAF,IAAS,QACTC,IAAS;AAAA,EACX,GAEOC;AACT;"}
1
+ {"version":3,"file":"once.js","names":[],"sources":["../../src/function/once.ts"],"sourcesContent":["import type { Fn } from '../types';\n\n/**\n * Create a function that runs once and returns the first result.\n *\n * @example\n * ```ts\n * const onceRandom = once(() => Math.random())\n * onceRandom() // 0.3\n * onceRandom() // 0.3\n *\n * onceRandom.reset()\n *\n * onceRandom() // 0.2\n * onceRandom() // 0.2\n * ```\n *\n * @param fn - The function to wrap.\n *\n * @returns A function that can only be called once.\n */\nexport const once = <T extends Fn>(fn: T): T & { reset: () => void } => {\n let result: ReturnType<T> | undefined;\n let called = false;\n\n const wrappedFn = ((...args: Parameters<T>): ReturnType<T> => {\n if (!called) {\n result = fn(...args);\n called = true;\n }\n\n return result as ReturnType<T>;\n }) as T & { reset: () => void };\n\n wrappedFn.reset = () => {\n result = undefined;\n called = false;\n };\n\n return wrappedFn;\n};\n"],"mappings":";AAqBA,IAAa,KAAsB,MAAqC;CACtE,IAAI,GACA,IAAS,IAEP,MAAc,GAAG,OACrB,AAEE,OADA,IAAS,EAAG,GAAG,EAAK,EACX,KAGJ;AAQT,QALA,EAAU,cAAc;AAEtB,EADA,IAAS,KAAA,GACT,IAAS;IAGJ"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../typed/isPromise.cjs"),c=require("./assert.cjs");function u(...e){c.assert(e.length>0,"pipe requires at least one function",{args:{fns:e}});const s=e[0],i=e.slice(1);return((...o)=>i.reduce((t,r)=>n.isPromise(t)?t.then(r):r(t),s(...o)))}exports.pipe=u;
2
- //# sourceMappingURL=pipe.cjs.map
1
+ const e=require(`./assert.cjs`);function t(...t){e.assert(t.length>0,`pipe requires at least one function`,{args:{fns:t}});let[n,...r]=t;return((...e)=>r.reduce((e,t)=>t(e),n(...e)))}exports.pipe=t;
2
+ //# sourceMappingURL=pipe.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipe.cjs","sources":["../../src/function/pipe.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\n\nimport { isPromise } from '../typed/isPromise';\nimport type { FnDynamic } from '../types';\nimport { assert } from './assert';\n\ntype FirstParameters<T> = T extends [infer First extends FnDynamic, ...any] ? Parameters<First> : never;\ntype LastReturnType<T> = T extends [...any, infer Last extends FnDynamic] ? ReturnType<Last> : never;\ntype PipeReturn<T extends FnDynamic[]> = (\n ...args: FirstParameters<T>\n) => LastReturnType<T> extends Promise<any> ? Promise<Awaited<LastReturnType<T>>> : LastReturnType<T>;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * @example\n * ```ts\n * const add = (x) => x + 2;\n * const multiply = (x) => x * 3;\n * const subtract = (x) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n * ```\n *\n * @example\n * ```ts\n * const square = async (x) => x * x;\n * const add = async (x) => x + 2;\n * const pipedFn = pipe(square, add);\n *\n * await pipedFn(4); // (4 * 4) + 2 = 18\n * ```\n *\n * @param fns - List of functions to be piped.\n *\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe<T extends FnDynamic[]>(...fns: T) {\n assert(fns.length > 0, 'pipe requires at least one function', { args: { fns } });\n\n const firstFn = fns[0];\n const restFns = fns.slice(1);\n\n return ((...args: FirstParameters<T>) =>\n restFns.reduce((prev, fn) => (isPromise(prev) ? prev.then(fn) : fn(prev)), firstFn(...args))) as PipeReturn<T>;\n}\n"],"names":["pipe","fns","assert","firstFn","restFns","args","prev","fn","isPromise"],"mappings":"oJAsCO,SAASA,KAA+BC,EAAQ,CACrDC,SAAOD,EAAI,OAAS,EAAG,sCAAuC,CAAE,KAAM,CAAE,IAAAA,CAAA,EAAO,EAE/E,MAAME,EAAUF,EAAI,CAAC,EACfG,EAAUH,EAAI,MAAM,CAAC,EAE3B,OAAQ,IAAII,IACVD,EAAQ,OAAO,CAACE,EAAMC,IAAQC,EAAAA,UAAUF,CAAI,EAAIA,EAAK,KAAKC,CAAE,EAAIA,EAAGD,CAAI,EAAIH,EAAQ,GAAGE,CAAI,CAAC,EAC/F"}
1
+ {"version":3,"file":"pipe.cjs","names":[],"sources":["../../src/function/pipe.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { assert } from './assert';\n\ntype FirstParameters<T> = T extends [infer First extends Fn, ...any] ? Parameters<First> : never;\ntype LastReturnType<T> = T extends [...any, infer Last extends Fn] ? ReturnType<Last> : never;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * @example\n * ```ts\n * const add = (x) => x + 2;\n * const multiply = (x) => x * 3;\n * const subtract = (x) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n * ```\n *\n * @param fns - List of functions to be piped.\n *\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe<T extends Fn[]>(...fns: T): (...args: FirstParameters<T>) => LastReturnType<T> {\n assert(fns.length > 0, 'pipe requires at least one function', { args: { fns } });\n\n const [firstFn, ...restFns] = fns;\n\n return ((...args: FirstParameters<T>) => restFns.reduce((prev, fn) => fn(prev), firstFn(...args))) as (\n ...args: FirstParameters<T>\n ) => LastReturnType<T>;\n}\n"],"mappings":"gCAwBA,SAAgB,EAAqB,GAAG,EAA4D,CAClG,EAAA,OAAO,EAAI,OAAS,EAAG,sCAAuC,CAAE,KAAM,CAAE,MAAK,CAAE,CAAC,CAEhF,GAAM,CAAC,EAAS,GAAG,GAAW,EAE9B,QAAS,GAAG,IAA6B,EAAQ,QAAQ,EAAM,IAAO,EAAG,EAAK,CAAE,EAAQ,GAAG,EAAK,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Fn } from '../types';
2
+ type FirstParameters<T> = T extends [infer First extends Fn, ...any] ? Parameters<First> : never;
3
+ type LastReturnType<T> = T extends [...any, infer Last extends Fn] ? ReturnType<Last> : never;
4
+ /**
5
+ * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const add = (x) => x + 2;
10
+ * const multiply = (x) => x * 3;
11
+ * const subtract = (x) => x - 4;
12
+ * const pipedFn = pipe(subtract, multiply, add);
13
+ *
14
+ * pipedFn(5); // ((5-4) * 3) + 2 = 5
15
+ * ```
16
+ *
17
+ * @param fns - List of functions to be piped.
18
+ *
19
+ * @returns A new function that is the pipe of the input functions.
20
+ */
21
+ export declare function pipe<T extends Fn[]>(...fns: T): (...args: FirstParameters<T>) => LastReturnType<T>;
22
+ export {};
23
+ //# sourceMappingURL=pipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../../src/function/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAInC,KAAK,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACjG,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAE9F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAQlG"}
@@ -1,11 +1,11 @@
1
- import { isPromise as n } from "../typed/isPromise.js";
2
- import { assert as c } from "./assert.js";
3
- function u(...t) {
4
- c(t.length > 0, "pipe requires at least one function", { args: { fns: t } });
5
- const i = t[0], o = t.slice(1);
6
- return ((...s) => o.reduce((e, r) => n(e) ? e.then(r) : r(e), i(...s)));
1
+ import { assert as e } from "./assert.js";
2
+ //#region src/function/pipe.ts
3
+ function t(...t) {
4
+ e(t.length > 0, "pipe requires at least one function", { args: { fns: t } });
5
+ let [n, ...r] = t;
6
+ return ((...e) => r.reduce((e, t) => t(e), n(...e)));
7
7
  }
8
- export {
9
- u as pipe
10
- };
11
- //# sourceMappingURL=pipe.js.map
8
+ //#endregion
9
+ export { t as pipe };
10
+
11
+ //# sourceMappingURL=pipe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipe.js","sources":["../../src/function/pipe.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\n\nimport { isPromise } from '../typed/isPromise';\nimport type { FnDynamic } from '../types';\nimport { assert } from './assert';\n\ntype FirstParameters<T> = T extends [infer First extends FnDynamic, ...any] ? Parameters<First> : never;\ntype LastReturnType<T> = T extends [...any, infer Last extends FnDynamic] ? ReturnType<Last> : never;\ntype PipeReturn<T extends FnDynamic[]> = (\n ...args: FirstParameters<T>\n) => LastReturnType<T> extends Promise<any> ? Promise<Awaited<LastReturnType<T>>> : LastReturnType<T>;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * @example\n * ```ts\n * const add = (x) => x + 2;\n * const multiply = (x) => x * 3;\n * const subtract = (x) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n * ```\n *\n * @example\n * ```ts\n * const square = async (x) => x * x;\n * const add = async (x) => x + 2;\n * const pipedFn = pipe(square, add);\n *\n * await pipedFn(4); // (4 * 4) + 2 = 18\n * ```\n *\n * @param fns - List of functions to be piped.\n *\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe<T extends FnDynamic[]>(...fns: T) {\n assert(fns.length > 0, 'pipe requires at least one function', { args: { fns } });\n\n const firstFn = fns[0];\n const restFns = fns.slice(1);\n\n return ((...args: FirstParameters<T>) =>\n restFns.reduce((prev, fn) => (isPromise(prev) ? prev.then(fn) : fn(prev)), firstFn(...args))) as PipeReturn<T>;\n}\n"],"names":["pipe","fns","assert","firstFn","restFns","args","prev","fn","isPromise"],"mappings":";;AAsCO,SAASA,KAA+BC,GAAQ;AACrD,EAAAC,EAAOD,EAAI,SAAS,GAAG,uCAAuC,EAAE,MAAM,EAAE,KAAAA,EAAA,GAAO;AAE/E,QAAME,IAAUF,EAAI,CAAC,GACfG,IAAUH,EAAI,MAAM,CAAC;AAE3B,UAAQ,IAAII,MACVD,EAAQ,OAAO,CAACE,GAAMC,MAAQC,EAAUF,CAAI,IAAIA,EAAK,KAAKC,CAAE,IAAIA,EAAGD,CAAI,GAAIH,EAAQ,GAAGE,CAAI,CAAC;AAC/F;"}
1
+ {"version":3,"file":"pipe.js","names":[],"sources":["../../src/function/pipe.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { assert } from './assert';\n\ntype FirstParameters<T> = T extends [infer First extends Fn, ...any] ? Parameters<First> : never;\ntype LastReturnType<T> = T extends [...any, infer Last extends Fn] ? ReturnType<Last> : never;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * @example\n * ```ts\n * const add = (x) => x + 2;\n * const multiply = (x) => x * 3;\n * const subtract = (x) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n * ```\n *\n * @param fns - List of functions to be piped.\n *\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe<T extends Fn[]>(...fns: T): (...args: FirstParameters<T>) => LastReturnType<T> {\n assert(fns.length > 0, 'pipe requires at least one function', { args: { fns } });\n\n const [firstFn, ...restFns] = fns;\n\n return ((...args: FirstParameters<T>) => restFns.reduce((prev, fn) => fn(prev), firstFn(...args))) as (\n ...args: FirstParameters<T>\n ) => LastReturnType<T>;\n}\n"],"mappings":";;AAwBA,SAAgB,EAAqB,GAAG,GAA4D;AAClG,GAAO,EAAI,SAAS,GAAG,uCAAuC,EAAE,MAAM,EAAE,QAAK,EAAE,CAAC;CAEhF,IAAM,CAAC,GAAS,GAAG,KAAW;AAE9B,UAAS,GAAG,MAA6B,EAAQ,QAAQ,GAAM,MAAO,EAAG,EAAK,EAAE,EAAQ,GAAG,EAAK,CAAC"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("./assert.cjs");function b(u,o=700,f={leading:!0,trailing:!0}){p.assert(typeof u=="function","First argument must be a function",{args:{fn:u},type:TypeError}),p.assert(typeof o=="number"&&o>=0,"Delay must be a non-negative number",{args:{delay:o},type:TypeError});const T=f.leading??!0,y=f.trailing??!1;let n,i=0,e,s,m;const c=()=>{n!==void 0&&(clearTimeout(n),n=void 0)},g=t=>{if(i=t,c(),!e)return;const r=e,l=s;return e=void 0,s=void 0,m=u.apply(l,r),m},d=t=>o-(t-i),v=()=>{const t=Date.now();e&&d(t)<=0?g(t):e?n=setTimeout(v,d(t)):c()},a=function(...t){const r=Date.now();i===0&&!T&&(i=r),e=t,s=this;const l=d(r);l<=0?g(r):y&&!n&&(n=setTimeout(v,l))};return a.cancel=()=>{c(),e=void 0,s=void 0,i=0},a.flush=()=>{if(!e)return;const t=Date.now();return g(t)},a.pending=()=>e!==void 0||n!==void 0,a}exports.throttle=b;
2
- //# sourceMappingURL=throttle.cjs.map
1
+ const e=require(`./assert.cjs`),t=require(`../async/scheduler.cjs`);function n(n,r=700,i={leading:!0,trailing:!1}){e.assert(typeof n==`function`,`First argument must be a function`,{args:{fn:n},type:TypeError}),e.assert(typeof r==`number`&&r>=0,`Delay must be a non-negative number`,{args:{delay:r},type:TypeError});let a=i.leading??!0,o=i.trailing??!1,s,c=0,l,u,d,f=()=>{s!==void 0&&(s.abort(),s=void 0)},p=e=>{let n=new AbortController,r=new t.Scheduler;s=n,r.postTask(g,{delay:e,priority:`user-visible`,signal:n.signal}).catch(()=>{})},m=e=>{if(c=e,f(),!l)return;let t=l,r=u;return l=void 0,u=void 0,d=n.apply(r,t),d},h=e=>r-(e-c),g=()=>{let e=Date.now();l&&h(e)<=0?m(e):l?p(h(e)):f()},_=function(...e){let t=Date.now();c===0&&!a&&(c=t),l=e,u=this;let n=h(t);n<=0?m(t):o&&!s&&p(n)};return _.cancel=()=>{f(),l=void 0,u=void 0,c=0},_.flush=()=>{if(l)return m(Date.now())},_.pending=()=>l!==void 0||s!==void 0,_}exports.throttle=n;
2
+ //# sourceMappingURL=throttle.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"throttle.cjs","sources":["../../src/function/throttle.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { assert } from './assert';\n\nexport type ThrottleOptions = {\n leading?: boolean; // invoke at the start of the window\n trailing?: boolean; // invoke at the end with the last args\n};\n\nexport type Throttled<T extends Fn> = ((this: ThisParameterType<T>, ...args: Parameters<T>) => void) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean; // whether there's a pending call that flush() would execute\n};\n\n/**\n * Throttles a function. By default, leading and trailing are both true (lodash-like behavior).\n * The function is invoked at the leading edge and trailing edge of the throttle period.\n *\n * Example:\n * const fn = () => ...\n * const t = throttle(fn, 700);\n * const leadingOnly = throttle(fn, 700, { trailing: false });\n */\nexport function throttle<T extends Fn>(\n fn: T,\n delay = 700,\n options: ThrottleOptions = { leading: true, trailing: true },\n): Throttled<T> {\n assert(typeof fn === 'function', 'First argument must be a function', {\n args: { fn },\n type: TypeError,\n });\n assert(typeof delay === 'number' && delay >= 0, 'Delay must be a non-negative number', {\n args: { delay },\n type: TypeError,\n });\n\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastInvokeTime = 0;\n let lastArgs: Parameters<T> | undefined;\n let lastThis: ThisParameterType<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n\n const clearTimer = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const invoke = (now: number) => {\n lastInvokeTime = now;\n clearTimer();\n if (!lastArgs) return undefined;\n const args = lastArgs;\n const ctx = lastThis as ThisParameterType<T>;\n lastArgs = undefined;\n lastThis = undefined;\n // biome-ignore lint/suspicious/noExplicitAny: -\n lastResult = fn.apply(ctx as any, args);\n return lastResult;\n };\n\n const remaining = (now: number) => delay - (now - lastInvokeTime);\n\n const timerExpired = () => {\n const now = Date.now();\n if (lastArgs && remaining(now) <= 0) {\n // trailing edge invoke\n invoke(now);\n } else if (lastArgs) {\n // reschedule until a window elapses\n timer = setTimeout(timerExpired, remaining(now));\n } else {\n clearTimer();\n }\n };\n\n const throttled = function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const now = Date.now();\n if (lastInvokeTime === 0 && !leading) {\n // If leading is false, start the window now but don't invoke immediately\n lastInvokeTime = now;\n }\n\n lastArgs = args;\n lastThis = this;\n\n const rem = remaining(now);\n\n if (rem <= 0) {\n // Window elapsed: invoke now\n invoke(now);\n } else if (trailing && !timer) {\n // Schedule trailing call if not already scheduled\n timer = setTimeout(timerExpired, rem);\n }\n } as Throttled<T>;\n\n throttled.cancel = () => {\n clearTimer();\n lastArgs = undefined;\n lastThis = undefined;\n lastInvokeTime = 0;\n };\n\n throttled.flush = () => {\n if (!lastArgs) return undefined;\n const now = Date.now();\n return invoke(now) as ReturnType<T> | undefined;\n };\n\n // Pending if a trailing call is scheduled OR there are queued args.\n throttled.pending = () => lastArgs !== undefined || timer !== undefined;\n\n return throttled;\n}\n"],"names":["throttle","fn","delay","options","assert","leading","trailing","timer","lastInvokeTime","lastArgs","lastThis","lastResult","clearTimer","invoke","now","args","ctx","remaining","timerExpired","throttled","rem"],"mappings":"gHAuBO,SAASA,EACdC,EACAC,EAAQ,IACRC,EAA2B,CAAE,QAAS,GAAM,SAAU,IACxC,CACdC,EAAAA,OAAO,OAAOH,GAAO,WAAY,oCAAqC,CACpE,KAAM,CAAE,GAAAA,CAAA,EACR,KAAM,SAAA,CACP,EACDG,EAAAA,OAAO,OAAOF,GAAU,UAAYA,GAAS,EAAG,sCAAuC,CACrF,KAAM,CAAE,MAAAA,CAAA,EACR,KAAM,SAAA,CACP,EAED,MAAMG,EAAUF,EAAQ,SAAW,GAC7BG,EAAWH,EAAQ,UAAY,GAErC,IAAII,EACAC,EAAiB,EACjBC,EACAC,EACAC,EAEJ,MAAMC,EAAa,IAAM,CACnBL,IAAU,SACZ,aAAaA,CAAK,EAClBA,EAAQ,OAEZ,EAEMM,EAAUC,GAAgB,CAG9B,GAFAN,EAAiBM,EACjBF,EAAA,EACI,CAACH,EAAU,OACf,MAAMM,EAAON,EACPO,EAAMN,EACZ,OAAAD,EAAW,OACXC,EAAW,OAEXC,EAAaV,EAAG,MAAMe,EAAYD,CAAI,EAC/BJ,CACT,EAEMM,EAAaH,GAAgBZ,GAASY,EAAMN,GAE5CU,EAAe,IAAM,CACzB,MAAMJ,EAAM,KAAK,IAAA,EACbL,GAAYQ,EAAUH,CAAG,GAAK,EAEhCD,EAAOC,CAAG,EACDL,EAETF,EAAQ,WAAWW,EAAcD,EAAUH,CAAG,CAAC,EAE/CF,EAAA,CAEJ,EAEMO,EAAY,YAAyCJ,EAAqB,CAC9E,MAAMD,EAAM,KAAK,IAAA,EACbN,IAAmB,GAAK,CAACH,IAE3BG,EAAiBM,GAGnBL,EAAWM,EACXL,EAAW,KAEX,MAAMU,EAAMH,EAAUH,CAAG,EAErBM,GAAO,EAETP,EAAOC,CAAG,EACDR,GAAY,CAACC,IAEtBA,EAAQ,WAAWW,EAAcE,CAAG,EAExC,EAEA,OAAAD,EAAU,OAAS,IAAM,CACvBP,EAAA,EACAH,EAAW,OACXC,EAAW,OACXF,EAAiB,CACnB,EAEAW,EAAU,MAAQ,IAAM,CACtB,GAAI,CAACV,EAAU,OACf,MAAMK,EAAM,KAAK,IAAA,EACjB,OAAOD,EAAOC,CAAG,CACnB,EAGAK,EAAU,QAAU,IAAMV,IAAa,QAAaF,IAAU,OAEvDY,CACT"}
1
+ {"version":3,"file":"throttle.cjs","names":[],"sources":["../../src/function/throttle.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { Scheduler } from '../async/scheduler';\nimport { assert } from './assert';\n\nexport type ThrottleOptions = {\n leading?: boolean; // invoke at the start of the window\n trailing?: boolean; // invoke at the end with the last args\n};\n\nexport type Throttled<T extends Fn> = ((this: ThisParameterType<T>, ...args: Parameters<T>) => void) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean; // whether there's a pending call that flush() would execute\n};\n\n/**\n * Throttles a function. By default, only the leading edge fires.\n * Pass `{ trailing: true }` to also invoke at the end of the throttle window.\n *\n * Example:\n * const fn = () => ...\n * const t = throttle(fn, 700);\n * const withTrailing = throttle(fn, 700, { trailing: true });\n */\nexport function throttle<T extends Fn>(\n fn: T,\n delay = 700,\n options: ThrottleOptions = { leading: true, trailing: false },\n): Throttled<T> {\n assert(typeof fn === 'function', 'First argument must be a function', {\n args: { fn },\n type: TypeError,\n });\n assert(typeof delay === 'number' && delay >= 0, 'Delay must be a non-negative number', {\n args: { delay },\n type: TypeError,\n });\n\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timerController: AbortController | undefined;\n let lastInvokeTime = 0;\n let lastArgs: Parameters<T> | undefined;\n let lastThis: ThisParameterType<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n\n const clearTimer = () => {\n if (timerController !== undefined) {\n timerController.abort();\n timerController = undefined;\n }\n };\n\n const scheduleTimer = (delayMs: number) => {\n const controller = new AbortController();\n const scheduler = new Scheduler();\n\n timerController = controller;\n void scheduler\n .postTask(timerExpired, {\n delay: delayMs,\n priority: 'user-visible',\n signal: controller.signal,\n })\n .catch(() => {\n // Aborts are expected when throttle is rescheduled or canceled.\n });\n };\n\n const invoke = (now: number) => {\n lastInvokeTime = now;\n clearTimer();\n\n if (!lastArgs) return undefined;\n\n const args = lastArgs;\n const ctx = lastThis as ThisParameterType<T>;\n\n lastArgs = undefined;\n lastThis = undefined;\n lastResult = fn.apply(ctx as any, args);\n\n return lastResult;\n };\n\n const remaining = (now: number) => delay - (now - lastInvokeTime);\n\n const timerExpired = () => {\n const now = Date.now();\n\n if (lastArgs && remaining(now) <= 0) {\n // trailing edge invoke\n invoke(now);\n } else if (lastArgs) {\n // reschedule until a window elapses\n scheduleTimer(remaining(now));\n } else {\n clearTimer();\n }\n };\n\n const throttled = function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const now = Date.now();\n\n if (lastInvokeTime === 0 && !leading) {\n // If leading is false, start the window now but don't invoke immediately\n lastInvokeTime = now;\n }\n\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n const rem = remaining(now);\n\n if (rem <= 0) {\n // Window elapsed: invoke now\n invoke(now);\n } else if (trailing && !timerController) {\n // Schedule trailing call if not already scheduled\n scheduleTimer(rem);\n }\n } as Throttled<T>;\n\n throttled.cancel = () => {\n clearTimer();\n lastArgs = undefined;\n lastThis = undefined;\n lastInvokeTime = 0;\n };\n\n throttled.flush = () => {\n if (!lastArgs) return undefined;\n\n const now = Date.now();\n\n return invoke(now) as ReturnType<T> | undefined;\n };\n\n // Pending if a trailing call is scheduled OR there are queued args.\n throttled.pending = () => lastArgs !== undefined || timerController !== undefined;\n\n return throttled;\n}\n"],"mappings":"oEAyBA,SAAgB,EACd,EACA,EAAQ,IACR,EAA2B,CAAE,QAAS,GAAM,SAAU,GAAO,CAC/C,CACd,EAAA,OAAO,OAAO,GAAO,WAAY,oCAAqC,CACpE,KAAM,CAAE,KAAI,CACZ,KAAM,UACP,CAAC,CACF,EAAA,OAAO,OAAO,GAAU,UAAY,GAAS,EAAG,sCAAuC,CACrF,KAAM,CAAE,QAAO,CACf,KAAM,UACP,CAAC,CAEF,IAAM,EAAU,EAAQ,SAAW,GAC7B,EAAW,EAAQ,UAAY,GAEjC,EACA,EAAiB,EACjB,EACA,EACA,EAEE,MAAmB,CACnB,IAAoB,IAAA,KACtB,EAAgB,OAAO,CACvB,EAAkB,IAAA,KAIhB,EAAiB,GAAoB,CACzC,IAAM,EAAa,IAAI,gBACjB,EAAY,IAAI,EAAA,UAEtB,EAAkB,EACb,EACF,SAAS,EAAc,CACtB,MAAO,EACP,SAAU,eACV,OAAQ,EAAW,OACpB,CAAC,CACD,UAAY,GAEX,EAGA,EAAU,GAAgB,CAI9B,GAHA,EAAiB,EACjB,GAAY,CAER,CAAC,EAAU,OAEf,IAAM,EAAO,EACP,EAAM,EAMZ,MAJA,GAAW,IAAA,GACX,EAAW,IAAA,GACX,EAAa,EAAG,MAAM,EAAY,EAAK,CAEhC,GAGH,EAAa,GAAgB,GAAS,EAAM,GAE5C,MAAqB,CACzB,IAAM,EAAM,KAAK,KAAK,CAElB,GAAY,EAAU,EAAI,EAAI,EAEhC,EAAO,EAAI,CACF,EAET,EAAc,EAAU,EAAI,CAAC,CAE7B,GAAY,EAIV,EAAY,SAAsC,GAAG,EAAqB,CAC9E,IAAM,EAAM,KAAK,KAAK,CAElB,IAAmB,GAAK,CAAC,IAE3B,EAAiB,GAGnB,EAAW,EAEX,EAAW,KAEX,IAAM,EAAM,EAAU,EAAI,CAEtB,GAAO,EAET,EAAO,EAAI,CACF,GAAY,CAAC,GAEtB,EAAc,EAAI,EAsBtB,MAlBA,GAAU,WAAe,CACvB,GAAY,CACZ,EAAW,IAAA,GACX,EAAW,IAAA,GACX,EAAiB,GAGnB,EAAU,UAAc,CACjB,KAIL,OAAO,EAFK,KAAK,KAAK,CAEJ,EAIpB,EAAU,YAAgB,IAAa,IAAA,IAAa,IAAoB,IAAA,GAEjE"}
@@ -0,0 +1,21 @@
1
+ import type { Fn } from '../types';
2
+ export type ThrottleOptions = {
3
+ leading?: boolean;
4
+ trailing?: boolean;
5
+ };
6
+ export type Throttled<T extends Fn> = ((this: ThisParameterType<T>, ...args: Parameters<T>) => void) & {
7
+ cancel(): void;
8
+ flush(): ReturnType<T> | undefined;
9
+ pending(): boolean;
10
+ };
11
+ /**
12
+ * Throttles a function. By default, only the leading edge fires.
13
+ * Pass `{ trailing: true }` to also invoke at the end of the throttle window.
14
+ *
15
+ * Example:
16
+ * const fn = () => ...
17
+ * const t = throttle(fn, 700);
18
+ * const withTrailing = throttle(fn, 700, { trailing: true });
19
+ */
20
+ export declare function throttle<T extends Fn>(fn: T, delay?: number, options?: ThrottleOptions): Throttled<T>;
21
+ //# sourceMappingURL=throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../src/function/throttle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAKnC,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG;IACrG,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACnC,OAAO,IAAI,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,EAAE,EACnC,EAAE,EAAE,CAAC,EACL,KAAK,SAAM,EACX,OAAO,GAAE,eAAoD,GAC5D,SAAS,CAAC,CAAC,CAAC,CAoHd"}
@@ -1,38 +1,46 @@
1
- import { assert as p } from "./assert.js";
2
- function y(c, r = 700, g = { leading: !0, trailing: !0 }) {
3
- p(typeof c == "function", "First argument must be a function", {
4
- args: { fn: c },
5
- type: TypeError
6
- }), p(typeof r == "number" && r >= 0, "Delay must be a non-negative number", {
7
- args: { delay: r },
8
- type: TypeError
9
- });
10
- const T = g.leading ?? !0, w = g.trailing ?? !1;
11
- let n, i = 0, e, s, d;
12
- const u = () => {
13
- n !== void 0 && (clearTimeout(n), n = void 0);
14
- }, m = (t) => {
15
- if (i = t, u(), !e) return;
16
- const o = e, l = s;
17
- return e = void 0, s = void 0, d = c.apply(l, o), d;
18
- }, f = (t) => r - (t - i), v = () => {
19
- const t = Date.now();
20
- e && f(t) <= 0 ? m(t) : e ? n = setTimeout(v, f(t)) : u();
21
- }, a = function(...t) {
22
- const o = Date.now();
23
- i === 0 && !T && (i = o), e = t, s = this;
24
- const l = f(o);
25
- l <= 0 ? m(o) : w && !n && (n = setTimeout(v, l));
26
- };
27
- return a.cancel = () => {
28
- u(), e = void 0, s = void 0, i = 0;
29
- }, a.flush = () => {
30
- if (!e) return;
31
- const t = Date.now();
32
- return m(t);
33
- }, a.pending = () => e !== void 0 || n !== void 0, a;
1
+ import { assert as e } from "./assert.js";
2
+ import { Scheduler as t } from "../async/scheduler.js";
3
+ //#region src/function/throttle.ts
4
+ function n(n, r = 700, i = {
5
+ leading: !0,
6
+ trailing: !1
7
+ }) {
8
+ e(typeof n == "function", "First argument must be a function", {
9
+ args: { fn: n },
10
+ type: TypeError
11
+ }), e(typeof r == "number" && r >= 0, "Delay must be a non-negative number", {
12
+ args: { delay: r },
13
+ type: TypeError
14
+ });
15
+ let a = i.leading ?? !0, o = i.trailing ?? !1, s, c = 0, l, u, d, f = () => {
16
+ s !== void 0 && (s.abort(), s = void 0);
17
+ }, p = (e) => {
18
+ let n = new AbortController(), r = new t();
19
+ s = n, r.postTask(g, {
20
+ delay: e,
21
+ priority: "user-visible",
22
+ signal: n.signal
23
+ }).catch(() => {});
24
+ }, m = (e) => {
25
+ if (c = e, f(), !l) return;
26
+ let t = l, r = u;
27
+ return l = void 0, u = void 0, d = n.apply(r, t), d;
28
+ }, h = (e) => r - (e - c), g = () => {
29
+ let e = Date.now();
30
+ l && h(e) <= 0 ? m(e) : l ? p(h(e)) : f();
31
+ }, _ = function(...e) {
32
+ let t = Date.now();
33
+ c === 0 && !a && (c = t), l = e, u = this;
34
+ let n = h(t);
35
+ n <= 0 ? m(t) : o && !s && p(n);
36
+ };
37
+ return _.cancel = () => {
38
+ f(), l = void 0, u = void 0, c = 0;
39
+ }, _.flush = () => {
40
+ if (l) return m(Date.now());
41
+ }, _.pending = () => l !== void 0 || s !== void 0, _;
34
42
  }
35
- export {
36
- y as throttle
37
- };
38
- //# sourceMappingURL=throttle.js.map
43
+ //#endregion
44
+ export { n as throttle };
45
+
46
+ //# sourceMappingURL=throttle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"throttle.js","sources":["../../src/function/throttle.ts"],"sourcesContent":["import type { Fn } from '../types';\nimport { assert } from './assert';\n\nexport type ThrottleOptions = {\n leading?: boolean; // invoke at the start of the window\n trailing?: boolean; // invoke at the end with the last args\n};\n\nexport type Throttled<T extends Fn> = ((this: ThisParameterType<T>, ...args: Parameters<T>) => void) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean; // whether there's a pending call that flush() would execute\n};\n\n/**\n * Throttles a function. By default, leading and trailing are both true (lodash-like behavior).\n * The function is invoked at the leading edge and trailing edge of the throttle period.\n *\n * Example:\n * const fn = () => ...\n * const t = throttle(fn, 700);\n * const leadingOnly = throttle(fn, 700, { trailing: false });\n */\nexport function throttle<T extends Fn>(\n fn: T,\n delay = 700,\n options: ThrottleOptions = { leading: true, trailing: true },\n): Throttled<T> {\n assert(typeof fn === 'function', 'First argument must be a function', {\n args: { fn },\n type: TypeError,\n });\n assert(typeof delay === 'number' && delay >= 0, 'Delay must be a non-negative number', {\n args: { delay },\n type: TypeError,\n });\n\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastInvokeTime = 0;\n let lastArgs: Parameters<T> | undefined;\n let lastThis: ThisParameterType<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n\n const clearTimer = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const invoke = (now: number) => {\n lastInvokeTime = now;\n clearTimer();\n if (!lastArgs) return undefined;\n const args = lastArgs;\n const ctx = lastThis as ThisParameterType<T>;\n lastArgs = undefined;\n lastThis = undefined;\n // biome-ignore lint/suspicious/noExplicitAny: -\n lastResult = fn.apply(ctx as any, args);\n return lastResult;\n };\n\n const remaining = (now: number) => delay - (now - lastInvokeTime);\n\n const timerExpired = () => {\n const now = Date.now();\n if (lastArgs && remaining(now) <= 0) {\n // trailing edge invoke\n invoke(now);\n } else if (lastArgs) {\n // reschedule until a window elapses\n timer = setTimeout(timerExpired, remaining(now));\n } else {\n clearTimer();\n }\n };\n\n const throttled = function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const now = Date.now();\n if (lastInvokeTime === 0 && !leading) {\n // If leading is false, start the window now but don't invoke immediately\n lastInvokeTime = now;\n }\n\n lastArgs = args;\n lastThis = this;\n\n const rem = remaining(now);\n\n if (rem <= 0) {\n // Window elapsed: invoke now\n invoke(now);\n } else if (trailing && !timer) {\n // Schedule trailing call if not already scheduled\n timer = setTimeout(timerExpired, rem);\n }\n } as Throttled<T>;\n\n throttled.cancel = () => {\n clearTimer();\n lastArgs = undefined;\n lastThis = undefined;\n lastInvokeTime = 0;\n };\n\n throttled.flush = () => {\n if (!lastArgs) return undefined;\n const now = Date.now();\n return invoke(now) as ReturnType<T> | undefined;\n };\n\n // Pending if a trailing call is scheduled OR there are queued args.\n throttled.pending = () => lastArgs !== undefined || timer !== undefined;\n\n return throttled;\n}\n"],"names":["throttle","fn","delay","options","assert","leading","trailing","timer","lastInvokeTime","lastArgs","lastThis","lastResult","clearTimer","invoke","now","args","ctx","remaining","timerExpired","throttled","rem"],"mappings":";AAuBO,SAASA,EACdC,GACAC,IAAQ,KACRC,IAA2B,EAAE,SAAS,IAAM,UAAU,MACxC;AACd,EAAAC,EAAO,OAAOH,KAAO,YAAY,qCAAqC;AAAA,IACpE,MAAM,EAAE,IAAAA,EAAA;AAAA,IACR,MAAM;AAAA,EAAA,CACP,GACDG,EAAO,OAAOF,KAAU,YAAYA,KAAS,GAAG,uCAAuC;AAAA,IACrF,MAAM,EAAE,OAAAA,EAAA;AAAA,IACR,MAAM;AAAA,EAAA,CACP;AAED,QAAMG,IAAUF,EAAQ,WAAW,IAC7BG,IAAWH,EAAQ,YAAY;AAErC,MAAII,GACAC,IAAiB,GACjBC,GACAC,GACAC;AAEJ,QAAMC,IAAa,MAAM;AACvB,IAAIL,MAAU,WACZ,aAAaA,CAAK,GAClBA,IAAQ;AAAA,EAEZ,GAEMM,IAAS,CAACC,MAAgB;AAG9B,QAFAN,IAAiBM,GACjBF,EAAA,GACI,CAACH,EAAU;AACf,UAAMM,IAAON,GACPO,IAAMN;AACZ,WAAAD,IAAW,QACXC,IAAW,QAEXC,IAAaV,EAAG,MAAMe,GAAYD,CAAI,GAC/BJ;AAAA,EACT,GAEMM,IAAY,CAACH,MAAgBZ,KAASY,IAAMN,IAE5CU,IAAe,MAAM;AACzB,UAAMJ,IAAM,KAAK,IAAA;AACjB,IAAIL,KAAYQ,EAAUH,CAAG,KAAK,IAEhCD,EAAOC,CAAG,IACDL,IAETF,IAAQ,WAAWW,GAAcD,EAAUH,CAAG,CAAC,IAE/CF,EAAA;AAAA,EAEJ,GAEMO,IAAY,YAAyCJ,GAAqB;AAC9E,UAAMD,IAAM,KAAK,IAAA;AACjB,IAAIN,MAAmB,KAAK,CAACH,MAE3BG,IAAiBM,IAGnBL,IAAWM,GACXL,IAAW;AAEX,UAAMU,IAAMH,EAAUH,CAAG;AAEzB,IAAIM,KAAO,IAETP,EAAOC,CAAG,IACDR,KAAY,CAACC,MAEtBA,IAAQ,WAAWW,GAAcE,CAAG;AAAA,EAExC;AAEA,SAAAD,EAAU,SAAS,MAAM;AACvB,IAAAP,EAAA,GACAH,IAAW,QACXC,IAAW,QACXF,IAAiB;AAAA,EACnB,GAEAW,EAAU,QAAQ,MAAM;AACtB,QAAI,CAACV,EAAU;AACf,UAAMK,IAAM,KAAK,IAAA;AACjB,WAAOD,EAAOC,CAAG;AAAA,EACnB,GAGAK,EAAU,UAAU,MAAMV,MAAa,UAAaF,MAAU,QAEvDY;AACT;"}
1
+ {"version":3,"file":"throttle.js","names":[],"sources":["../../src/function/throttle.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { Scheduler } from '../async/scheduler';\nimport { assert } from './assert';\n\nexport type ThrottleOptions = {\n leading?: boolean; // invoke at the start of the window\n trailing?: boolean; // invoke at the end with the last args\n};\n\nexport type Throttled<T extends Fn> = ((this: ThisParameterType<T>, ...args: Parameters<T>) => void) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean; // whether there's a pending call that flush() would execute\n};\n\n/**\n * Throttles a function. By default, only the leading edge fires.\n * Pass `{ trailing: true }` to also invoke at the end of the throttle window.\n *\n * Example:\n * const fn = () => ...\n * const t = throttle(fn, 700);\n * const withTrailing = throttle(fn, 700, { trailing: true });\n */\nexport function throttle<T extends Fn>(\n fn: T,\n delay = 700,\n options: ThrottleOptions = { leading: true, trailing: false },\n): Throttled<T> {\n assert(typeof fn === 'function', 'First argument must be a function', {\n args: { fn },\n type: TypeError,\n });\n assert(typeof delay === 'number' && delay >= 0, 'Delay must be a non-negative number', {\n args: { delay },\n type: TypeError,\n });\n\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timerController: AbortController | undefined;\n let lastInvokeTime = 0;\n let lastArgs: Parameters<T> | undefined;\n let lastThis: ThisParameterType<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n\n const clearTimer = () => {\n if (timerController !== undefined) {\n timerController.abort();\n timerController = undefined;\n }\n };\n\n const scheduleTimer = (delayMs: number) => {\n const controller = new AbortController();\n const scheduler = new Scheduler();\n\n timerController = controller;\n void scheduler\n .postTask(timerExpired, {\n delay: delayMs,\n priority: 'user-visible',\n signal: controller.signal,\n })\n .catch(() => {\n // Aborts are expected when throttle is rescheduled or canceled.\n });\n };\n\n const invoke = (now: number) => {\n lastInvokeTime = now;\n clearTimer();\n\n if (!lastArgs) return undefined;\n\n const args = lastArgs;\n const ctx = lastThis as ThisParameterType<T>;\n\n lastArgs = undefined;\n lastThis = undefined;\n lastResult = fn.apply(ctx as any, args);\n\n return lastResult;\n };\n\n const remaining = (now: number) => delay - (now - lastInvokeTime);\n\n const timerExpired = () => {\n const now = Date.now();\n\n if (lastArgs && remaining(now) <= 0) {\n // trailing edge invoke\n invoke(now);\n } else if (lastArgs) {\n // reschedule until a window elapses\n scheduleTimer(remaining(now));\n } else {\n clearTimer();\n }\n };\n\n const throttled = function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const now = Date.now();\n\n if (lastInvokeTime === 0 && !leading) {\n // If leading is false, start the window now but don't invoke immediately\n lastInvokeTime = now;\n }\n\n lastArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this;\n\n const rem = remaining(now);\n\n if (rem <= 0) {\n // Window elapsed: invoke now\n invoke(now);\n } else if (trailing && !timerController) {\n // Schedule trailing call if not already scheduled\n scheduleTimer(rem);\n }\n } as Throttled<T>;\n\n throttled.cancel = () => {\n clearTimer();\n lastArgs = undefined;\n lastThis = undefined;\n lastInvokeTime = 0;\n };\n\n throttled.flush = () => {\n if (!lastArgs) return undefined;\n\n const now = Date.now();\n\n return invoke(now) as ReturnType<T> | undefined;\n };\n\n // Pending if a trailing call is scheduled OR there are queued args.\n throttled.pending = () => lastArgs !== undefined || timerController !== undefined;\n\n return throttled;\n}\n"],"mappings":";;;AAyBA,SAAgB,EACd,GACA,IAAQ,KACR,IAA2B;CAAE,SAAS;CAAM,UAAU;CAAO,EAC/C;AAKd,CAJA,EAAO,OAAO,KAAO,YAAY,qCAAqC;EACpE,MAAM,EAAE,OAAI;EACZ,MAAM;EACP,CAAC,EACF,EAAO,OAAO,KAAU,YAAY,KAAS,GAAG,uCAAuC;EACrF,MAAM,EAAE,UAAO;EACf,MAAM;EACP,CAAC;CAEF,IAAM,IAAU,EAAQ,WAAW,IAC7B,IAAW,EAAQ,YAAY,IAEjC,GACA,IAAiB,GACjB,GACA,GACA,GAEE,UAAmB;AACvB,EAAI,MAAoB,KAAA,MACtB,EAAgB,OAAO,EACvB,IAAkB,KAAA;IAIhB,KAAiB,MAAoB;EACzC,IAAM,IAAa,IAAI,iBAAiB,EAClC,IAAY,IAAI,GAAW;AAG5B,EADL,IAAkB,GACb,EACF,SAAS,GAAc;GACtB,OAAO;GACP,UAAU;GACV,QAAQ,EAAW;GACpB,CAAC,CACD,YAAY,GAEX;IAGA,KAAU,MAAgB;AAI9B,MAHA,IAAiB,GACjB,GAAY,EAER,CAAC,EAAU;EAEf,IAAM,IAAO,GACP,IAAM;AAMZ,SAJA,IAAW,KAAA,GACX,IAAW,KAAA,GACX,IAAa,EAAG,MAAM,GAAY,EAAK,EAEhC;IAGH,KAAa,MAAgB,KAAS,IAAM,IAE5C,UAAqB;EACzB,IAAM,IAAM,KAAK,KAAK;AAEtB,EAAI,KAAY,EAAU,EAAI,IAAI,IAEhC,EAAO,EAAI,GACF,IAET,EAAc,EAAU,EAAI,CAAC,GAE7B,GAAY;IAIV,IAAY,SAAsC,GAAG,GAAqB;EAC9E,IAAM,IAAM,KAAK,KAAK;AAStB,EAPI,MAAmB,KAAK,CAAC,MAE3B,IAAiB,IAGnB,IAAW,GAEX,IAAW;EAEX,IAAM,IAAM,EAAU,EAAI;AAE1B,EAAI,KAAO,IAET,EAAO,EAAI,GACF,KAAY,CAAC,KAEtB,EAAc,EAAI;;AAsBtB,QAlBA,EAAU,eAAe;AAIvB,EAHA,GAAY,EACZ,IAAW,KAAA,GACX,IAAW,KAAA,GACX,IAAiB;IAGnB,EAAU,cAAc;AACjB,QAIL,QAAO,EAFK,KAAK,KAAK,CAEJ;IAIpB,EAAU,gBAAgB,MAAa,KAAA,KAAa,MAAoB,KAAA,GAEjE"}