@vielzeug/arsenal 2.0.1 → 3.0.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 (313) hide show
  1. package/README.md +5 -18
  2. package/dist/array/chunk.cjs.map +1 -1
  3. package/dist/array/chunk.d.ts +1 -1
  4. package/dist/array/chunk.d.ts.map +1 -1
  5. package/dist/array/chunk.js.map +1 -1
  6. package/dist/array/compact.cjs.map +1 -1
  7. package/dist/array/compact.d.ts +1 -1
  8. package/dist/array/compact.d.ts.map +1 -1
  9. package/dist/array/compact.js.map +1 -1
  10. package/dist/array/contains.cjs.map +1 -1
  11. package/dist/array/contains.d.ts +1 -1
  12. package/dist/array/contains.d.ts.map +1 -1
  13. package/dist/array/contains.js.map +1 -1
  14. package/dist/array/countBy.cjs.map +1 -1
  15. package/dist/array/countBy.d.ts +1 -1
  16. package/dist/array/countBy.d.ts.map +1 -1
  17. package/dist/array/countBy.js.map +1 -1
  18. package/dist/array/difference.cjs.map +1 -1
  19. package/dist/array/difference.d.ts +4 -2
  20. package/dist/array/difference.d.ts.map +1 -1
  21. package/dist/array/difference.js.map +1 -1
  22. package/dist/array/drop.cjs.map +1 -1
  23. package/dist/array/drop.d.ts +1 -1
  24. package/dist/array/drop.d.ts.map +1 -1
  25. package/dist/array/drop.js.map +1 -1
  26. package/dist/array/dropLast.cjs.map +1 -1
  27. package/dist/array/dropLast.d.ts +1 -1
  28. package/dist/array/dropLast.d.ts.map +1 -1
  29. package/dist/array/dropLast.js.map +1 -1
  30. package/dist/array/filterMap.cjs.map +1 -1
  31. package/dist/array/filterMap.d.ts +3 -1
  32. package/dist/array/filterMap.d.ts.map +1 -1
  33. package/dist/array/filterMap.js.map +1 -1
  34. package/dist/array/first.cjs.map +1 -1
  35. package/dist/array/first.d.ts +1 -1
  36. package/dist/array/first.d.ts.map +1 -1
  37. package/dist/array/first.js.map +1 -1
  38. package/dist/array/groupBy.cjs.map +1 -1
  39. package/dist/array/groupBy.d.ts +1 -1
  40. package/dist/array/groupBy.d.ts.map +1 -1
  41. package/dist/array/groupBy.js.map +1 -1
  42. package/dist/array/index.cjs +1 -1
  43. package/dist/array/index.d.ts +0 -1
  44. package/dist/array/index.d.ts.map +1 -1
  45. package/dist/array/index.js +17 -18
  46. package/dist/array/indexBy.cjs.map +1 -1
  47. package/dist/array/indexBy.d.ts +1 -1
  48. package/dist/array/indexBy.d.ts.map +1 -1
  49. package/dist/array/indexBy.js.map +1 -1
  50. package/dist/array/intersection.cjs.map +1 -1
  51. package/dist/array/intersection.d.ts +4 -2
  52. package/dist/array/intersection.d.ts.map +1 -1
  53. package/dist/array/intersection.js.map +1 -1
  54. package/dist/array/last.cjs.map +1 -1
  55. package/dist/array/last.d.ts +1 -1
  56. package/dist/array/last.d.ts.map +1 -1
  57. package/dist/array/last.js.map +1 -1
  58. package/dist/array/partition.cjs.map +1 -1
  59. package/dist/array/partition.d.ts +3 -1
  60. package/dist/array/partition.d.ts.map +1 -1
  61. package/dist/array/partition.js.map +1 -1
  62. package/dist/array/replace.cjs.map +1 -1
  63. package/dist/array/replace.d.ts +2 -15
  64. package/dist/array/replace.d.ts.map +1 -1
  65. package/dist/array/replace.js.map +1 -1
  66. package/dist/array/rotate.cjs.map +1 -1
  67. package/dist/array/rotate.d.ts +5 -17
  68. package/dist/array/rotate.d.ts.map +1 -1
  69. package/dist/array/rotate.js.map +1 -1
  70. package/dist/array/sort.cjs.map +1 -1
  71. package/dist/array/sort.d.ts +2 -2
  72. package/dist/array/sort.d.ts.map +1 -1
  73. package/dist/array/sort.js.map +1 -1
  74. package/dist/array/take.cjs.map +1 -1
  75. package/dist/array/take.d.ts +1 -1
  76. package/dist/array/take.d.ts.map +1 -1
  77. package/dist/array/take.js.map +1 -1
  78. package/dist/array/takeLast.cjs.map +1 -1
  79. package/dist/array/takeLast.d.ts +1 -1
  80. package/dist/array/takeLast.d.ts.map +1 -1
  81. package/dist/array/takeLast.js.map +1 -1
  82. package/dist/array/toggle.cjs.map +1 -1
  83. package/dist/array/toggle.d.ts +1 -1
  84. package/dist/array/toggle.d.ts.map +1 -1
  85. package/dist/array/toggle.js.map +1 -1
  86. package/dist/array/union.cjs.map +1 -1
  87. package/dist/array/union.d.ts +4 -2
  88. package/dist/array/union.d.ts.map +1 -1
  89. package/dist/array/union.js.map +1 -1
  90. package/dist/array/uniq.cjs.map +1 -1
  91. package/dist/array/uniq.d.ts +1 -1
  92. package/dist/array/uniq.d.ts.map +1 -1
  93. package/dist/array/uniq.js.map +1 -1
  94. package/dist/array/zip.cjs.map +1 -1
  95. package/dist/array/zip.d.ts +1 -1
  96. package/dist/array/zip.d.ts.map +1 -1
  97. package/dist/array/zip.js.map +1 -1
  98. package/dist/arsenal.cjs +1 -1
  99. package/dist/arsenal.cjs.map +1 -1
  100. package/dist/arsenal.iife.js +1 -1
  101. package/dist/arsenal.iife.js.map +1 -1
  102. package/dist/arsenal.js +1 -1
  103. package/dist/arsenal.js.map +1 -1
  104. package/dist/async/abortError.cjs +1 -1
  105. package/dist/async/abortError.cjs.map +1 -1
  106. package/dist/async/abortError.d.ts +3 -2
  107. package/dist/async/abortError.d.ts.map +1 -1
  108. package/dist/async/abortError.js +2 -2
  109. package/dist/async/abortError.js.map +1 -1
  110. package/dist/async/abortable.cjs +2 -0
  111. package/dist/async/abortable.cjs.map +1 -0
  112. package/dist/async/abortable.d.ts +26 -0
  113. package/dist/async/abortable.d.ts.map +1 -0
  114. package/dist/async/abortable.js +12 -0
  115. package/dist/async/abortable.js.map +1 -0
  116. package/dist/async/backoff.cjs +1 -1
  117. package/dist/async/backoff.cjs.map +1 -1
  118. package/dist/async/backoff.js +1 -2
  119. package/dist/async/backoff.js.map +1 -1
  120. package/dist/async/index.cjs +1 -1
  121. package/dist/async/index.d.ts +1 -0
  122. package/dist/async/index.d.ts.map +1 -1
  123. package/dist/async/index.js +9 -8
  124. package/dist/async/taskPool.cjs.map +1 -1
  125. package/dist/async/taskPool.d.ts +4 -4
  126. package/dist/async/taskPool.d.ts.map +1 -1
  127. package/dist/async/taskPool.js.map +1 -1
  128. package/dist/cache/cache.cjs +1 -1
  129. package/dist/cache/cache.cjs.map +1 -1
  130. package/dist/cache/cache.d.ts +1 -0
  131. package/dist/cache/cache.d.ts.map +1 -1
  132. package/dist/cache/cache.js +2 -1
  133. package/dist/cache/cache.js.map +1 -1
  134. package/dist/cache/memo.cjs.map +1 -1
  135. package/dist/cache/memo.d.ts.map +1 -1
  136. package/dist/cache/memo.js.map +1 -1
  137. package/dist/errors.cjs +1 -1
  138. package/dist/errors.cjs.map +1 -1
  139. package/dist/errors.d.ts +0 -1
  140. package/dist/errors.d.ts.map +1 -1
  141. package/dist/errors.js +1 -4
  142. package/dist/errors.js.map +1 -1
  143. package/dist/function/assert.cjs.map +1 -1
  144. package/dist/function/assert.d.ts +1 -1
  145. package/dist/function/assert.js.map +1 -1
  146. package/dist/function/debounce.cjs.map +1 -1
  147. package/dist/function/debounce.d.ts.map +1 -1
  148. package/dist/function/debounce.js.map +1 -1
  149. package/dist/function/pipe.cjs +1 -1
  150. package/dist/function/pipe.cjs.map +1 -1
  151. package/dist/function/pipe.js +1 -1
  152. package/dist/function/pipe.js.map +1 -1
  153. package/dist/function/runAll.cjs +1 -1
  154. package/dist/function/runAll.cjs.map +1 -1
  155. package/dist/function/runAll.js +1 -1
  156. package/dist/function/runAll.js.map +1 -1
  157. package/dist/guards/index.cjs +1 -1
  158. package/dist/guards/index.js +7 -7
  159. package/dist/guards/isEmpty.cjs +1 -1
  160. package/dist/guards/isEmpty.cjs.map +1 -1
  161. package/dist/guards/isEmpty.d.ts.map +1 -1
  162. package/dist/guards/isEmpty.js +4 -5
  163. package/dist/guards/isEmpty.js.map +1 -1
  164. package/dist/guards/isFunction.cjs.map +1 -1
  165. package/dist/guards/isFunction.d.ts +1 -1
  166. package/dist/guards/isFunction.d.ts.map +1 -1
  167. package/dist/guards/isFunction.js.map +1 -1
  168. package/dist/guards/isPrimitive.cjs +1 -1
  169. package/dist/guards/isPrimitive.cjs.map +1 -1
  170. package/dist/guards/isPrimitive.d.ts +4 -17
  171. package/dist/guards/isPrimitive.d.ts.map +1 -1
  172. package/dist/guards/isPrimitive.js +1 -2
  173. package/dist/guards/isPrimitive.js.map +1 -1
  174. package/dist/index.cjs +1 -1
  175. package/dist/index.d.ts +7 -2
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +27 -22
  178. package/dist/math/average.cjs +1 -1
  179. package/dist/math/average.cjs.map +1 -1
  180. package/dist/math/average.d.ts +3 -2
  181. package/dist/math/average.d.ts.map +1 -1
  182. package/dist/math/average.js +1 -6
  183. package/dist/math/average.js.map +1 -1
  184. package/dist/math/gcd.cjs +1 -1
  185. package/dist/math/gcd.cjs.map +1 -1
  186. package/dist/math/gcd.d.ts.map +1 -1
  187. package/dist/math/gcd.js +1 -0
  188. package/dist/math/gcd.js.map +1 -1
  189. package/dist/math/index.cjs +1 -1
  190. package/dist/math/index.d.ts +0 -1
  191. package/dist/math/index.d.ts.map +1 -1
  192. package/dist/math/index.js +7 -8
  193. package/dist/math/lcm.cjs +1 -1
  194. package/dist/math/lcm.cjs.map +1 -1
  195. package/dist/math/lcm.d.ts.map +1 -1
  196. package/dist/math/lcm.js +5 -1
  197. package/dist/math/lcm.js.map +1 -1
  198. package/dist/math/linspace.cjs +1 -1
  199. package/dist/math/linspace.cjs.map +1 -1
  200. package/dist/math/linspace.d.ts.map +1 -1
  201. package/dist/math/linspace.js +2 -1
  202. package/dist/math/linspace.js.map +1 -1
  203. package/dist/math/median.cjs.map +1 -1
  204. package/dist/math/median.d.ts +1 -1
  205. package/dist/math/median.d.ts.map +1 -1
  206. package/dist/math/median.js.map +1 -1
  207. package/dist/math/standardDeviation.cjs.map +1 -1
  208. package/dist/math/standardDeviation.d.ts +1 -1
  209. package/dist/math/standardDeviation.d.ts.map +1 -1
  210. package/dist/math/standardDeviation.js.map +1 -1
  211. package/dist/math/sum.cjs +1 -1
  212. package/dist/math/sum.cjs.map +1 -1
  213. package/dist/math/sum.d.ts +1 -1
  214. package/dist/math/sum.d.ts.map +1 -1
  215. package/dist/math/sum.js +1 -1
  216. package/dist/math/sum.js.map +1 -1
  217. package/dist/math/variance.cjs.map +1 -1
  218. package/dist/math/variance.d.ts +1 -1
  219. package/dist/math/variance.d.ts.map +1 -1
  220. package/dist/math/variance.js.map +1 -1
  221. package/dist/object/defaults.cjs.map +1 -1
  222. package/dist/object/defaults.d.ts.map +1 -1
  223. package/dist/object/defaults.js.map +1 -1
  224. package/dist/object/diff.cjs.map +1 -1
  225. package/dist/object/diff.d.ts +1 -1
  226. package/dist/object/diff.d.ts.map +1 -1
  227. package/dist/object/diff.js.map +1 -1
  228. package/dist/object/filterValues.cjs.map +1 -1
  229. package/dist/object/filterValues.d.ts.map +1 -1
  230. package/dist/object/filterValues.js.map +1 -1
  231. package/dist/object/getPath.cjs.map +1 -1
  232. package/dist/object/getPath.d.ts.map +1 -1
  233. package/dist/object/getPath.js.map +1 -1
  234. package/dist/object/mapKeys.cjs.map +1 -1
  235. package/dist/object/mapKeys.d.ts.map +1 -1
  236. package/dist/object/mapKeys.js.map +1 -1
  237. package/dist/object/mapValues.cjs.map +1 -1
  238. package/dist/object/mapValues.d.ts.map +1 -1
  239. package/dist/object/mapValues.js.map +1 -1
  240. package/dist/object/merge.cjs.map +1 -1
  241. package/dist/object/merge.d.ts.map +1 -1
  242. package/dist/object/merge.js.map +1 -1
  243. package/dist/object/omit.cjs.map +1 -1
  244. package/dist/object/omit.d.ts.map +1 -1
  245. package/dist/object/omit.js.map +1 -1
  246. package/dist/object/pick.cjs.map +1 -1
  247. package/dist/object/pick.d.ts.map +1 -1
  248. package/dist/object/pick.js.map +1 -1
  249. package/dist/object/prune.cjs +1 -1
  250. package/dist/object/prune.cjs.map +1 -1
  251. package/dist/object/prune.d.ts.map +1 -1
  252. package/dist/object/prune.js +16 -17
  253. package/dist/object/prune.js.map +1 -1
  254. package/dist/random/_index.cjs +1 -1
  255. package/dist/random/_index.cjs.map +1 -1
  256. package/dist/random/_index.d.ts +1 -1
  257. package/dist/random/_index.d.ts.map +1 -1
  258. package/dist/random/_index.js +4 -5
  259. package/dist/random/_index.js.map +1 -1
  260. package/dist/random/draw.cjs.map +1 -1
  261. package/dist/random/draw.d.ts.map +1 -1
  262. package/dist/random/draw.js.map +1 -1
  263. package/dist/random/index.cjs +1 -1
  264. package/dist/random/index.d.ts +0 -1
  265. package/dist/random/index.d.ts.map +1 -1
  266. package/dist/random/index.js +2 -2
  267. package/dist/random/random.cjs.map +1 -1
  268. package/dist/random/random.d.ts.map +1 -1
  269. package/dist/random/random.js.map +1 -1
  270. package/dist/random/shuffle.cjs.map +1 -1
  271. package/dist/random/shuffle.d.ts.map +1 -1
  272. package/dist/random/shuffle.js.map +1 -1
  273. package/dist/random/source.cjs +2 -0
  274. package/dist/random/source.cjs.map +1 -0
  275. package/dist/random/source.d.ts +2 -0
  276. package/dist/random/source.d.ts.map +1 -1
  277. package/dist/random/source.js +10 -0
  278. package/dist/random/source.js.map +1 -0
  279. package/dist/string/index.cjs +1 -1
  280. package/dist/string/index.d.ts +1 -1
  281. package/dist/string/index.d.ts.map +1 -1
  282. package/dist/string/index.js +2 -2
  283. package/dist/string/{pad.cjs → padCenter.cjs} +2 -2
  284. package/dist/string/padCenter.cjs.map +1 -0
  285. package/dist/string/padCenter.d.ts +3 -0
  286. package/dist/string/padCenter.d.ts.map +1 -0
  287. package/dist/string/{pad.js → padCenter.js} +3 -3
  288. package/dist/string/padCenter.js.map +1 -0
  289. package/package.json +32 -27
  290. package/dist/_common/_abortable.d.ts +0 -5
  291. package/dist/_common/_abortable.d.ts.map +0 -1
  292. package/dist/array/flatten.cjs +0 -2
  293. package/dist/array/flatten.cjs.map +0 -1
  294. package/dist/array/flatten.d.ts +0 -5
  295. package/dist/array/flatten.d.ts.map +0 -1
  296. package/dist/array/flatten.js +0 -11
  297. package/dist/array/flatten.js.map +0 -1
  298. package/dist/math/percent.cjs +0 -2
  299. package/dist/math/percent.cjs.map +0 -1
  300. package/dist/math/percent.d.ts +0 -19
  301. package/dist/math/percent.d.ts.map +0 -1
  302. package/dist/math/percent.js +0 -8
  303. package/dist/math/percent.js.map +0 -1
  304. package/dist/random/uuid.cjs +0 -2
  305. package/dist/random/uuid.cjs.map +0 -1
  306. package/dist/random/uuid.d.ts +0 -12
  307. package/dist/random/uuid.d.ts.map +0 -1
  308. package/dist/random/uuid.js +0 -8
  309. package/dist/random/uuid.js.map +0 -1
  310. package/dist/string/pad.cjs.map +0 -1
  311. package/dist/string/pad.d.ts +0 -5
  312. package/dist/string/pad.d.ts.map +0 -1
  313. package/dist/string/pad.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"taskPool.js","names":[],"sources":["../../src/async/taskPool.ts"],"sourcesContent":["export interface TaskPool {\n dispose(reason?: unknown): void;\n idle(): Promise<void>;\n run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;\n readonly active: number;\n readonly disposed: boolean;\n readonly disposalSignal: AbortSignal;\n readonly pending: number;\n [Symbol.dispose](): void;\n}\n\ntype PendingTask = {\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n run: (signal: AbortSignal) => Promise<unknown>;\n};\n\nexport function taskPool({ concurrency = 1 }: { concurrency?: number } = {}): TaskPool {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError('taskPool: concurrency must be a positive integer');\n }\n\n const controller = new AbortController();\n const pending: PendingTask[] = [];\n let active = 0;\n let disposed = false;\n let idleDeferred: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n\n const resolveIdle = (): void => {\n if (active === 0 && pending.length === 0) {\n idleDeferred?.resolve();\n idleDeferred = undefined;\n }\n };\n\n const start = (): void => {\n while (active < concurrency && pending.length > 0) {\n const next = pending.shift()!;\n\n active++;\n void Promise.resolve()\n .then(() => next.run(controller.signal))\n .then(next.resolve, next.reject)\n .finally(() => {\n active--;\n start();\n resolveIdle();\n });\n }\n };\n\n return {\n get active(): number {\n return active;\n },\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose: (reason: unknown = new DOMException('Task pool disposed', 'AbortError')): void => {\n if (disposed) return;\n\n disposed = true;\n controller.abort(reason);\n\n for (const task of pending.splice(0)) task.reject(reason);\n\n resolveIdle();\n },\n get disposed(): boolean {\n return disposed;\n },\n idle: (): Promise<void> => {\n if (active === 0 && pending.length === 0) return Promise.resolve();\n\n idleDeferred ??= Promise.withResolvers<void>();\n\n return idleDeferred.promise;\n },\n get pending(): number {\n return pending.length;\n },\n run: <T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> => {\n const deferred = Promise.withResolvers<T>();\n\n if (disposed) {\n deferred.reject(controller.signal.reason);\n\n return deferred.promise;\n }\n\n pending.push({\n reject: deferred.reject,\n resolve: deferred.resolve as (value: unknown) => void,\n run: task as (signal: AbortSignal) => Promise<unknown>,\n });\n start();\n\n return deferred.promise;\n },\n [Symbol.dispose](): void {\n this.dispose();\n },\n };\n}\n"],"mappings":";AAiBA,SAAgB,EAAS,EAAE,iBAAc,MAAgC,CAAC,GAAa;CACrF,IAAI,CAAC,OAAO,UAAU,CAAW,KAAK,IAAc,GAClD,MAAU,WAAW,kDAAkD;CAGzE,IAAM,IAAa,IAAI,gBAAgB,GACjC,IAAyB,CAAC,GAC5B,IAAS,GACT,IAAW,IACX,GAEE,UAA0B;EAC9B,AAAI,MAAW,KAAK,EAAQ,WAAW,MACrC,GAAc,QAAQ,GACtB,IAAe,KAAA;CAEnB,GAEM,UAAoB;EACxB,OAAO,IAAS,KAAe,EAAQ,SAAS,IAAG;GACjD,IAAM,IAAO,EAAQ,MAAM;GAG3B,AADA,KACA,QAAa,QAAQ,CAAC,CACnB,WAAW,EAAK,IAAI,EAAW,MAAM,CAAC,CAAC,CACvC,KAAK,EAAK,SAAS,EAAK,MAAM,CAAC,CAC/B,cAAc;IAGb,AAFA,KACA,EAAM,GACN,EAAY;GACd,CAAC;EACL;CACF;CAEA,OAAO;EACL,IAAI,SAAiB;GACnB,OAAO;EACT;EACA,IAAI,iBAA8B;GAChC,OAAO,EAAW;EACpB;EACA,UAAU,IAAkB,IAAI,aAAa,sBAAsB,YAAY,MAAY;GACrF,QAGJ;IADA,IAAW,IACX,EAAW,MAAM,CAAM;IAEvB,KAAK,IAAM,KAAQ,EAAQ,OAAO,CAAC,GAAG,EAAK,OAAO,CAAM;IAExD,EAAY;GAJW;EAKzB;EACA,IAAI,WAAoB;GACtB,OAAO;EACT;EACA,YACM,MAAW,KAAK,EAAQ,WAAW,IAAU,QAAQ,QAAQ,KAEjE,MAAiB,QAAQ,cAAoB,GAEtC,EAAa;EAEtB,IAAI,UAAkB;GACpB,OAAO,EAAQ;EACjB;EACA,MAAS,MAA0D;GACjE,IAAM,IAAW,QAAQ,cAAiB;GAe1C,OAbI,KACF,EAAS,OAAO,EAAW,OAAO,MAAM,GAEjC,EAAS,YAGlB,EAAQ,KAAK;IACX,QAAQ,EAAS;IACjB,SAAS,EAAS;IAClB,KAAK;GACP,CAAC,GACD,EAAM,GAEC,EAAS;EAClB;EACA,CAAC,OAAO,WAAiB;GACvB,KAAK,QAAQ;EACf;CACF;AACF"}
1
+ {"version":3,"file":"taskPool.js","names":[],"sources":["../../src/async/taskPool.ts"],"sourcesContent":["export interface TaskPool {\n readonly active: number;\n readonly disposalSignal: AbortSignal;\n dispose(reason?: unknown): void;\n readonly disposed: boolean;\n idle(): Promise<void>;\n readonly pending: number;\n run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;\n [Symbol.dispose](): void;\n}\n\ntype PendingTask = {\n reject: (reason?: unknown) => void;\n resolve: (value: unknown) => void;\n run: (signal: AbortSignal) => Promise<unknown>;\n};\n\nexport function taskPool({ concurrency = 1 }: { concurrency?: number } = {}): TaskPool {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError('taskPool: concurrency must be a positive integer');\n }\n\n const controller = new AbortController();\n const pending: PendingTask[] = [];\n let active = 0;\n let disposed = false;\n let idleDeferred: ReturnType<typeof Promise.withResolvers<void>> | undefined;\n\n const resolveIdle = (): void => {\n if (active === 0 && pending.length === 0) {\n idleDeferred?.resolve();\n idleDeferred = undefined;\n }\n };\n\n const start = (): void => {\n while (active < concurrency && pending.length > 0) {\n const next = pending.shift()!;\n\n active++;\n void Promise.resolve()\n .then(() => next.run(controller.signal))\n .then(next.resolve, next.reject)\n .finally(() => {\n active--;\n start();\n resolveIdle();\n });\n }\n };\n\n return {\n get active(): number {\n return active;\n },\n get disposalSignal(): AbortSignal {\n return controller.signal;\n },\n dispose: (reason: unknown = new DOMException('Task pool disposed', 'AbortError')): void => {\n if (disposed) return;\n\n disposed = true;\n controller.abort(reason);\n\n for (const task of pending.splice(0)) task.reject(reason);\n\n resolveIdle();\n },\n get disposed(): boolean {\n return disposed;\n },\n idle: (): Promise<void> => {\n if (active === 0 && pending.length === 0) return Promise.resolve();\n\n idleDeferred ??= Promise.withResolvers<void>();\n\n return idleDeferred.promise;\n },\n get pending(): number {\n return pending.length;\n },\n run: <T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> => {\n const deferred = Promise.withResolvers<T>();\n\n if (disposed) {\n deferred.reject(controller.signal.reason);\n\n return deferred.promise;\n }\n\n pending.push({\n reject: deferred.reject,\n resolve: deferred.resolve as (value: unknown) => void,\n run: task as (signal: AbortSignal) => Promise<unknown>,\n });\n start();\n\n return deferred.promise;\n },\n [Symbol.dispose](): void {\n this.dispose();\n },\n };\n}\n"],"mappings":";AAiBA,SAAgB,EAAS,EAAE,iBAAc,MAAgC,CAAC,GAAa;CACrF,IAAI,CAAC,OAAO,UAAU,CAAW,KAAK,IAAc,GAClD,MAAU,WAAW,kDAAkD;CAGzE,IAAM,IAAa,IAAI,gBAAgB,GACjC,IAAyB,CAAC,GAC5B,IAAS,GACT,IAAW,IACX,GAEE,UAA0B;EAC9B,AAAI,MAAW,KAAK,EAAQ,WAAW,MACrC,GAAc,QAAQ,GACtB,IAAe,KAAA;CAEnB,GAEM,UAAoB;EACxB,OAAO,IAAS,KAAe,EAAQ,SAAS,IAAG;GACjD,IAAM,IAAO,EAAQ,MAAM;GAG3B,AADA,KACA,QAAa,QAAQ,CAAC,CACnB,WAAW,EAAK,IAAI,EAAW,MAAM,CAAC,CAAC,CACvC,KAAK,EAAK,SAAS,EAAK,MAAM,CAAC,CAC/B,cAAc;IAGb,AAFA,KACA,EAAM,GACN,EAAY;GACd,CAAC;EACL;CACF;CAEA,OAAO;EACL,IAAI,SAAiB;GACnB,OAAO;EACT;EACA,IAAI,iBAA8B;GAChC,OAAO,EAAW;EACpB;EACA,UAAU,IAAkB,IAAI,aAAa,sBAAsB,YAAY,MAAY;GACrF,QAGJ;IADA,IAAW,IACX,EAAW,MAAM,CAAM;IAEvB,KAAK,IAAM,KAAQ,EAAQ,OAAO,CAAC,GAAG,EAAK,OAAO,CAAM;IAExD,EAAY;GAJW;EAKzB;EACA,IAAI,WAAoB;GACtB,OAAO;EACT;EACA,YACM,MAAW,KAAK,EAAQ,WAAW,IAAU,QAAQ,QAAQ,KAEjE,MAAiB,QAAQ,cAAoB,GAEtC,EAAa;EAEtB,IAAI,UAAkB;GACpB,OAAO,EAAQ;EACjB;EACA,MAAS,MAA0D;GACjE,IAAM,IAAW,QAAQ,cAAiB;GAe1C,OAbI,KACF,EAAS,OAAO,EAAW,OAAO,MAAM,GAEjC,EAAS,YAGlB,EAAQ,KAAK;IACX,QAAQ,EAAS;IACjB,SAAS,EAAS;IAClB,KAAK;GACP,CAAC,GACD,EAAM,GAEC,EAAS;EAClB;EACA,CAAC,OAAO,WAAiB;GACvB,KAAK,QAAQ;EACf;CACF;AACF"}
@@ -1,2 +1,2 @@
1
- function e({capacity:e=1/0,now:t=Date.now,ttlMs:n}={}){if(e!==1/0&&(!Number.isInteger(e)||e<1))throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);let r=new Map,i=new Map,a=new Map,o=0,s=e=>{let t=(a.get(e)??0)+1;return a.set(e,t),t},c=e=>{if(e!==void 0&&e!==1/0){if(!Number.isFinite(e)||e<0)throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);return t()+e}},l=e=>{let n=r.get(e);if(n){if(n.expiresAt!==void 0&&n.expiresAt<=t()){r.delete(e);return}return n.value}},u=()=>{for(let[e,n]of r)n.expiresAt!==void 0&&n.expiresAt<=t()&&r.delete(e);for(;r.size>e;){let e=r.keys().next().value;if(e===void 0)return;r.delete(e)}},d=(e,t,i={})=>{s(e),r.delete(e),r.set(e,{expiresAt:c(i.ttlMs??n),value:t}),u()};return{clear:()=>{o++,r.clear(),i.clear(),a.clear()},delete:e=>(i.delete(e),s(e),r.delete(e)),get:l,getOrLoad:(e,t)=>{let n=l(e);if(n!==void 0||r.has(e))return Promise.resolve(n);let c=i.get(e);if(c)return c;let u=o,f=s(e),p=t().then(t=>(i.get(e)===p&&i.delete(e),o===u&&a.get(e)===f&&d(e,t),t),t=>{throw i.get(e)===p&&i.delete(e),t});return i.set(e,p),p},set:d,get size(){return u(),r.size}}}exports.cache=e;
1
+ function e({capacity:e=1/0,now:t=Date.now,ttlMs:n}={}){if(e!==1/0&&(!Number.isInteger(e)||e<1))throw RangeError(`cache: capacity must be a positive integer or Infinity, got ${e}`);let r=new Map,i=new Map,a=new Map,o=0,s=e=>{let t=(a.get(e)??0)+1;return a.set(e,t),t},c=e=>{if(e!==void 0&&e!==1/0){if(!Number.isFinite(e)||e<0)throw RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${e}`);return t()+e}},l=e=>{let n=r.get(e);if(n){if(n.expiresAt!==void 0&&n.expiresAt<=t()){r.delete(e);return}return n.value}},u=()=>{for(let[e,n]of r)n.expiresAt!==void 0&&n.expiresAt<=t()&&r.delete(e);for(;r.size>e;){let e=r.keys().next().value;if(e===void 0)return;r.delete(e)}},d=(e,t,i={})=>{s(e),r.delete(e),r.set(e,{expiresAt:c(i.ttlMs??n),value:t}),u()};return{clear:()=>{o++,r.clear(),i.clear(),a.clear()},delete:e=>(i.delete(e),s(e),r.delete(e)),entries:()=>(u(),[...r].map(([e,t])=>[e,t.value])),get:l,getOrLoad:(e,t)=>{let n=l(e);if(n!==void 0||r.has(e))return Promise.resolve(n);let c=i.get(e);if(c)return c;let u=o,f=s(e),p=t().then(t=>(i.get(e)===p&&i.delete(e),o===u&&a.get(e)===f&&d(e,t),t),t=>{throw i.get(e)===p&&i.delete(e),t});return i.set(e,p),p},set:d,get size(){return r.size}}}exports.cache=e;
2
2
  //# sourceMappingURL=cache.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.cjs","names":[],"sources":["../../src/cache/cache.ts"],"sourcesContent":["export type CacheOptions = {\n capacity?: number;\n now?: () => number;\n ttlMs?: number;\n};\n\ntype Entry<T> = {\n expiresAt: number | undefined;\n value: T;\n};\n\nexport interface Cache<K, T> {\n clear(): void;\n delete(key: K): boolean;\n get(key: K): T | undefined;\n getOrLoad(key: K, load: () => Promise<T>): Promise<T>;\n set(key: K, value: T, options?: { ttlMs?: number }): void;\n readonly size: number;\n}\n\nexport function cache<K, T>({ capacity = Infinity, now = Date.now, ttlMs }: CacheOptions = {}): Cache<K, T> {\n if (capacity !== Infinity && (!Number.isInteger(capacity) || capacity < 1)) {\n throw new RangeError(`cache: capacity must be a positive integer or Infinity, got ${capacity}`);\n }\n\n const entries = new Map<K, Entry<T>>();\n const pending = new Map<K, Promise<T>>();\n const revisions = new Map<K, number>();\n let generation = 0;\n\n const advanceRevision = (key: K): number => {\n const revision = (revisions.get(key) ?? 0) + 1;\n\n revisions.set(key, revision);\n\n return revision;\n };\n\n const expiresAt = (duration: number | undefined): number | undefined => {\n if (duration === undefined || duration === Infinity) return undefined;\n\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${duration}`);\n }\n\n return now() + duration;\n };\n\n const read = (key: K): T | undefined => {\n const entry = entries.get(key);\n\n if (!entry) return undefined;\n\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) {\n entries.delete(key);\n\n return undefined;\n }\n\n return entry.value;\n };\n\n const trim = (): void => {\n for (const [key, entry] of entries) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) entries.delete(key);\n }\n\n while (entries.size > capacity) {\n const oldest = entries.keys().next().value;\n\n if (oldest === undefined) return;\n\n entries.delete(oldest);\n }\n };\n\n const set = (key: K, value: T, options: { ttlMs?: number } = {}): void => {\n advanceRevision(key);\n entries.delete(key);\n entries.set(key, { expiresAt: expiresAt(options.ttlMs ?? ttlMs), value });\n trim();\n };\n\n const getOrLoad = (key: K, load: () => Promise<T>): Promise<T> => {\n const cached = read(key);\n\n if (cached !== undefined || entries.has(key)) return Promise.resolve(cached as T);\n\n const existing = pending.get(key);\n\n if (existing) return existing;\n\n const capturedGeneration = generation;\n const capturedRevision = advanceRevision(key);\n const result = load().then(\n (value) => {\n if (pending.get(key) === result) pending.delete(key);\n\n if (generation === capturedGeneration && revisions.get(key) === capturedRevision) {\n set(key, value);\n }\n\n return value;\n },\n (error: unknown) => {\n if (pending.get(key) === result) pending.delete(key);\n\n throw error;\n },\n );\n\n pending.set(key, result);\n\n return result;\n };\n\n return {\n clear: () => {\n generation++;\n entries.clear();\n pending.clear();\n revisions.clear();\n },\n delete: (key) => {\n pending.delete(key);\n advanceRevision(key);\n\n return entries.delete(key);\n },\n get: read,\n getOrLoad,\n set,\n get size() {\n trim();\n\n return entries.size;\n },\n };\n}\n"],"mappings":"AAoBA,SAAgB,EAAY,CAAE,WAAW,IAAU,MAAM,KAAK,IAAK,SAAwB,CAAC,EAAgB,CAC1G,GAAI,IAAa,MAAa,CAAC,OAAO,UAAU,CAAQ,GAAK,EAAW,GACtE,MAAU,WAAW,+DAA+D,GAAU,EAGhG,IAAM,EAAU,IAAI,IACd,EAAU,IAAI,IACd,EAAY,IAAI,IAClB,EAAa,EAEX,EAAmB,GAAmB,CAC1C,IAAM,GAAY,EAAU,IAAI,CAAG,GAAK,GAAK,EAI7C,OAFA,EAAU,IAAI,EAAK,CAAQ,EAEpB,CACT,EAEM,EAAa,GAAqD,CAClE,OAAa,IAAA,IAAa,IAAa,IAE3C,IAAI,CAAC,OAAO,SAAS,CAAQ,GAAK,EAAW,EAC3C,MAAU,WAAW,sEAAsE,GAAU,EAGvG,OAAO,EAAI,EAAI,CAHwF,CAIzG,EAEM,EAAQ,GAA0B,CACtC,IAAM,EAAQ,EAAQ,IAAI,CAAG,EAExB,KAEL,IAAI,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,EAAG,CAC7D,EAAQ,OAAO,CAAG,EAElB,MACF,CAEA,OAAO,EAAM,KAFb,CAGF,EAEM,MAAmB,CACvB,IAAK,GAAM,CAAC,EAAK,KAAU,EACrB,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,GAAG,EAAQ,OAAO,CAAG,EAGnF,KAAO,EAAQ,KAAO,GAAU,CAC9B,IAAM,EAAS,EAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAErC,GAAI,IAAW,IAAA,GAAW,OAE1B,EAAQ,OAAO,CAAM,CACvB,CACF,EAEM,GAAO,EAAQ,EAAU,EAA8B,CAAC,IAAY,CACxE,EAAgB,CAAG,EACnB,EAAQ,OAAO,CAAG,EAClB,EAAQ,IAAI,EAAK,CAAE,UAAW,EAAU,EAAQ,OAAS,CAAK,EAAG,OAAM,CAAC,EACxE,EAAK,CACP,EAmCA,MAAO,CACL,UAAa,CACX,IACA,EAAQ,MAAM,EACd,EAAQ,MAAM,EACd,EAAU,MAAM,CAClB,EACA,OAAS,IACP,EAAQ,OAAO,CAAG,EAClB,EAAgB,CAAG,EAEZ,EAAQ,OAAO,CAAG,GAE3B,IAAK,EACL,WA/CiB,EAAQ,IAAuC,CAChE,IAAM,EAAS,EAAK,CAAG,EAEvB,GAAI,IAAW,IAAA,IAAa,EAAQ,IAAI,CAAG,EAAG,OAAO,QAAQ,QAAQ,CAAW,EAEhF,IAAM,EAAW,EAAQ,IAAI,CAAG,EAEhC,GAAI,EAAU,OAAO,EAErB,IAAM,EAAqB,EACrB,EAAmB,EAAgB,CAAG,EACtC,EAAS,EAAK,CAAC,CAAC,KACnB,IACK,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE/C,IAAe,GAAsB,EAAU,IAAI,CAAG,IAAM,GAC9D,EAAI,EAAK,CAAK,EAGT,GAER,GAAmB,CAGlB,MAFI,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE7C,CACR,CACF,EAIA,OAFA,EAAQ,IAAI,EAAK,CAAM,EAEhB,CACT,EAiBE,MACA,IAAI,MAAO,CAGT,OAFA,EAAK,EAEE,EAAQ,IACjB,CACF,CACF"}
1
+ {"version":3,"file":"cache.cjs","names":[],"sources":["../../src/cache/cache.ts"],"sourcesContent":["export type CacheOptions = {\n capacity?: number;\n now?: () => number;\n ttlMs?: number;\n};\n\ntype Entry<T> = {\n expiresAt: number | undefined;\n value: T;\n};\n\nexport interface Cache<K, T> {\n clear(): void;\n delete(key: K): boolean;\n entries(): ReadonlyArray<readonly [K, T]>;\n get(key: K): T | undefined;\n getOrLoad(key: K, load: () => Promise<T>): Promise<T>;\n set(key: K, value: T, options?: { ttlMs?: number }): void;\n readonly size: number;\n}\n\nexport function cache<K, T>({ capacity = Infinity, now = Date.now, ttlMs }: CacheOptions = {}): Cache<K, T> {\n if (capacity !== Infinity && (!Number.isInteger(capacity) || capacity < 1)) {\n throw new RangeError(`cache: capacity must be a positive integer or Infinity, got ${capacity}`);\n }\n\n const entries = new Map<K, Entry<T>>();\n const pending = new Map<K, Promise<T>>();\n const revisions = new Map<K, number>();\n let generation = 0;\n\n const advanceRevision = (key: K): number => {\n const revision = (revisions.get(key) ?? 0) + 1;\n\n revisions.set(key, revision);\n\n return revision;\n };\n\n const expiresAt = (duration: number | undefined): number | undefined => {\n if (duration === undefined || duration === Infinity) return undefined;\n\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${duration}`);\n }\n\n return now() + duration;\n };\n\n const read = (key: K): T | undefined => {\n const entry = entries.get(key);\n\n if (!entry) return undefined;\n\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) {\n entries.delete(key);\n\n return undefined;\n }\n\n return entry.value;\n };\n\n const trim = (): void => {\n for (const [key, entry] of entries) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) entries.delete(key);\n }\n\n while (entries.size > capacity) {\n const oldest = entries.keys().next().value;\n\n if (oldest === undefined) return;\n\n entries.delete(oldest);\n }\n };\n\n const set = (key: K, value: T, options: { ttlMs?: number } = {}): void => {\n advanceRevision(key);\n entries.delete(key);\n entries.set(key, { expiresAt: expiresAt(options.ttlMs ?? ttlMs), value });\n trim();\n };\n\n const getOrLoad = (key: K, load: () => Promise<T>): Promise<T> => {\n const cached = read(key);\n\n if (cached !== undefined || entries.has(key)) return Promise.resolve(cached as T);\n\n const existing = pending.get(key);\n\n if (existing) return existing;\n\n const capturedGeneration = generation;\n const capturedRevision = advanceRevision(key);\n const result = load().then(\n (value) => {\n if (pending.get(key) === result) pending.delete(key);\n\n if (generation === capturedGeneration && revisions.get(key) === capturedRevision) {\n set(key, value);\n }\n\n return value;\n },\n (error: unknown) => {\n if (pending.get(key) === result) pending.delete(key);\n\n throw error;\n },\n );\n\n pending.set(key, result);\n\n return result;\n };\n\n return {\n clear: () => {\n generation++;\n entries.clear();\n pending.clear();\n revisions.clear();\n },\n delete: (key) => {\n pending.delete(key);\n advanceRevision(key);\n\n return entries.delete(key);\n },\n entries: () => {\n trim();\n return [...entries].map(([key, entry]) => [key, entry.value] as const);\n },\n get: read,\n getOrLoad,\n set,\n get size() {\n return entries.size;\n },\n };\n}\n"],"mappings":"AAqBA,SAAgB,EAAY,CAAE,WAAW,IAAU,MAAM,KAAK,IAAK,SAAwB,CAAC,EAAgB,CAC1G,GAAI,IAAa,MAAa,CAAC,OAAO,UAAU,CAAQ,GAAK,EAAW,GACtE,MAAU,WAAW,+DAA+D,GAAU,EAGhG,IAAM,EAAU,IAAI,IACd,EAAU,IAAI,IACd,EAAY,IAAI,IAClB,EAAa,EAEX,EAAmB,GAAmB,CAC1C,IAAM,GAAY,EAAU,IAAI,CAAG,GAAK,GAAK,EAI7C,OAFA,EAAU,IAAI,EAAK,CAAQ,EAEpB,CACT,EAEM,EAAa,GAAqD,CAClE,OAAa,IAAA,IAAa,IAAa,IAE3C,IAAI,CAAC,OAAO,SAAS,CAAQ,GAAK,EAAW,EAC3C,MAAU,WAAW,sEAAsE,GAAU,EAGvG,OAAO,EAAI,EAAI,CAHwF,CAIzG,EAEM,EAAQ,GAA0B,CACtC,IAAM,EAAQ,EAAQ,IAAI,CAAG,EAExB,KAEL,IAAI,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,EAAG,CAC7D,EAAQ,OAAO,CAAG,EAElB,MACF,CAEA,OAAO,EAAM,KAFb,CAGF,EAEM,MAAmB,CACvB,IAAK,GAAM,CAAC,EAAK,KAAU,EACrB,EAAM,YAAc,IAAA,IAAa,EAAM,WAAa,EAAI,GAAG,EAAQ,OAAO,CAAG,EAGnF,KAAO,EAAQ,KAAO,GAAU,CAC9B,IAAM,EAAS,EAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAErC,GAAI,IAAW,IAAA,GAAW,OAE1B,EAAQ,OAAO,CAAM,CACvB,CACF,EAEM,GAAO,EAAQ,EAAU,EAA8B,CAAC,IAAY,CACxE,EAAgB,CAAG,EACnB,EAAQ,OAAO,CAAG,EAClB,EAAQ,IAAI,EAAK,CAAE,UAAW,EAAU,EAAQ,OAAS,CAAK,EAAG,OAAM,CAAC,EACxE,EAAK,CACP,EAmCA,MAAO,CACL,UAAa,CACX,IACA,EAAQ,MAAM,EACd,EAAQ,MAAM,EACd,EAAU,MAAM,CAClB,EACA,OAAS,IACP,EAAQ,OAAO,CAAG,EAClB,EAAgB,CAAG,EAEZ,EAAQ,OAAO,CAAG,GAE3B,aACE,EAAK,EACE,CAAC,GAAG,CAAO,CAAC,CAAC,KAAK,CAAC,EAAK,KAAW,CAAC,EAAK,EAAM,KAAK,CAAU,GAEvE,IAAK,EACL,WAnDiB,EAAQ,IAAuC,CAChE,IAAM,EAAS,EAAK,CAAG,EAEvB,GAAI,IAAW,IAAA,IAAa,EAAQ,IAAI,CAAG,EAAG,OAAO,QAAQ,QAAQ,CAAW,EAEhF,IAAM,EAAW,EAAQ,IAAI,CAAG,EAEhC,GAAI,EAAU,OAAO,EAErB,IAAM,EAAqB,EACrB,EAAmB,EAAgB,CAAG,EACtC,EAAS,EAAK,CAAC,CAAC,KACnB,IACK,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE/C,IAAe,GAAsB,EAAU,IAAI,CAAG,IAAM,GAC9D,EAAI,EAAK,CAAK,EAGT,GAER,GAAmB,CAGlB,MAFI,EAAQ,IAAI,CAAG,IAAM,GAAQ,EAAQ,OAAO,CAAG,EAE7C,CACR,CACF,EAIA,OAFA,EAAQ,IAAI,EAAK,CAAM,EAEhB,CACT,EAqBE,MACA,IAAI,MAAO,CACT,OAAO,EAAQ,IACjB,CACF,CACF"}
@@ -6,6 +6,7 @@ export type CacheOptions = {
6
6
  export interface Cache<K, T> {
7
7
  clear(): void;
8
8
  delete(key: K): boolean;
9
+ entries(): ReadonlyArray<readonly [K, T]>;
9
10
  get(key: K): T | undefined;
10
11
  getOrLoad(key: K, load: () => Promise<T>): Promise<T>;
11
12
  set(key: K, value: T, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAOF,MAAM,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IACxB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,QAAmB,EAAE,GAAc,EAAE,KAAK,EAAE,GAAE,YAAiB,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAsH1G"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAOF,MAAM,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IACxB,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,QAAmB,EAAE,GAAc,EAAE,KAAK,EAAE,GAAE,YAAiB,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAwH1G"}
@@ -36,6 +36,7 @@ function e({ capacity: e = Infinity, now: t = Date.now, ttlMs: n } = {}) {
36
36
  o++, r.clear(), i.clear(), a.clear();
37
37
  },
38
38
  delete: (e) => (i.delete(e), s(e), r.delete(e)),
39
+ entries: () => (u(), [...r].map(([e, t]) => [e, t.value])),
39
40
  get: l,
40
41
  getOrLoad: (e, t) => {
41
42
  let n = l(e);
@@ -49,7 +50,7 @@ function e({ capacity: e = Infinity, now: t = Date.now, ttlMs: n } = {}) {
49
50
  },
50
51
  set: d,
51
52
  get size() {
52
- return u(), r.size;
53
+ return r.size;
53
54
  }
54
55
  };
55
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","names":[],"sources":["../../src/cache/cache.ts"],"sourcesContent":["export type CacheOptions = {\n capacity?: number;\n now?: () => number;\n ttlMs?: number;\n};\n\ntype Entry<T> = {\n expiresAt: number | undefined;\n value: T;\n};\n\nexport interface Cache<K, T> {\n clear(): void;\n delete(key: K): boolean;\n get(key: K): T | undefined;\n getOrLoad(key: K, load: () => Promise<T>): Promise<T>;\n set(key: K, value: T, options?: { ttlMs?: number }): void;\n readonly size: number;\n}\n\nexport function cache<K, T>({ capacity = Infinity, now = Date.now, ttlMs }: CacheOptions = {}): Cache<K, T> {\n if (capacity !== Infinity && (!Number.isInteger(capacity) || capacity < 1)) {\n throw new RangeError(`cache: capacity must be a positive integer or Infinity, got ${capacity}`);\n }\n\n const entries = new Map<K, Entry<T>>();\n const pending = new Map<K, Promise<T>>();\n const revisions = new Map<K, number>();\n let generation = 0;\n\n const advanceRevision = (key: K): number => {\n const revision = (revisions.get(key) ?? 0) + 1;\n\n revisions.set(key, revision);\n\n return revision;\n };\n\n const expiresAt = (duration: number | undefined): number | undefined => {\n if (duration === undefined || duration === Infinity) return undefined;\n\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${duration}`);\n }\n\n return now() + duration;\n };\n\n const read = (key: K): T | undefined => {\n const entry = entries.get(key);\n\n if (!entry) return undefined;\n\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) {\n entries.delete(key);\n\n return undefined;\n }\n\n return entry.value;\n };\n\n const trim = (): void => {\n for (const [key, entry] of entries) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) entries.delete(key);\n }\n\n while (entries.size > capacity) {\n const oldest = entries.keys().next().value;\n\n if (oldest === undefined) return;\n\n entries.delete(oldest);\n }\n };\n\n const set = (key: K, value: T, options: { ttlMs?: number } = {}): void => {\n advanceRevision(key);\n entries.delete(key);\n entries.set(key, { expiresAt: expiresAt(options.ttlMs ?? ttlMs), value });\n trim();\n };\n\n const getOrLoad = (key: K, load: () => Promise<T>): Promise<T> => {\n const cached = read(key);\n\n if (cached !== undefined || entries.has(key)) return Promise.resolve(cached as T);\n\n const existing = pending.get(key);\n\n if (existing) return existing;\n\n const capturedGeneration = generation;\n const capturedRevision = advanceRevision(key);\n const result = load().then(\n (value) => {\n if (pending.get(key) === result) pending.delete(key);\n\n if (generation === capturedGeneration && revisions.get(key) === capturedRevision) {\n set(key, value);\n }\n\n return value;\n },\n (error: unknown) => {\n if (pending.get(key) === result) pending.delete(key);\n\n throw error;\n },\n );\n\n pending.set(key, result);\n\n return result;\n };\n\n return {\n clear: () => {\n generation++;\n entries.clear();\n pending.clear();\n revisions.clear();\n },\n delete: (key) => {\n pending.delete(key);\n advanceRevision(key);\n\n return entries.delete(key);\n },\n get: read,\n getOrLoad,\n set,\n get size() {\n trim();\n\n return entries.size;\n },\n };\n}\n"],"mappings":";AAoBA,SAAgB,EAAY,EAAE,cAAW,UAAU,SAAM,KAAK,KAAK,aAAwB,CAAC,GAAgB;CAC1G,IAAI,MAAa,aAAa,CAAC,OAAO,UAAU,CAAQ,KAAK,IAAW,IACtE,MAAU,WAAW,+DAA+D,GAAU;CAGhG,IAAM,oBAAU,IAAI,IAAiB,GAC/B,oBAAU,IAAI,IAAmB,GACjC,oBAAY,IAAI,IAAe,GACjC,IAAa,GAEX,KAAmB,MAAmB;EAC1C,IAAM,KAAY,EAAU,IAAI,CAAG,KAAK,KAAK;EAI7C,OAFA,EAAU,IAAI,GAAK,CAAQ,GAEpB;CACT,GAEM,KAAa,MAAqD;EAClE,UAAa,KAAA,KAAa,MAAa,UAE3C;OAAI,CAAC,OAAO,SAAS,CAAQ,KAAK,IAAW,GAC3C,MAAU,WAAW,sEAAsE,GAAU;GAGvG,OAAO,EAAI,IAAI;EAHwF;CAIzG,GAEM,KAAQ,MAA0B;EACtC,IAAM,IAAQ,EAAQ,IAAI,CAAG;EAExB,OAEL;OAAI,EAAM,cAAc,KAAA,KAAa,EAAM,aAAa,EAAI,GAAG;IAC7D,EAAQ,OAAO,CAAG;IAElB;GACF;GAEA,OAAO,EAAM;EAFb;CAGF,GAEM,UAAmB;EACvB,KAAK,IAAM,CAAC,GAAK,MAAU,GACzB,AAAI,EAAM,cAAc,KAAA,KAAa,EAAM,aAAa,EAAI,KAAG,EAAQ,OAAO,CAAG;EAGnF,OAAO,EAAQ,OAAO,IAAU;GAC9B,IAAM,IAAS,EAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;GAErC,IAAI,MAAW,KAAA,GAAW;GAE1B,EAAQ,OAAO,CAAM;EACvB;CACF,GAEM,KAAO,GAAQ,GAAU,IAA8B,CAAC,MAAY;EAIxE,AAHA,EAAgB,CAAG,GACnB,EAAQ,OAAO,CAAG,GAClB,EAAQ,IAAI,GAAK;GAAE,WAAW,EAAU,EAAQ,SAAS,CAAK;GAAG;EAAM,CAAC,GACxE,EAAK;CACP;CAmCA,OAAO;EACL,aAAa;GAIX,AAHA,KACA,EAAQ,MAAM,GACd,EAAQ,MAAM,GACd,EAAU,MAAM;EAClB;EACA,SAAS,OACP,EAAQ,OAAO,CAAG,GAClB,EAAgB,CAAG,GAEZ,EAAQ,OAAO,CAAG;EAE3B,KAAK;EACL,YA/CiB,GAAQ,MAAuC;GAChE,IAAM,IAAS,EAAK,CAAG;GAEvB,IAAI,MAAW,KAAA,KAAa,EAAQ,IAAI,CAAG,GAAG,OAAO,QAAQ,QAAQ,CAAW;GAEhF,IAAM,IAAW,EAAQ,IAAI,CAAG;GAEhC,IAAI,GAAU,OAAO;GAErB,IAAM,IAAqB,GACrB,IAAmB,EAAgB,CAAG,GACtC,IAAS,EAAK,CAAC,CAAC,MACnB,OACK,EAAQ,IAAI,CAAG,MAAM,KAAQ,EAAQ,OAAO,CAAG,GAE/C,MAAe,KAAsB,EAAU,IAAI,CAAG,MAAM,KAC9D,EAAI,GAAK,CAAK,GAGT,KAER,MAAmB;IAGlB,MAFI,EAAQ,IAAI,CAAG,MAAM,KAAQ,EAAQ,OAAO,CAAG,GAE7C;GACR,CACF;GAIA,OAFA,EAAQ,IAAI,GAAK,CAAM,GAEhB;EACT;EAiBE;EACA,IAAI,OAAO;GAGT,OAFA,EAAK,GAEE,EAAQ;EACjB;CACF;AACF"}
1
+ {"version":3,"file":"cache.js","names":[],"sources":["../../src/cache/cache.ts"],"sourcesContent":["export type CacheOptions = {\n capacity?: number;\n now?: () => number;\n ttlMs?: number;\n};\n\ntype Entry<T> = {\n expiresAt: number | undefined;\n value: T;\n};\n\nexport interface Cache<K, T> {\n clear(): void;\n delete(key: K): boolean;\n entries(): ReadonlyArray<readonly [K, T]>;\n get(key: K): T | undefined;\n getOrLoad(key: K, load: () => Promise<T>): Promise<T>;\n set(key: K, value: T, options?: { ttlMs?: number }): void;\n readonly size: number;\n}\n\nexport function cache<K, T>({ capacity = Infinity, now = Date.now, ttlMs }: CacheOptions = {}): Cache<K, T> {\n if (capacity !== Infinity && (!Number.isInteger(capacity) || capacity < 1)) {\n throw new RangeError(`cache: capacity must be a positive integer or Infinity, got ${capacity}`);\n }\n\n const entries = new Map<K, Entry<T>>();\n const pending = new Map<K, Promise<T>>();\n const revisions = new Map<K, number>();\n let generation = 0;\n\n const advanceRevision = (key: K): number => {\n const revision = (revisions.get(key) ?? 0) + 1;\n\n revisions.set(key, revision);\n\n return revision;\n };\n\n const expiresAt = (duration: number | undefined): number | undefined => {\n if (duration === undefined || duration === Infinity) return undefined;\n\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(`cache: ttlMs must be a non-negative finite number or Infinity, got ${duration}`);\n }\n\n return now() + duration;\n };\n\n const read = (key: K): T | undefined => {\n const entry = entries.get(key);\n\n if (!entry) return undefined;\n\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) {\n entries.delete(key);\n\n return undefined;\n }\n\n return entry.value;\n };\n\n const trim = (): void => {\n for (const [key, entry] of entries) {\n if (entry.expiresAt !== undefined && entry.expiresAt <= now()) entries.delete(key);\n }\n\n while (entries.size > capacity) {\n const oldest = entries.keys().next().value;\n\n if (oldest === undefined) return;\n\n entries.delete(oldest);\n }\n };\n\n const set = (key: K, value: T, options: { ttlMs?: number } = {}): void => {\n advanceRevision(key);\n entries.delete(key);\n entries.set(key, { expiresAt: expiresAt(options.ttlMs ?? ttlMs), value });\n trim();\n };\n\n const getOrLoad = (key: K, load: () => Promise<T>): Promise<T> => {\n const cached = read(key);\n\n if (cached !== undefined || entries.has(key)) return Promise.resolve(cached as T);\n\n const existing = pending.get(key);\n\n if (existing) return existing;\n\n const capturedGeneration = generation;\n const capturedRevision = advanceRevision(key);\n const result = load().then(\n (value) => {\n if (pending.get(key) === result) pending.delete(key);\n\n if (generation === capturedGeneration && revisions.get(key) === capturedRevision) {\n set(key, value);\n }\n\n return value;\n },\n (error: unknown) => {\n if (pending.get(key) === result) pending.delete(key);\n\n throw error;\n },\n );\n\n pending.set(key, result);\n\n return result;\n };\n\n return {\n clear: () => {\n generation++;\n entries.clear();\n pending.clear();\n revisions.clear();\n },\n delete: (key) => {\n pending.delete(key);\n advanceRevision(key);\n\n return entries.delete(key);\n },\n entries: () => {\n trim();\n return [...entries].map(([key, entry]) => [key, entry.value] as const);\n },\n get: read,\n getOrLoad,\n set,\n get size() {\n return entries.size;\n },\n };\n}\n"],"mappings":";AAqBA,SAAgB,EAAY,EAAE,cAAW,UAAU,SAAM,KAAK,KAAK,aAAwB,CAAC,GAAgB;CAC1G,IAAI,MAAa,aAAa,CAAC,OAAO,UAAU,CAAQ,KAAK,IAAW,IACtE,MAAU,WAAW,+DAA+D,GAAU;CAGhG,IAAM,oBAAU,IAAI,IAAiB,GAC/B,oBAAU,IAAI,IAAmB,GACjC,oBAAY,IAAI,IAAe,GACjC,IAAa,GAEX,KAAmB,MAAmB;EAC1C,IAAM,KAAY,EAAU,IAAI,CAAG,KAAK,KAAK;EAI7C,OAFA,EAAU,IAAI,GAAK,CAAQ,GAEpB;CACT,GAEM,KAAa,MAAqD;EAClE,UAAa,KAAA,KAAa,MAAa,UAE3C;OAAI,CAAC,OAAO,SAAS,CAAQ,KAAK,IAAW,GAC3C,MAAU,WAAW,sEAAsE,GAAU;GAGvG,OAAO,EAAI,IAAI;EAHwF;CAIzG,GAEM,KAAQ,MAA0B;EACtC,IAAM,IAAQ,EAAQ,IAAI,CAAG;EAExB,OAEL;OAAI,EAAM,cAAc,KAAA,KAAa,EAAM,aAAa,EAAI,GAAG;IAC7D,EAAQ,OAAO,CAAG;IAElB;GACF;GAEA,OAAO,EAAM;EAFb;CAGF,GAEM,UAAmB;EACvB,KAAK,IAAM,CAAC,GAAK,MAAU,GACzB,AAAI,EAAM,cAAc,KAAA,KAAa,EAAM,aAAa,EAAI,KAAG,EAAQ,OAAO,CAAG;EAGnF,OAAO,EAAQ,OAAO,IAAU;GAC9B,IAAM,IAAS,EAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;GAErC,IAAI,MAAW,KAAA,GAAW;GAE1B,EAAQ,OAAO,CAAM;EACvB;CACF,GAEM,KAAO,GAAQ,GAAU,IAA8B,CAAC,MAAY;EAIxE,AAHA,EAAgB,CAAG,GACnB,EAAQ,OAAO,CAAG,GAClB,EAAQ,IAAI,GAAK;GAAE,WAAW,EAAU,EAAQ,SAAS,CAAK;GAAG;EAAM,CAAC,GACxE,EAAK;CACP;CAmCA,OAAO;EACL,aAAa;GAIX,AAHA,KACA,EAAQ,MAAM,GACd,EAAQ,MAAM,GACd,EAAU,MAAM;EAClB;EACA,SAAS,OACP,EAAQ,OAAO,CAAG,GAClB,EAAgB,CAAG,GAEZ,EAAQ,OAAO,CAAG;EAE3B,gBACE,EAAK,GACE,CAAC,GAAG,CAAO,CAAC,CAAC,KAAK,CAAC,GAAK,OAAW,CAAC,GAAK,EAAM,KAAK,CAAU;EAEvE,KAAK;EACL,YAnDiB,GAAQ,MAAuC;GAChE,IAAM,IAAS,EAAK,CAAG;GAEvB,IAAI,MAAW,KAAA,KAAa,EAAQ,IAAI,CAAG,GAAG,OAAO,QAAQ,QAAQ,CAAW;GAEhF,IAAM,IAAW,EAAQ,IAAI,CAAG;GAEhC,IAAI,GAAU,OAAO;GAErB,IAAM,IAAqB,GACrB,IAAmB,EAAgB,CAAG,GACtC,IAAS,EAAK,CAAC,CAAC,MACnB,OACK,EAAQ,IAAI,CAAG,MAAM,KAAQ,EAAQ,OAAO,CAAG,GAE/C,MAAe,KAAsB,EAAU,IAAI,CAAG,MAAM,KAC9D,EAAI,GAAK,CAAK,GAGT,KAER,MAAmB;IAGlB,MAFI,EAAQ,IAAI,CAAG,MAAM,KAAQ,EAAQ,OAAO,CAAG,GAE7C;GACR,CACF;GAIA,OAFA,EAAQ,IAAI,GAAK,CAAM,GAEhB;EACT;EAqBE;EACA,IAAI,OAAO;GACT,OAAO,EAAQ;EACjB;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"memo.cjs","names":[],"sources":["../../src/cache/memo.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { LruMap } from '../_common/_lruMap';\nimport { ArsenalSerializationError } from '../errors';\n\nexport type MemoOptions<T extends Fn> = {\n key?: (...args: Parameters<T>) => PropertyKey;\n maxSize?: number;\n};\n\nexport type Memoized<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T>) & {\n clear(): void;\n invalidate(...args: Parameters<T>): void;\n readonly size: number;\n};\n\nconst UNDEFINED_SENTINEL = '\\x00undefined\\x00';\nconst NAN_SENTINEL = '\\x00NaN\\x00';\nconst POSITIVE_INFINITY_SENTINEL = '\\x00+Infinity\\x00';\nconst NEGATIVE_INFINITY_SENTINEL = '\\x00-Infinity\\x00';\nconst FUNCTION_SENTINEL = '\\x00function\\x00';\n\nlet functionIdCounter = 0;\nconst functionIds = new WeakMap<Fn, number>();\n\n/** Returns a stable per-identity id for a function so distinct functions never collide as cache keys. */\nfunction idForFunction(fn: Fn): number {\n let id = functionIds.get(fn);\n\n if (id === undefined) {\n id = functionIdCounter++;\n functionIds.set(fn, id);\n }\n\n return id;\n}\n\nconst defaultKey = (args: unknown[]): string => {\n try {\n return JSON.stringify(args, (_, value) => {\n if (value === undefined) return UNDEFINED_SENTINEL;\n\n if (typeof value === 'number' && Number.isNaN(value)) return NAN_SENTINEL;\n\n if (value === Number.POSITIVE_INFINITY) return POSITIVE_INFINITY_SENTINEL;\n\n if (value === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY_SENTINEL;\n\n if (typeof value === 'function') return `${FUNCTION_SENTINEL}${idForFunction(value as Fn)}`;\n\n return value;\n });\n } catch (error) {\n const reason = error instanceof Error && error.message ? ` Reason: ${error.message}` : '';\n\n throw new ArsenalSerializationError(\n `[arsenal/memo] Failed to serialize memo arguments. Provide options.key for non-serializable arguments.${reason}`,\n { cause: error },\n );\n }\n};\n\n/** Excludes async functions at the type level so callers cannot accidentally memoize a Promise. */\ntype SyncFn<T extends Fn> = ReturnType<T> extends Promise<unknown> ? never : T;\n\n/**\n * Memoizes a **sync** function with optional LRU eviction by cache size.\n * The returned function exposes `.clear()` and `.invalidate(...args)` methods.\n *\n * **Do not pass async functions.** `memo` caches the raw `Promise` object, not\n * the resolved value — subsequent calls return the same stale Promise. Use\n * `cache.getOrLoad` for async caching with TTL and load deduplication.\n *\n * @example\n * ```ts\n * const add = (x: number, y: number) => x + y;\n * const memoAdd = memo(add, { maxSize: 100 });\n *\n * memoAdd(1, 2); // 3 (computed)\n * memoAdd(1, 2); // 3 (from cache)\n * memoAdd.invalidate(1, 2); // remove specific entry\n * memoAdd.clear(); // wipe entire cache\n * ```\n *\n * @param fn - The sync function to memoize. Must not return a Promise.\n * @param [options.maxSize] - Maximum cache size. Oldest entries evicted when exceeded (LRU). Default: `Infinity`.\n * @param [options.key] - Custom cache key function. Defaults to `JSON.stringify(args)`.\n *\n * @throws {RangeError} If `maxSize` is not a positive integer or `Infinity`.\n */\nexport function memo<T extends Fn>(fn: SyncFn<T>, { key, maxSize = Infinity }: MemoOptions<T> = {}): Memoized<T> {\n if (maxSize !== Infinity && (!Number.isInteger(maxSize) || maxSize < 1)) {\n throw new RangeError(`memo: maxSize must be a positive integer or Infinity, got ${maxSize}`);\n }\n\n const cache = new LruMap<PropertyKey, ReturnType<T>>(maxSize);\n\n const resolveKey = (...args: Parameters<T>): PropertyKey => (key ? key(...args) : defaultKey(args));\n\n const memoized = (...args: Parameters<T>): ReturnType<T> => {\n const cacheKey = resolveKey(...args);\n\n if (cache.has(cacheKey)) {\n const cached = cache.get(cacheKey)!;\n\n cache.set(cacheKey, cached);\n\n return cached;\n }\n\n const value = fn(...args) as ReturnType<T>;\n\n cache.set(cacheKey, value);\n\n return value;\n };\n\n const result = Object.assign(memoized, {\n clear: () => cache.clear(),\n invalidate: (...args: Parameters<T>): void => {\n cache.delete(resolveKey(...args));\n },\n });\n\n Object.defineProperty(result, 'size', { get: () => cache.size });\n\n return result as Memoized<T>;\n}\n"],"mappings":"qEAgBA,IAAM,EAAqB,gBACrB,EAAe,UACf,EAA6B,gBAC7B,EAA6B,gBAC7B,EAAoB,eAEtB,EAAoB,EAClB,EAAc,IAAI,QAGxB,SAAS,EAAc,EAAgB,CACrC,IAAI,EAAK,EAAY,IAAI,CAAE,EAO3B,OALI,IAAO,IAAA,KACT,EAAK,IACL,EAAY,IAAI,EAAI,CAAE,GAGjB,CACT,CAEA,IAAM,EAAc,GAA4B,CAC9C,GAAI,CACF,OAAO,KAAK,UAAU,GAAO,EAAG,IAC1B,IAAU,IAAA,GAAkB,EAE5B,OAAO,GAAU,UAAY,OAAO,MAAM,CAAK,EAAU,EAEzD,IAAU,IAAiC,EAE3C,IAAU,KAAiC,EAE3C,OAAO,GAAU,WAAmB,GAAG,IAAoB,EAAc,CAAW,IAEjF,CACR,CACH,OAAS,EAAO,CACd,IAAM,EAAS,aAAiB,OAAS,EAAM,QAAU,YAAY,EAAM,UAAY,GAEvF,MAAM,IAAI,EAAA,0BACR,yGAAyG,IACzG,CAAE,MAAO,CAAM,CACjB,CACF,CACF,EA8BA,SAAgB,EAAmB,EAAe,CAAE,MAAK,UAAU,KAA6B,CAAC,EAAgB,CAC/G,GAAI,IAAY,MAAa,CAAC,OAAO,UAAU,CAAO,GAAK,EAAU,GACnE,MAAU,WAAW,6DAA6D,GAAS,EAG7F,IAAM,EAAQ,IAAI,EAAA,OAAmC,CAAO,EAEtD,GAAc,GAAG,IAAsC,EAAM,EAAI,GAAG,CAAI,EAAI,EAAW,CAAI,EAoB3F,EAAS,OAAO,QAlBJ,GAAG,IAAuC,CAC1D,IAAM,EAAW,EAAW,GAAG,CAAI,EAEnC,GAAI,EAAM,IAAI,CAAQ,EAAG,CACvB,IAAM,EAAS,EAAM,IAAI,CAAQ,EAIjC,OAFA,EAAM,IAAI,EAAU,CAAM,EAEnB,CACT,CAEA,IAAM,EAAQ,EAAG,GAAG,CAAI,EAIxB,OAFA,EAAM,IAAI,EAAU,CAAK,EAElB,CACT,EAEuC,CACrC,UAAa,EAAM,MAAM,EACzB,YAAa,GAAG,IAA8B,CAC5C,EAAM,OAAO,EAAW,GAAG,CAAI,CAAC,CAClC,CACF,CAAC,EAID,OAFA,OAAO,eAAe,EAAQ,OAAQ,CAAE,QAAW,EAAM,IAAK,CAAC,EAExD,CACT"}
1
+ {"version":3,"file":"memo.cjs","names":[],"sources":["../../src/cache/memo.ts"],"sourcesContent":["import { LruMap } from '../_common/_lruMap';\nimport { ArsenalSerializationError } from '../errors';\nimport type { Fn } from '../types';\n\nexport type MemoOptions<T extends Fn> = {\n key?: (...args: Parameters<T>) => PropertyKey;\n maxSize?: number;\n};\n\nexport type Memoized<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T>) & {\n clear(): void;\n invalidate(...args: Parameters<T>): void;\n readonly size: number;\n};\n\nconst UNDEFINED_SENTINEL = '\\x00undefined\\x00';\nconst NAN_SENTINEL = '\\x00NaN\\x00';\nconst POSITIVE_INFINITY_SENTINEL = '\\x00+Infinity\\x00';\nconst NEGATIVE_INFINITY_SENTINEL = '\\x00-Infinity\\x00';\nconst FUNCTION_SENTINEL = '\\x00function\\x00';\n\nlet functionIdCounter = 0;\nconst functionIds = new WeakMap<Fn, number>();\n\n/** Returns a stable per-identity id for a function so distinct functions never collide as cache keys. */\nfunction idForFunction(fn: Fn): number {\n let id = functionIds.get(fn);\n\n if (id === undefined) {\n id = functionIdCounter++;\n functionIds.set(fn, id);\n }\n\n return id;\n}\n\nconst defaultKey = (args: unknown[]): string => {\n try {\n return JSON.stringify(args, (_, value) => {\n if (value === undefined) return UNDEFINED_SENTINEL;\n\n if (typeof value === 'number' && Number.isNaN(value)) return NAN_SENTINEL;\n\n if (value === Number.POSITIVE_INFINITY) return POSITIVE_INFINITY_SENTINEL;\n\n if (value === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY_SENTINEL;\n\n if (typeof value === 'function') return `${FUNCTION_SENTINEL}${idForFunction(value as Fn)}`;\n\n return value;\n });\n } catch (error) {\n const reason = error instanceof Error && error.message ? ` Reason: ${error.message}` : '';\n\n throw new ArsenalSerializationError(\n `[arsenal/memo] Failed to serialize memo arguments. Provide options.key for non-serializable arguments.${reason}`,\n { cause: error },\n );\n }\n};\n\n/** Excludes async functions at the type level so callers cannot accidentally memoize a Promise. */\ntype SyncFn<T extends Fn> = ReturnType<T> extends Promise<unknown> ? never : T;\n\n/**\n * Memoizes a **sync** function with optional LRU eviction by cache size.\n * The returned function exposes `.clear()` and `.invalidate(...args)` methods.\n *\n * **Do not pass async functions.** `memo` caches the raw `Promise` object, not\n * the resolved value — subsequent calls return the same stale Promise. Use\n * `cache.getOrLoad` for async caching with TTL and load deduplication.\n *\n * @example\n * ```ts\n * const add = (x: number, y: number) => x + y;\n * const memoAdd = memo(add, { maxSize: 100 });\n *\n * memoAdd(1, 2); // 3 (computed)\n * memoAdd(1, 2); // 3 (from cache)\n * memoAdd.invalidate(1, 2); // remove specific entry\n * memoAdd.clear(); // wipe entire cache\n * ```\n *\n * @param fn - The sync function to memoize. Must not return a Promise.\n * @param [options.maxSize] - Maximum cache size. Oldest entries evicted when exceeded (LRU). Default: `Infinity`.\n * @param [options.key] - Custom cache key function. Defaults to `JSON.stringify(args)`.\n *\n * @throws {RangeError} If `maxSize` is not a positive integer or `Infinity`.\n */\nexport function memo<T extends Fn>(fn: SyncFn<T>, { key, maxSize = Infinity }: MemoOptions<T> = {}): Memoized<T> {\n if (maxSize !== Infinity && (!Number.isInteger(maxSize) || maxSize < 1)) {\n throw new RangeError(`memo: maxSize must be a positive integer or Infinity, got ${maxSize}`);\n }\n\n const cache = new LruMap<PropertyKey, ReturnType<T>>(maxSize);\n\n const resolveKey = (...args: Parameters<T>): PropertyKey => (key ? key(...args) : defaultKey(args));\n\n const memoized = (...args: Parameters<T>): ReturnType<T> => {\n const cacheKey = resolveKey(...args);\n\n if (cache.has(cacheKey)) {\n const cached = cache.get(cacheKey)!;\n\n cache.set(cacheKey, cached);\n\n return cached;\n }\n\n const value = fn(...args) as ReturnType<T>;\n\n cache.set(cacheKey, value);\n\n return value;\n };\n\n const result = Object.assign(memoized, {\n clear: () => cache.clear(),\n invalidate: (...args: Parameters<T>): void => {\n cache.delete(resolveKey(...args));\n },\n });\n\n Object.defineProperty(result, 'size', { get: () => cache.size });\n\n return result as Memoized<T>;\n}\n"],"mappings":"qEAeA,IAAM,EAAqB,gBACrB,EAAe,UACf,EAA6B,gBAC7B,EAA6B,gBAC7B,EAAoB,eAEtB,EAAoB,EAClB,EAAc,IAAI,QAGxB,SAAS,EAAc,EAAgB,CACrC,IAAI,EAAK,EAAY,IAAI,CAAE,EAO3B,OALI,IAAO,IAAA,KACT,EAAK,IACL,EAAY,IAAI,EAAI,CAAE,GAGjB,CACT,CAEA,IAAM,EAAc,GAA4B,CAC9C,GAAI,CACF,OAAO,KAAK,UAAU,GAAO,EAAG,IAC1B,IAAU,IAAA,GAAkB,EAE5B,OAAO,GAAU,UAAY,OAAO,MAAM,CAAK,EAAU,EAEzD,IAAU,IAAiC,EAE3C,IAAU,KAAiC,EAE3C,OAAO,GAAU,WAAmB,GAAG,IAAoB,EAAc,CAAW,IAEjF,CACR,CACH,OAAS,EAAO,CACd,IAAM,EAAS,aAAiB,OAAS,EAAM,QAAU,YAAY,EAAM,UAAY,GAEvF,MAAM,IAAI,EAAA,0BACR,yGAAyG,IACzG,CAAE,MAAO,CAAM,CACjB,CACF,CACF,EA8BA,SAAgB,EAAmB,EAAe,CAAE,MAAK,UAAU,KAA6B,CAAC,EAAgB,CAC/G,GAAI,IAAY,MAAa,CAAC,OAAO,UAAU,CAAO,GAAK,EAAU,GACnE,MAAU,WAAW,6DAA6D,GAAS,EAG7F,IAAM,EAAQ,IAAI,EAAA,OAAmC,CAAO,EAEtD,GAAc,GAAG,IAAsC,EAAM,EAAI,GAAG,CAAI,EAAI,EAAW,CAAI,EAoB3F,EAAS,OAAO,QAlBJ,GAAG,IAAuC,CAC1D,IAAM,EAAW,EAAW,GAAG,CAAI,EAEnC,GAAI,EAAM,IAAI,CAAQ,EAAG,CACvB,IAAM,EAAS,EAAM,IAAI,CAAQ,EAIjC,OAFA,EAAM,IAAI,EAAU,CAAM,EAEnB,CACT,CAEA,IAAM,EAAQ,EAAG,GAAG,CAAI,EAIxB,OAFA,EAAM,IAAI,EAAU,CAAK,EAElB,CACT,EAEuC,CACrC,UAAa,EAAM,MAAM,EACzB,YAAa,GAAG,IAA8B,CAC5C,EAAM,OAAO,EAAW,GAAG,CAAI,CAAC,CAClC,CACF,CAAC,EAID,OAFA,OAAO,eAAe,EAAQ,OAAQ,CAAE,QAAW,EAAM,IAAK,CAAC,EAExD,CACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/cache/memo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAKnC,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,EAAE,IAAI;IACtC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjF,KAAK,IAAI,IAAI,CAAC;IACd,UAAU,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAgDF,mGAAmG;AACnG,KAAK,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,OAAkB,EAAE,GAAE,WAAW,CAAC,CAAC,CAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAqC/G"}
1
+ {"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/cache/memo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,EAAE,IAAI;IACtC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjF,KAAK,IAAI,IAAI,CAAC;IACd,UAAU,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAgDF,mGAAmG;AACnG,KAAK,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,OAAkB,EAAE,GAAE,WAAW,CAAC,CAAC,CAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAqC/G"}
@@ -1 +1 @@
1
- {"version":3,"file":"memo.js","names":[],"sources":["../../src/cache/memo.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { LruMap } from '../_common/_lruMap';\nimport { ArsenalSerializationError } from '../errors';\n\nexport type MemoOptions<T extends Fn> = {\n key?: (...args: Parameters<T>) => PropertyKey;\n maxSize?: number;\n};\n\nexport type Memoized<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T>) & {\n clear(): void;\n invalidate(...args: Parameters<T>): void;\n readonly size: number;\n};\n\nconst UNDEFINED_SENTINEL = '\\x00undefined\\x00';\nconst NAN_SENTINEL = '\\x00NaN\\x00';\nconst POSITIVE_INFINITY_SENTINEL = '\\x00+Infinity\\x00';\nconst NEGATIVE_INFINITY_SENTINEL = '\\x00-Infinity\\x00';\nconst FUNCTION_SENTINEL = '\\x00function\\x00';\n\nlet functionIdCounter = 0;\nconst functionIds = new WeakMap<Fn, number>();\n\n/** Returns a stable per-identity id for a function so distinct functions never collide as cache keys. */\nfunction idForFunction(fn: Fn): number {\n let id = functionIds.get(fn);\n\n if (id === undefined) {\n id = functionIdCounter++;\n functionIds.set(fn, id);\n }\n\n return id;\n}\n\nconst defaultKey = (args: unknown[]): string => {\n try {\n return JSON.stringify(args, (_, value) => {\n if (value === undefined) return UNDEFINED_SENTINEL;\n\n if (typeof value === 'number' && Number.isNaN(value)) return NAN_SENTINEL;\n\n if (value === Number.POSITIVE_INFINITY) return POSITIVE_INFINITY_SENTINEL;\n\n if (value === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY_SENTINEL;\n\n if (typeof value === 'function') return `${FUNCTION_SENTINEL}${idForFunction(value as Fn)}`;\n\n return value;\n });\n } catch (error) {\n const reason = error instanceof Error && error.message ? ` Reason: ${error.message}` : '';\n\n throw new ArsenalSerializationError(\n `[arsenal/memo] Failed to serialize memo arguments. Provide options.key for non-serializable arguments.${reason}`,\n { cause: error },\n );\n }\n};\n\n/** Excludes async functions at the type level so callers cannot accidentally memoize a Promise. */\ntype SyncFn<T extends Fn> = ReturnType<T> extends Promise<unknown> ? never : T;\n\n/**\n * Memoizes a **sync** function with optional LRU eviction by cache size.\n * The returned function exposes `.clear()` and `.invalidate(...args)` methods.\n *\n * **Do not pass async functions.** `memo` caches the raw `Promise` object, not\n * the resolved value — subsequent calls return the same stale Promise. Use\n * `cache.getOrLoad` for async caching with TTL and load deduplication.\n *\n * @example\n * ```ts\n * const add = (x: number, y: number) => x + y;\n * const memoAdd = memo(add, { maxSize: 100 });\n *\n * memoAdd(1, 2); // 3 (computed)\n * memoAdd(1, 2); // 3 (from cache)\n * memoAdd.invalidate(1, 2); // remove specific entry\n * memoAdd.clear(); // wipe entire cache\n * ```\n *\n * @param fn - The sync function to memoize. Must not return a Promise.\n * @param [options.maxSize] - Maximum cache size. Oldest entries evicted when exceeded (LRU). Default: `Infinity`.\n * @param [options.key] - Custom cache key function. Defaults to `JSON.stringify(args)`.\n *\n * @throws {RangeError} If `maxSize` is not a positive integer or `Infinity`.\n */\nexport function memo<T extends Fn>(fn: SyncFn<T>, { key, maxSize = Infinity }: MemoOptions<T> = {}): Memoized<T> {\n if (maxSize !== Infinity && (!Number.isInteger(maxSize) || maxSize < 1)) {\n throw new RangeError(`memo: maxSize must be a positive integer or Infinity, got ${maxSize}`);\n }\n\n const cache = new LruMap<PropertyKey, ReturnType<T>>(maxSize);\n\n const resolveKey = (...args: Parameters<T>): PropertyKey => (key ? key(...args) : defaultKey(args));\n\n const memoized = (...args: Parameters<T>): ReturnType<T> => {\n const cacheKey = resolveKey(...args);\n\n if (cache.has(cacheKey)) {\n const cached = cache.get(cacheKey)!;\n\n cache.set(cacheKey, cached);\n\n return cached;\n }\n\n const value = fn(...args) as ReturnType<T>;\n\n cache.set(cacheKey, value);\n\n return value;\n };\n\n const result = Object.assign(memoized, {\n clear: () => cache.clear(),\n invalidate: (...args: Parameters<T>): void => {\n cache.delete(resolveKey(...args));\n },\n });\n\n Object.defineProperty(result, 'size', { get: () => cache.size });\n\n return result as Memoized<T>;\n}\n"],"mappings":";;;AAgBA,IAAM,IAAqB,iBACrB,IAAe,WACf,IAA6B,iBAC7B,IAA6B,iBAC7B,IAAoB,gBAEtB,IAAoB,GAClB,oBAAc,IAAI,QAAoB;AAG5C,SAAS,EAAc,GAAgB;CACrC,IAAI,IAAK,EAAY,IAAI,CAAE;CAO3B,OALI,MAAO,KAAA,MACT,IAAK,KACL,EAAY,IAAI,GAAI,CAAE,IAGjB;AACT;AAEA,IAAM,KAAc,MAA4B;CAC9C,IAAI;EACF,OAAO,KAAK,UAAU,IAAO,GAAG,MAC1B,MAAU,KAAA,IAAkB,IAE5B,OAAO,KAAU,YAAY,OAAO,MAAM,CAAK,IAAU,IAEzD,MAAU,WAAiC,IAE3C,MAAU,YAAiC,IAE3C,OAAO,KAAU,aAAmB,GAAG,IAAoB,EAAc,CAAW,MAEjF,CACR;CACH,SAAS,GAAO;EACd,IAAM,IAAS,aAAiB,SAAS,EAAM,UAAU,YAAY,EAAM,YAAY;EAEvF,MAAM,IAAI,EACR,yGAAyG,KACzG,EAAE,OAAO,EAAM,CACjB;CACF;AACF;AA8BA,SAAgB,EAAmB,GAAe,EAAE,QAAK,aAAU,aAA6B,CAAC,GAAgB;CAC/G,IAAI,MAAY,aAAa,CAAC,OAAO,UAAU,CAAO,KAAK,IAAU,IACnE,MAAU,WAAW,6DAA6D,GAAS;CAG7F,IAAM,IAAQ,IAAI,EAAmC,CAAO,GAEtD,KAAc,GAAG,MAAsC,IAAM,EAAI,GAAG,CAAI,IAAI,EAAW,CAAI,GAoB3F,IAAS,OAAO,QAlBJ,GAAG,MAAuC;EAC1D,IAAM,IAAW,EAAW,GAAG,CAAI;EAEnC,IAAI,EAAM,IAAI,CAAQ,GAAG;GACvB,IAAM,IAAS,EAAM,IAAI,CAAQ;GAIjC,OAFA,EAAM,IAAI,GAAU,CAAM,GAEnB;EACT;EAEA,IAAM,IAAQ,EAAG,GAAG,CAAI;EAIxB,OAFA,EAAM,IAAI,GAAU,CAAK,GAElB;CACT,GAEuC;EACrC,aAAa,EAAM,MAAM;EACzB,aAAa,GAAG,MAA8B;GAC5C,EAAM,OAAO,EAAW,GAAG,CAAI,CAAC;EAClC;CACF,CAAC;CAID,OAFA,OAAO,eAAe,GAAQ,QAAQ,EAAE,WAAW,EAAM,KAAK,CAAC,GAExD;AACT"}
1
+ {"version":3,"file":"memo.js","names":[],"sources":["../../src/cache/memo.ts"],"sourcesContent":["import { LruMap } from '../_common/_lruMap';\nimport { ArsenalSerializationError } from '../errors';\nimport type { Fn } from '../types';\n\nexport type MemoOptions<T extends Fn> = {\n key?: (...args: Parameters<T>) => PropertyKey;\n maxSize?: number;\n};\n\nexport type Memoized<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T>) & {\n clear(): void;\n invalidate(...args: Parameters<T>): void;\n readonly size: number;\n};\n\nconst UNDEFINED_SENTINEL = '\\x00undefined\\x00';\nconst NAN_SENTINEL = '\\x00NaN\\x00';\nconst POSITIVE_INFINITY_SENTINEL = '\\x00+Infinity\\x00';\nconst NEGATIVE_INFINITY_SENTINEL = '\\x00-Infinity\\x00';\nconst FUNCTION_SENTINEL = '\\x00function\\x00';\n\nlet functionIdCounter = 0;\nconst functionIds = new WeakMap<Fn, number>();\n\n/** Returns a stable per-identity id for a function so distinct functions never collide as cache keys. */\nfunction idForFunction(fn: Fn): number {\n let id = functionIds.get(fn);\n\n if (id === undefined) {\n id = functionIdCounter++;\n functionIds.set(fn, id);\n }\n\n return id;\n}\n\nconst defaultKey = (args: unknown[]): string => {\n try {\n return JSON.stringify(args, (_, value) => {\n if (value === undefined) return UNDEFINED_SENTINEL;\n\n if (typeof value === 'number' && Number.isNaN(value)) return NAN_SENTINEL;\n\n if (value === Number.POSITIVE_INFINITY) return POSITIVE_INFINITY_SENTINEL;\n\n if (value === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY_SENTINEL;\n\n if (typeof value === 'function') return `${FUNCTION_SENTINEL}${idForFunction(value as Fn)}`;\n\n return value;\n });\n } catch (error) {\n const reason = error instanceof Error && error.message ? ` Reason: ${error.message}` : '';\n\n throw new ArsenalSerializationError(\n `[arsenal/memo] Failed to serialize memo arguments. Provide options.key for non-serializable arguments.${reason}`,\n { cause: error },\n );\n }\n};\n\n/** Excludes async functions at the type level so callers cannot accidentally memoize a Promise. */\ntype SyncFn<T extends Fn> = ReturnType<T> extends Promise<unknown> ? never : T;\n\n/**\n * Memoizes a **sync** function with optional LRU eviction by cache size.\n * The returned function exposes `.clear()` and `.invalidate(...args)` methods.\n *\n * **Do not pass async functions.** `memo` caches the raw `Promise` object, not\n * the resolved value — subsequent calls return the same stale Promise. Use\n * `cache.getOrLoad` for async caching with TTL and load deduplication.\n *\n * @example\n * ```ts\n * const add = (x: number, y: number) => x + y;\n * const memoAdd = memo(add, { maxSize: 100 });\n *\n * memoAdd(1, 2); // 3 (computed)\n * memoAdd(1, 2); // 3 (from cache)\n * memoAdd.invalidate(1, 2); // remove specific entry\n * memoAdd.clear(); // wipe entire cache\n * ```\n *\n * @param fn - The sync function to memoize. Must not return a Promise.\n * @param [options.maxSize] - Maximum cache size. Oldest entries evicted when exceeded (LRU). Default: `Infinity`.\n * @param [options.key] - Custom cache key function. Defaults to `JSON.stringify(args)`.\n *\n * @throws {RangeError} If `maxSize` is not a positive integer or `Infinity`.\n */\nexport function memo<T extends Fn>(fn: SyncFn<T>, { key, maxSize = Infinity }: MemoOptions<T> = {}): Memoized<T> {\n if (maxSize !== Infinity && (!Number.isInteger(maxSize) || maxSize < 1)) {\n throw new RangeError(`memo: maxSize must be a positive integer or Infinity, got ${maxSize}`);\n }\n\n const cache = new LruMap<PropertyKey, ReturnType<T>>(maxSize);\n\n const resolveKey = (...args: Parameters<T>): PropertyKey => (key ? key(...args) : defaultKey(args));\n\n const memoized = (...args: Parameters<T>): ReturnType<T> => {\n const cacheKey = resolveKey(...args);\n\n if (cache.has(cacheKey)) {\n const cached = cache.get(cacheKey)!;\n\n cache.set(cacheKey, cached);\n\n return cached;\n }\n\n const value = fn(...args) as ReturnType<T>;\n\n cache.set(cacheKey, value);\n\n return value;\n };\n\n const result = Object.assign(memoized, {\n clear: () => cache.clear(),\n invalidate: (...args: Parameters<T>): void => {\n cache.delete(resolveKey(...args));\n },\n });\n\n Object.defineProperty(result, 'size', { get: () => cache.size });\n\n return result as Memoized<T>;\n}\n"],"mappings":";;;AAeA,IAAM,IAAqB,iBACrB,IAAe,WACf,IAA6B,iBAC7B,IAA6B,iBAC7B,IAAoB,gBAEtB,IAAoB,GAClB,oBAAc,IAAI,QAAoB;AAG5C,SAAS,EAAc,GAAgB;CACrC,IAAI,IAAK,EAAY,IAAI,CAAE;CAO3B,OALI,MAAO,KAAA,MACT,IAAK,KACL,EAAY,IAAI,GAAI,CAAE,IAGjB;AACT;AAEA,IAAM,KAAc,MAA4B;CAC9C,IAAI;EACF,OAAO,KAAK,UAAU,IAAO,GAAG,MAC1B,MAAU,KAAA,IAAkB,IAE5B,OAAO,KAAU,YAAY,OAAO,MAAM,CAAK,IAAU,IAEzD,MAAU,WAAiC,IAE3C,MAAU,YAAiC,IAE3C,OAAO,KAAU,aAAmB,GAAG,IAAoB,EAAc,CAAW,MAEjF,CACR;CACH,SAAS,GAAO;EACd,IAAM,IAAS,aAAiB,SAAS,EAAM,UAAU,YAAY,EAAM,YAAY;EAEvF,MAAM,IAAI,EACR,yGAAyG,KACzG,EAAE,OAAO,EAAM,CACjB;CACF;AACF;AA8BA,SAAgB,EAAmB,GAAe,EAAE,QAAK,aAAU,aAA6B,CAAC,GAAgB;CAC/G,IAAI,MAAY,aAAa,CAAC,OAAO,UAAU,CAAO,KAAK,IAAU,IACnE,MAAU,WAAW,6DAA6D,GAAS;CAG7F,IAAM,IAAQ,IAAI,EAAmC,CAAO,GAEtD,KAAc,GAAG,MAAsC,IAAM,EAAI,GAAG,CAAI,IAAI,EAAW,CAAI,GAoB3F,IAAS,OAAO,QAlBJ,GAAG,MAAuC;EAC1D,IAAM,IAAW,EAAW,GAAG,CAAI;EAEnC,IAAI,EAAM,IAAI,CAAQ,GAAG;GACvB,IAAM,IAAS,EAAM,IAAI,CAAQ;GAIjC,OAFA,EAAM,IAAI,GAAU,CAAM,GAEnB;EACT;EAEA,IAAM,IAAQ,EAAG,GAAG,CAAI;EAIxB,OAFA,EAAM,IAAI,GAAU,CAAK,GAElB;CACT,GAEuC;EACrC,aAAa,EAAM,MAAM;EACzB,aAAa,GAAG,MAA8B;GAC5C,EAAM,OAAO,EAAW,GAAG,CAAI,CAAC;EAClC;CACF,CAAC;CAID,OAFA,OAAO,eAAe,GAAQ,QAAQ,EAAE,WAAW,EAAM,KAAK,CAAC,GAExD;AACT"}
package/dist/errors.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},t=class extends e{};exports.ArsenalError=e,exports.ArsenalSerializationError=t;
1
+ var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};exports.ArsenalError=e,exports.ArsenalSerializationError=t;
2
2
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all arsenal errors. Use `instanceof ArsenalError` to catch any arsenal-originated error. */\nexport class ArsenalError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(err: unknown): err is ArsenalError {\n return err instanceof ArsenalError;\n }\n}\n\n/**\n * Thrown when converting a value to or from its serialized form fails — e.g. `memo`'s default\n * cache key (`JSON.stringify`) encountering a circular reference, or `hash` encountering an\n * unsupported class instance with `{ onClassInstance: 'throw' }`.\n */\nexport class ArsenalSerializationError extends ArsenalError {}\n"],"mappings":"AACA,IAAa,EAAb,MAAa,UAAqB,KAAM,CACtC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CAEA,OAAO,GAAG,EAAmC,CAC3C,OAAO,aAAe,CACxB,CACF,EAOa,EAAb,cAA+C,CAAa,CAAC"}
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all arsenal errors. Use `instanceof ArsenalError` to catch any arsenal-originated error. */\nexport class ArsenalError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when converting a value to or from its serialized form fails — e.g. `memo`'s default\n * cache key (`JSON.stringify`) encountering a circular reference, or `hash` encountering an\n * unsupported class instance with `{ onClassInstance: 'throw' }`.\n */\nexport class ArsenalSerializationError extends ArsenalError {}\n"],"mappings":"AACA,IAAa,EAAb,cAAkC,KAAM,CACtC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAOa,EAAb,cAA+C,CAAa,CAAC"}
package/dist/errors.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  /** Base class for all arsenal errors. Use `instanceof ArsenalError` to catch any arsenal-originated error. */
2
2
  export declare class ArsenalError extends Error {
3
3
  constructor(message: string, opts?: ErrorOptions);
4
- static is(err: unknown): err is ArsenalError;
5
4
  }
6
5
  /**
7
6
  * Thrown when converting a value to or from its serialized form fails — e.g. `memo`'s default
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;IAMhD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY;CAG7C;AAED;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;CAAG"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAED;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;CAAG"}
package/dist/errors.js CHANGED
@@ -1,11 +1,8 @@
1
1
  //#region src/errors.ts
2
- var e = class e extends Error {
2
+ var e = class extends Error {
3
3
  constructor(e, t) {
4
4
  super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
5
5
  }
6
- static is(t) {
7
- return t instanceof e;
8
- }
9
6
  }, t = class extends e {};
10
7
  //#endregion
11
8
  export { e as ArsenalError, t as ArsenalSerializationError };
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all arsenal errors. Use `instanceof ArsenalError` to catch any arsenal-originated error. */\nexport class ArsenalError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(err: unknown): err is ArsenalError {\n return err instanceof ArsenalError;\n }\n}\n\n/**\n * Thrown when converting a value to or from its serialized form fails — e.g. `memo`'s default\n * cache key (`JSON.stringify`) encountering a circular reference, or `hash` encountering an\n * unsupported class instance with `{ onClassInstance: 'throw' }`.\n */\nexport class ArsenalSerializationError extends ArsenalError {}\n"],"mappings":";AACA,IAAa,IAAb,MAAa,UAAqB,MAAM;CACtC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAM,GAAS,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;CAEA,OAAO,GAAG,GAAmC;EAC3C,OAAO,aAAe;CACxB;AACF,GAOa,IAAb,cAA+C,EAAa,CAAC"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all arsenal errors. Use `instanceof ArsenalError` to catch any arsenal-originated error. */\nexport class ArsenalError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when converting a value to or from its serialized form fails — e.g. `memo`'s default\n * cache key (`JSON.stringify`) encountering a circular reference, or `hash` encountering an\n * unsupported class instance with `{ onClassInstance: 'throw' }`.\n */\nexport class ArsenalSerializationError extends ArsenalError {}\n"],"mappings":";AACA,IAAa,IAAb,cAAkC,MAAM;CACtC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAM,GAAS,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAOa,IAAb,cAA+C,EAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"assert.cjs","names":[],"sources":["../../src/function/assert.ts"],"sourcesContent":["/**\n * Asserts that a condition is true. Throws with `message` if false.\n *\n * @example\n * ```ts\n * assert(Array.isArray(x));\n * assert(x > 0, 'x must be positive');\n * assert(n >= 1, 'must be at least 1', { type: RangeError });\n * ```\n *\n * @param condition - The boolean condition to assert.\n * @param [message] - Error message (default: `'Assertion failed'`).\n * @param [options.type] - Error class to throw (default: `Error`).\n * @throws {Error} If `condition` is false.\n */\nexport function assert(condition: boolean, message?: string, options?: { type?: ErrorConstructor }): asserts condition {\n if (!condition) throw new (options?.type ?? Error)(message ?? 'Assertion failed');\n}\n"],"mappings":"AAeA,SAAgB,EAAO,EAAoB,EAAkB,EAA0D,CACrH,GAAI,CAAC,EAAW,MAAM,KAAK,GAAS,OAAQ,OAAO,GAAW,kBAAkB,CAClF"}
1
+ {"version":3,"file":"assert.cjs","names":[],"sources":["../../src/function/assert.ts"],"sourcesContent":["/**\n * Asserts that a condition is true. Throws with `message` if false.\n *\n * @example\n * ```ts\n * assert(Array.isArray(x));\n * assert(x > 0, 'x must be positive');\n * assert(n >= 1, 'must be at least 1', { type: RangeError });\n * ```\n *\n * @param condition - The boolean condition to assert.\n * @param [message] - Error message (default: `'Assertion failed'`).\n * @param [options.type] - Error class to throw (default: `Error`).\n * @throws {Error} If `condition` is false.\n */\nexport function assert(condition: unknown, message?: string, options?: { type?: ErrorConstructor }): asserts condition {\n if (!condition) throw new (options?.type ?? Error)(message ?? 'Assertion failed');\n}\n"],"mappings":"AAeA,SAAgB,EAAO,EAAoB,EAAkB,EAA0D,CACrH,GAAI,CAAC,EAAW,MAAM,KAAK,GAAS,OAAQ,OAAO,GAAW,kBAAkB,CAClF"}
@@ -13,7 +13,7 @@
13
13
  * @param [options.type] - Error class to throw (default: `Error`).
14
14
  * @throws {Error} If `condition` is false.
15
15
  */
16
- export declare function assert(condition: boolean, message?: string, options?: {
16
+ export declare function assert(condition: unknown, message?: string, options?: {
17
17
  type?: ErrorConstructor;
18
18
  }): asserts condition;
19
19
  //# sourceMappingURL=assert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assert.js","names":[],"sources":["../../src/function/assert.ts"],"sourcesContent":["/**\n * Asserts that a condition is true. Throws with `message` if false.\n *\n * @example\n * ```ts\n * assert(Array.isArray(x));\n * assert(x > 0, 'x must be positive');\n * assert(n >= 1, 'must be at least 1', { type: RangeError });\n * ```\n *\n * @param condition - The boolean condition to assert.\n * @param [message] - Error message (default: `'Assertion failed'`).\n * @param [options.type] - Error class to throw (default: `Error`).\n * @throws {Error} If `condition` is false.\n */\nexport function assert(condition: boolean, message?: string, options?: { type?: ErrorConstructor }): asserts condition {\n if (!condition) throw new (options?.type ?? Error)(message ?? 'Assertion failed');\n}\n"],"mappings":";AAeA,SAAgB,EAAO,GAAoB,GAAkB,GAA0D;CACrH,IAAI,CAAC,GAAW,MAAM,MAAK,GAAS,SAAQ,OAAO,KAAW,kBAAkB;AAClF"}
1
+ {"version":3,"file":"assert.js","names":[],"sources":["../../src/function/assert.ts"],"sourcesContent":["/**\n * Asserts that a condition is true. Throws with `message` if false.\n *\n * @example\n * ```ts\n * assert(Array.isArray(x));\n * assert(x > 0, 'x must be positive');\n * assert(n >= 1, 'must be at least 1', { type: RangeError });\n * ```\n *\n * @param condition - The boolean condition to assert.\n * @param [message] - Error message (default: `'Assertion failed'`).\n * @param [options.type] - Error class to throw (default: `Error`).\n * @throws {Error} If `condition` is false.\n */\nexport function assert(condition: unknown, message?: string, options?: { type?: ErrorConstructor }): asserts condition {\n if (!condition) throw new (options?.type ?? Error)(message ?? 'Assertion failed');\n}\n"],"mappings":";AAeA,SAAgB,EAAO,GAAoB,GAAkB,GAA0D;CACrH,IAAI,CAAC,GAAW,MAAM,MAAK,GAAS,SAAQ,OAAO,KAAW,kBAAkB;AAClF"}
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.cjs","names":[],"sources":["../../src/function/debounce.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { warn } from '../_dev';\n\nexport type DebounceOptions = {\n /** Invoke on the leading edge of the delay window. Default: `false`. */\n leading?: boolean;\n /** Invoke on the trailing edge of the delay window. Default: `true`. */\n trailing?: boolean;\n};\n\nexport type Debounced<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T> | undefined) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean;\n};\n\n/**\n * Debounces a function. By default only the trailing edge fires (after input settles).\n * Pass `{ leading: true }` to fire immediately on the first call instead.\n * Pass `{ leading: true, trailing: true }` to fire on both edges.\n *\n * Use `flush()` to invoke immediately, `cancel()` to clear, and `pending()` to check\n * whether an invocation is scheduled.\n *\n * @example\n * ```ts\n * // Trailing (default) — fires after input settles\n * const save = debounce(persist, 500);\n *\n * // Leading — fires on the first keystroke, then silences during the window\n * const submit = debounce(sendRequest, 500, { leading: true, trailing: false });\n * ```\n */\nexport function debounce<T extends Fn>(\n fn: T,\n delay = 300,\n options: DebounceOptions = { leading: false, trailing: true },\n): Debounced<T> {\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n if (!leading && !trailing) {\n warn('debounce: both `leading` and `trailing` are false — the wrapped function will never be invoked.');\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n let leadingFired = false;\n\n const clearTimer = () => {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n timerId = undefined;\n }\n };\n\n const invokeTrailing = () => {\n clearTimer();\n leadingFired = false;\n\n if (!lastArgs) return undefined;\n\n const args = lastArgs;\n\n lastArgs = undefined;\n lastResult = fn(...args) as ReturnType<T>;\n\n return lastResult;\n };\n\n return Object.assign(\n (...args: Parameters<T>): ReturnType<T> | undefined => {\n lastArgs = args;\n\n if (leading && !leadingFired) {\n leadingFired = true;\n lastResult = fn(...args) as ReturnType<T>;\n // Clear args regardless of `trailing` — the leading call already consumed this\n // invocation. The trailing timer below only re-invokes `fn` if a *further* call\n // arrives during the cooldown window and repopulates `lastArgs`.\n lastArgs = undefined;\n\n if (!trailing) {\n // Leading-only: start cooldown — no trailing call needed\n timerId = setTimeout(() => {\n timerId = undefined;\n leadingFired = false;\n }, delay);\n\n return lastResult;\n }\n }\n\n // When leading-only, ignore calls within the cooldown window\n if (leading && !trailing && leadingFired) return lastResult;\n\n clearTimer();\n timerId = setTimeout(invokeTrailing, delay);\n\n return lastResult;\n },\n {\n cancel: () => {\n clearTimer();\n lastArgs = undefined;\n leadingFired = false;\n },\n flush: (): ReturnType<T> | undefined => invokeTrailing(),\n pending: () => timerId !== undefined,\n },\n );\n}\n"],"mappings":"uBAkCA,SAAgB,EACd,EACA,EAAQ,IACR,EAA2B,CAAE,QAAS,GAAO,SAAU,EAAK,EAC9C,CACd,IAAM,EAAU,EAAQ,SAAW,GAC7B,EAAW,EAAQ,UAAY,GAMjC,EACA,EACA,EACA,EAAe,GAEb,MAAmB,CACnB,IAAY,IAAA,KACd,aAAa,CAAO,EACpB,EAAU,IAAA,GAEd,EAEM,MAAuB,CAI3B,GAHA,EAAW,EACX,EAAe,GAEX,CAAC,EAAU,OAEf,IAAM,EAAO,EAKb,MAHA,GAAW,IAAA,GACX,EAAa,EAAG,GAAG,CAAI,EAEhB,CACT,EAEA,OAAO,OAAO,QACX,GAAG,KACF,EAAW,EAEP,GAAW,CAAC,IACd,EAAe,GACf,EAAa,EAAG,GAAG,CAAI,EAIvB,EAAW,IAAA,GAEP,CAAC,IAEH,EAAU,eAAiB,CACzB,EAAU,IAAA,GACV,EAAe,EACjB,EAAG,CAAK,EAED,GAKP,GAAW,CAAC,GAAY,EAAqB,GAEjD,EAAW,EACX,EAAU,WAAW,EAAgB,CAAK,EAEnC,IAET,CACE,WAAc,CACZ,EAAW,EACX,EAAW,IAAA,GACX,EAAe,EACjB,EACA,UAAwC,EAAe,EACvD,YAAe,IAAY,IAAA,EAC7B,CACF,CACF"}
1
+ {"version":3,"file":"debounce.cjs","names":[],"sources":["../../src/function/debounce.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { Fn } from '../types';\n\nexport type DebounceOptions = {\n /** Invoke on the leading edge of the delay window. Default: `false`. */\n leading?: boolean;\n /** Invoke on the trailing edge of the delay window. Default: `true`. */\n trailing?: boolean;\n};\n\nexport type Debounced<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T> | undefined) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean;\n};\n\n/**\n * Debounces a function. By default only the trailing edge fires (after input settles).\n * Pass `{ leading: true }` to fire immediately on the first call instead.\n * Pass `{ leading: true, trailing: true }` to fire on both edges.\n *\n * Use `flush()` to invoke immediately, `cancel()` to clear, and `pending()` to check\n * whether an invocation is scheduled.\n *\n * @example\n * ```ts\n * // Trailing (default) — fires after input settles\n * const save = debounce(persist, 500);\n *\n * // Leading — fires on the first keystroke, then silences during the window\n * const submit = debounce(sendRequest, 500, { leading: true, trailing: false });\n * ```\n */\nexport function debounce<T extends Fn>(\n fn: T,\n delay = 300,\n options: DebounceOptions = { leading: false, trailing: true },\n): Debounced<T> {\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n if (!leading && !trailing) {\n warn('debounce: both `leading` and `trailing` are false — the wrapped function will never be invoked.');\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n let leadingFired = false;\n\n const clearTimer = () => {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n timerId = undefined;\n }\n };\n\n const invokeTrailing = () => {\n clearTimer();\n leadingFired = false;\n\n if (!lastArgs) return undefined;\n\n const args = lastArgs;\n\n lastArgs = undefined;\n lastResult = fn(...args) as ReturnType<T>;\n\n return lastResult;\n };\n\n return Object.assign(\n (...args: Parameters<T>): ReturnType<T> | undefined => {\n lastArgs = args;\n\n if (leading && !leadingFired) {\n leadingFired = true;\n lastResult = fn(...args) as ReturnType<T>;\n // Clear args regardless of `trailing` — the leading call already consumed this\n // invocation. The trailing timer below only re-invokes `fn` if a *further* call\n // arrives during the cooldown window and repopulates `lastArgs`.\n lastArgs = undefined;\n\n if (!trailing) {\n // Leading-only: start cooldown — no trailing call needed\n timerId = setTimeout(() => {\n timerId = undefined;\n leadingFired = false;\n }, delay);\n\n return lastResult;\n }\n }\n\n // When leading-only, ignore calls within the cooldown window\n if (leading && !trailing && leadingFired) return lastResult;\n\n clearTimer();\n timerId = setTimeout(invokeTrailing, delay);\n\n return lastResult;\n },\n {\n cancel: () => {\n clearTimer();\n lastArgs = undefined;\n leadingFired = false;\n },\n flush: (): ReturnType<T> | undefined => invokeTrailing(),\n pending: () => timerId !== undefined,\n },\n );\n}\n"],"mappings":"uBAiCA,SAAgB,EACd,EACA,EAAQ,IACR,EAA2B,CAAE,QAAS,GAAO,SAAU,EAAK,EAC9C,CACd,IAAM,EAAU,EAAQ,SAAW,GAC7B,EAAW,EAAQ,UAAY,GAMjC,EACA,EACA,EACA,EAAe,GAEb,MAAmB,CACnB,IAAY,IAAA,KACd,aAAa,CAAO,EACpB,EAAU,IAAA,GAEd,EAEM,MAAuB,CAI3B,GAHA,EAAW,EACX,EAAe,GAEX,CAAC,EAAU,OAEf,IAAM,EAAO,EAKb,MAHA,GAAW,IAAA,GACX,EAAa,EAAG,GAAG,CAAI,EAEhB,CACT,EAEA,OAAO,OAAO,QACX,GAAG,KACF,EAAW,EAEP,GAAW,CAAC,IACd,EAAe,GACf,EAAa,EAAG,GAAG,CAAI,EAIvB,EAAW,IAAA,GAEP,CAAC,IAEH,EAAU,eAAiB,CACzB,EAAU,IAAA,GACV,EAAe,EACjB,EAAG,CAAK,EAED,GAKP,GAAW,CAAC,GAAY,EAAqB,GAEjD,EAAW,EACX,EAAU,WAAW,EAAgB,CAAK,EAEnC,IAET,CACE,WAAc,CACZ,EAAW,EACX,EAAW,IAAA,GACX,EAAe,EACjB,EACA,UAAwC,EAAe,EACvD,YAAe,IAAY,IAAA,EAC7B,CACF,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/function/debounce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAInC,MAAM,MAAM,eAAe,GAAG;IAC5B,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG;IAC9F,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACnC,OAAO,IAAI,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,EAAE,EACnC,EAAE,EAAE,CAAC,EACL,KAAK,SAAM,EACX,OAAO,GAAE,eAAoD,GAC5D,SAAS,CAAC,CAAC,CAAC,CA2Ed"}
1
+ {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/function/debounce.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,MAAM,eAAe,GAAG;IAC5B,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG;IAC9F,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACnC,OAAO,IAAI,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,EAAE,EACnC,EAAE,EAAE,CAAC,EACL,KAAK,SAAM,EACX,OAAO,GAAE,eAAoD,GAC5D,SAAS,CAAC,CAAC,CAAC,CA2Ed"}
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.js","names":[],"sources":["../../src/function/debounce.ts"],"sourcesContent":["import type { Fn } from '../types';\n\nimport { warn } from '../_dev';\n\nexport type DebounceOptions = {\n /** Invoke on the leading edge of the delay window. Default: `false`. */\n leading?: boolean;\n /** Invoke on the trailing edge of the delay window. Default: `true`. */\n trailing?: boolean;\n};\n\nexport type Debounced<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T> | undefined) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean;\n};\n\n/**\n * Debounces a function. By default only the trailing edge fires (after input settles).\n * Pass `{ leading: true }` to fire immediately on the first call instead.\n * Pass `{ leading: true, trailing: true }` to fire on both edges.\n *\n * Use `flush()` to invoke immediately, `cancel()` to clear, and `pending()` to check\n * whether an invocation is scheduled.\n *\n * @example\n * ```ts\n * // Trailing (default) — fires after input settles\n * const save = debounce(persist, 500);\n *\n * // Leading — fires on the first keystroke, then silences during the window\n * const submit = debounce(sendRequest, 500, { leading: true, trailing: false });\n * ```\n */\nexport function debounce<T extends Fn>(\n fn: T,\n delay = 300,\n options: DebounceOptions = { leading: false, trailing: true },\n): Debounced<T> {\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n if (!leading && !trailing) {\n warn('debounce: both `leading` and `trailing` are false — the wrapped function will never be invoked.');\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n let leadingFired = false;\n\n const clearTimer = () => {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n timerId = undefined;\n }\n };\n\n const invokeTrailing = () => {\n clearTimer();\n leadingFired = false;\n\n if (!lastArgs) return undefined;\n\n const args = lastArgs;\n\n lastArgs = undefined;\n lastResult = fn(...args) as ReturnType<T>;\n\n return lastResult;\n };\n\n return Object.assign(\n (...args: Parameters<T>): ReturnType<T> | undefined => {\n lastArgs = args;\n\n if (leading && !leadingFired) {\n leadingFired = true;\n lastResult = fn(...args) as ReturnType<T>;\n // Clear args regardless of `trailing` — the leading call already consumed this\n // invocation. The trailing timer below only re-invokes `fn` if a *further* call\n // arrives during the cooldown window and repopulates `lastArgs`.\n lastArgs = undefined;\n\n if (!trailing) {\n // Leading-only: start cooldown — no trailing call needed\n timerId = setTimeout(() => {\n timerId = undefined;\n leadingFired = false;\n }, delay);\n\n return lastResult;\n }\n }\n\n // When leading-only, ignore calls within the cooldown window\n if (leading && !trailing && leadingFired) return lastResult;\n\n clearTimer();\n timerId = setTimeout(invokeTrailing, delay);\n\n return lastResult;\n },\n {\n cancel: () => {\n clearTimer();\n lastArgs = undefined;\n leadingFired = false;\n },\n flush: (): ReturnType<T> | undefined => invokeTrailing(),\n pending: () => timerId !== undefined,\n },\n );\n}\n"],"mappings":";;AAkCA,SAAgB,EACd,GACA,IAAQ,KACR,IAA2B;CAAE,SAAS;CAAO,UAAU;AAAK,GAC9C;CACd,IAAM,IAAU,EAAQ,WAAW,IAC7B,IAAW,EAAQ,YAAY,IAMjC,GACA,GACA,GACA,IAAe,IAEb,UAAmB;EACvB,AAAI,MAAY,KAAA,MACd,aAAa,CAAO,GACpB,IAAU,KAAA;CAEd,GAEM,UAAuB;EAI3B,IAHA,EAAW,GACX,IAAe,IAEX,CAAC,GAAU;EAEf,IAAM,IAAO;EAKb,OAHA,IAAW,KAAA,GACX,IAAa,EAAG,GAAG,CAAI,GAEhB;CACT;CAEA,OAAO,OAAO,QACX,GAAG,OACF,IAAW,GAEP,KAAW,CAAC,MACd,IAAe,IACf,IAAa,EAAG,GAAG,CAAI,GAIvB,IAAW,KAAA,GAEP,CAAC,MAEH,IAAU,iBAAiB;EAEzB,AADA,IAAU,KAAA,GACV,IAAe;CACjB,GAAG,CAAK,GAED,KAKP,KAAW,CAAC,KAAY,IAAqB,KAEjD,EAAW,GACX,IAAU,WAAW,GAAgB,CAAK,GAEnC,KAET;EACE,cAAc;GAGZ,AAFA,EAAW,GACX,IAAW,KAAA,GACX,IAAe;EACjB;EACA,aAAwC,EAAe;EACvD,eAAe,MAAY,KAAA;CAC7B,CACF;AACF"}
1
+ {"version":3,"file":"debounce.js","names":[],"sources":["../../src/function/debounce.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { Fn } from '../types';\n\nexport type DebounceOptions = {\n /** Invoke on the leading edge of the delay window. Default: `false`. */\n leading?: boolean;\n /** Invoke on the trailing edge of the delay window. Default: `true`. */\n trailing?: boolean;\n};\n\nexport type Debounced<T extends Fn> = ((...args: Parameters<T>) => ReturnType<T> | undefined) & {\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n pending(): boolean;\n};\n\n/**\n * Debounces a function. By default only the trailing edge fires (after input settles).\n * Pass `{ leading: true }` to fire immediately on the first call instead.\n * Pass `{ leading: true, trailing: true }` to fire on both edges.\n *\n * Use `flush()` to invoke immediately, `cancel()` to clear, and `pending()` to check\n * whether an invocation is scheduled.\n *\n * @example\n * ```ts\n * // Trailing (default) — fires after input settles\n * const save = debounce(persist, 500);\n *\n * // Leading — fires on the first keystroke, then silences during the window\n * const submit = debounce(sendRequest, 500, { leading: true, trailing: false });\n * ```\n */\nexport function debounce<T extends Fn>(\n fn: T,\n delay = 300,\n options: DebounceOptions = { leading: false, trailing: true },\n): Debounced<T> {\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n if (!leading && !trailing) {\n warn('debounce: both `leading` and `trailing` are false — the wrapped function will never be invoked.');\n }\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastResult: ReturnType<T> | undefined;\n let leadingFired = false;\n\n const clearTimer = () => {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n timerId = undefined;\n }\n };\n\n const invokeTrailing = () => {\n clearTimer();\n leadingFired = false;\n\n if (!lastArgs) return undefined;\n\n const args = lastArgs;\n\n lastArgs = undefined;\n lastResult = fn(...args) as ReturnType<T>;\n\n return lastResult;\n };\n\n return Object.assign(\n (...args: Parameters<T>): ReturnType<T> | undefined => {\n lastArgs = args;\n\n if (leading && !leadingFired) {\n leadingFired = true;\n lastResult = fn(...args) as ReturnType<T>;\n // Clear args regardless of `trailing` — the leading call already consumed this\n // invocation. The trailing timer below only re-invokes `fn` if a *further* call\n // arrives during the cooldown window and repopulates `lastArgs`.\n lastArgs = undefined;\n\n if (!trailing) {\n // Leading-only: start cooldown — no trailing call needed\n timerId = setTimeout(() => {\n timerId = undefined;\n leadingFired = false;\n }, delay);\n\n return lastResult;\n }\n }\n\n // When leading-only, ignore calls within the cooldown window\n if (leading && !trailing && leadingFired) return lastResult;\n\n clearTimer();\n timerId = setTimeout(invokeTrailing, delay);\n\n return lastResult;\n },\n {\n cancel: () => {\n clearTimer();\n lastArgs = undefined;\n leadingFired = false;\n },\n flush: (): ReturnType<T> | undefined => invokeTrailing(),\n pending: () => timerId !== undefined,\n },\n );\n}\n"],"mappings":";;AAiCA,SAAgB,EACd,GACA,IAAQ,KACR,IAA2B;CAAE,SAAS;CAAO,UAAU;AAAK,GAC9C;CACd,IAAM,IAAU,EAAQ,WAAW,IAC7B,IAAW,EAAQ,YAAY,IAMjC,GACA,GACA,GACA,IAAe,IAEb,UAAmB;EACvB,AAAI,MAAY,KAAA,MACd,aAAa,CAAO,GACpB,IAAU,KAAA;CAEd,GAEM,UAAuB;EAI3B,IAHA,EAAW,GACX,IAAe,IAEX,CAAC,GAAU;EAEf,IAAM,IAAO;EAKb,OAHA,IAAW,KAAA,GACX,IAAa,EAAG,GAAG,CAAI,GAEhB;CACT;CAEA,OAAO,OAAO,QACX,GAAG,OACF,IAAW,GAEP,KAAW,CAAC,MACd,IAAe,IACf,IAAa,EAAG,GAAG,CAAI,GAIvB,IAAW,KAAA,GAEP,CAAC,MAEH,IAAU,iBAAiB;EAEzB,AADA,IAAU,KAAA,GACV,IAAe;CACjB,GAAG,CAAK,GAED,KAKP,KAAW,CAAC,KAAY,IAAqB,KAEjD,EAAW,GACX,IAAU,WAAW,GAAgB,CAAK,GAEnC,KAET;EACE,cAAc;GAGZ,AAFA,EAAW,GACX,IAAW,KAAA,GACX,IAAe;EACjB;EACA,aAAwC,EAAe;EACvD,eAAe,MAAY,KAAA;CAC7B,CACF;AACF"}
@@ -1,2 +1,2 @@
1
- function e(...e){if(e.length===0)return e=>e;let[t,...n]=e;return(...e)=>n.reduce((e,t)=>Reflect.apply(t,void 0,[e]),Reflect.apply(t,void 0,e))}exports.pipe=e;
1
+ function e(...e){if(e.length===0)return e=>e;let[t,...n]=e;return(...e)=>n.reduce((e,t)=>t(e),t(...e))}exports.pipe=e;
2
2
  //# sourceMappingURL=pipe.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipe.cjs","names":[],"sources":["../../src/function/pipe.ts"],"sourcesContent":["import type { Fn } from '../types';\n\ntype FirstParameters<T extends readonly Fn[]> = T extends [infer First extends Fn, ...unknown[]]\n ? Parameters<First>\n : never;\ntype LastReturnType<T extends readonly Fn[]> = T extends [...unknown[], infer Last extends Fn]\n ? ReturnType<Last>\n : never;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * The TypeScript overload captures the input type from the first function and the output type from the last.\n * Intermediate steps are typed as `unknown` at the call site — TypeScript cannot infer a safe chain across\n * heterogeneous function signatures without explicit overloads for every arity.\n *\n * `pipe()` with no arguments returns an identity function `<T>(x: T) => T`.\n *\n * @example\n * ```ts\n * const add = (x: number) => x + 2;\n * const multiply = (x: number) => x * 3;\n * const subtract = (x: number) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n *\n * // Zero-arg identity\n * pipe()(42); // 42\n * ```\n *\n * @param fns - List of functions to be piped.\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe(): <T>(x: T) => T;\nexport function pipe<T extends readonly [Fn, ...Fn[]]>(...fns: T): (...args: FirstParameters<T>) => LastReturnType<T>;\nexport function pipe(...fns: Fn[]): Fn {\n if (fns.length === 0) return <T>(x: T): T => x;\n\n const [firstFn, ...restFns] = fns;\n\n return (...args: never[]) =>\n restFns.reduce(\n (prev: unknown, fn) => Reflect.apply(fn, undefined, [prev]),\n Reflect.apply(firstFn!, undefined, args),\n );\n}\n"],"mappings":"AAoCA,SAAgB,EAAK,GAAG,EAAe,CACrC,GAAI,EAAI,SAAW,EAAG,MAAW,IAAY,EAE7C,GAAM,CAAC,EAAS,GAAG,GAAW,EAE9B,OAAQ,GAAG,IACT,EAAQ,QACL,EAAe,IAAO,QAAQ,MAAM,EAAI,IAAA,GAAW,CAAC,CAAI,CAAC,EAC1D,QAAQ,MAAM,EAAU,IAAA,GAAW,CAAI,CACzC,CACJ"}
1
+ {"version":3,"file":"pipe.cjs","names":[],"sources":["../../src/function/pipe.ts"],"sourcesContent":["import type { Fn } from '../types';\n\ntype FirstParameters<T extends readonly Fn[]> = T extends [infer First extends Fn, ...unknown[]]\n ? Parameters<First>\n : never;\ntype LastReturnType<T extends readonly Fn[]> = T extends [...unknown[], infer Last extends Fn]\n ? ReturnType<Last>\n : never;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * The TypeScript overload captures the input type from the first function and the output type from the last.\n * Intermediate steps are typed as `unknown` at the call site — TypeScript cannot infer a safe chain across\n * heterogeneous function signatures without explicit overloads for every arity.\n *\n * `pipe()` with no arguments returns an identity function `<T>(x: T) => T`.\n *\n * @example\n * ```ts\n * const add = (x: number) => x + 2;\n * const multiply = (x: number) => x * 3;\n * const subtract = (x: number) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n *\n * // Zero-arg identity\n * pipe()(42); // 42\n * ```\n *\n * @param fns - List of functions to be piped.\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe(): <T>(x: T) => T;\nexport function pipe<T extends readonly [Fn, ...Fn[]]>(...fns: T): (...args: FirstParameters<T>) => LastReturnType<T>;\nexport function pipe(...fns: Fn[]): Fn {\n if (fns.length === 0) return <T>(x: T): T => x;\n\n const [firstFn, ...restFns] = fns;\n\n return (...args: never[]) =>\n restFns.reduce<unknown>((prev, fn) => (fn as (x: unknown) => unknown)(prev), firstFn(...args));\n}\n"],"mappings":"AAoCA,SAAgB,EAAK,GAAG,EAAe,CACrC,GAAI,EAAI,SAAW,EAAG,MAAW,IAAY,EAE7C,GAAM,CAAC,EAAS,GAAG,GAAW,EAE9B,OAAQ,GAAG,IACT,EAAQ,QAAiB,EAAM,IAAQ,EAA+B,CAAI,EAAG,EAAQ,GAAG,CAAI,CAAC,CACjG"}
@@ -2,7 +2,7 @@
2
2
  function e(...e) {
3
3
  if (e.length === 0) return (e) => e;
4
4
  let [t, ...n] = e;
5
- return (...e) => n.reduce((e, t) => Reflect.apply(t, void 0, [e]), Reflect.apply(t, void 0, e));
5
+ return (...e) => n.reduce((e, t) => t(e), t(...e));
6
6
  }
7
7
  //#endregion
8
8
  export { e as pipe };
@@ -1 +1 @@
1
- {"version":3,"file":"pipe.js","names":[],"sources":["../../src/function/pipe.ts"],"sourcesContent":["import type { Fn } from '../types';\n\ntype FirstParameters<T extends readonly Fn[]> = T extends [infer First extends Fn, ...unknown[]]\n ? Parameters<First>\n : never;\ntype LastReturnType<T extends readonly Fn[]> = T extends [...unknown[], infer Last extends Fn]\n ? ReturnType<Last>\n : never;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * The TypeScript overload captures the input type from the first function and the output type from the last.\n * Intermediate steps are typed as `unknown` at the call site — TypeScript cannot infer a safe chain across\n * heterogeneous function signatures without explicit overloads for every arity.\n *\n * `pipe()` with no arguments returns an identity function `<T>(x: T) => T`.\n *\n * @example\n * ```ts\n * const add = (x: number) => x + 2;\n * const multiply = (x: number) => x * 3;\n * const subtract = (x: number) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n *\n * // Zero-arg identity\n * pipe()(42); // 42\n * ```\n *\n * @param fns - List of functions to be piped.\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe(): <T>(x: T) => T;\nexport function pipe<T extends readonly [Fn, ...Fn[]]>(...fns: T): (...args: FirstParameters<T>) => LastReturnType<T>;\nexport function pipe(...fns: Fn[]): Fn {\n if (fns.length === 0) return <T>(x: T): T => x;\n\n const [firstFn, ...restFns] = fns;\n\n return (...args: never[]) =>\n restFns.reduce(\n (prev: unknown, fn) => Reflect.apply(fn, undefined, [prev]),\n Reflect.apply(firstFn!, undefined, args),\n );\n}\n"],"mappings":";AAoCA,SAAgB,EAAK,GAAG,GAAe;CACrC,IAAI,EAAI,WAAW,GAAG,QAAW,MAAY;CAE7C,IAAM,CAAC,GAAS,GAAG,KAAW;CAE9B,QAAQ,GAAG,MACT,EAAQ,QACL,GAAe,MAAO,QAAQ,MAAM,GAAI,KAAA,GAAW,CAAC,CAAI,CAAC,GAC1D,QAAQ,MAAM,GAAU,KAAA,GAAW,CAAI,CACzC;AACJ"}
1
+ {"version":3,"file":"pipe.js","names":[],"sources":["../../src/function/pipe.ts"],"sourcesContent":["import type { Fn } from '../types';\n\ntype FirstParameters<T extends readonly Fn[]> = T extends [infer First extends Fn, ...unknown[]]\n ? Parameters<First>\n : never;\ntype LastReturnType<T extends readonly Fn[]> = T extends [...unknown[], infer Last extends Fn]\n ? ReturnType<Last>\n : never;\n\n/**\n * Pipes multiple functions into a single function. It starts from the leftmost function and proceeds to the right.\n *\n * The TypeScript overload captures the input type from the first function and the output type from the last.\n * Intermediate steps are typed as `unknown` at the call site — TypeScript cannot infer a safe chain across\n * heterogeneous function signatures without explicit overloads for every arity.\n *\n * `pipe()` with no arguments returns an identity function `<T>(x: T) => T`.\n *\n * @example\n * ```ts\n * const add = (x: number) => x + 2;\n * const multiply = (x: number) => x * 3;\n * const subtract = (x: number) => x - 4;\n * const pipedFn = pipe(subtract, multiply, add);\n *\n * pipedFn(5); // ((5-4) * 3) + 2 = 5\n *\n * // Zero-arg identity\n * pipe()(42); // 42\n * ```\n *\n * @param fns - List of functions to be piped.\n * @returns A new function that is the pipe of the input functions.\n */\nexport function pipe(): <T>(x: T) => T;\nexport function pipe<T extends readonly [Fn, ...Fn[]]>(...fns: T): (...args: FirstParameters<T>) => LastReturnType<T>;\nexport function pipe(...fns: Fn[]): Fn {\n if (fns.length === 0) return <T>(x: T): T => x;\n\n const [firstFn, ...restFns] = fns;\n\n return (...args: never[]) =>\n restFns.reduce<unknown>((prev, fn) => (fn as (x: unknown) => unknown)(prev), firstFn(...args));\n}\n"],"mappings":";AAoCA,SAAgB,EAAK,GAAG,GAAe;CACrC,IAAI,EAAI,WAAW,GAAG,QAAW,MAAY;CAE7C,IAAM,CAAC,GAAS,GAAG,KAAW;CAE9B,QAAQ,GAAG,MACT,EAAQ,QAAiB,GAAM,MAAQ,EAA+B,CAAI,GAAG,EAAQ,GAAG,CAAI,CAAC;AACjG"}
@@ -1,2 +1,2 @@
1
- function e(e,t){let n=[],r=e.length;if(t?.reverse)for(let t=r-1;t>=0;t--)try{e[t]()}catch(e){n.push(e)}else for(let t of e)try{t()}catch(e){n.push(e)}if(n.length>0)throw AggregateError(n,`One or more callbacks failed`)}exports.runAll=e;
1
+ function e(e,t){let n=[],r=e.length;if(t?.reverse)for(let t=r-1;t>=0;t--)try{e[t]?.()}catch(e){n.push(e)}else for(let t of e)try{t()}catch(e){n.push(e)}if(n.length>0)throw AggregateError(n,`One or more callbacks failed`)}exports.runAll=e;
2
2
  //# sourceMappingURL=runAll.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"runAll.cjs","names":[],"sources":["../../src/function/runAll.ts"],"sourcesContent":["/**\n * Runs all functions in `fns`, collecting any thrown errors.\n * - With `reverse: true`, iterates in LIFO order (useful for cleanup/teardown stacks).\n * - Throws an `AggregateError` containing all failures if any function throws.\n *\n * @example\n * ```ts\n * const cleanups = [() => a.dispose(), () => b.dispose()];\n * runAll(cleanups, { reverse: true });\n * ```\n */\nexport function runAll(fns: readonly (() => void)[], opts?: { reverse?: boolean }): void {\n const errors: unknown[] = [];\n const len = fns.length;\n\n if (opts?.reverse) {\n for (let i = len - 1; i >= 0; i--) {\n try {\n fns[i]!();\n } catch (err) {\n errors.push(err);\n }\n }\n } else {\n for (const fn of fns) {\n try {\n fn();\n } catch (err) {\n errors.push(err);\n }\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more callbacks failed');\n }\n}\n"],"mappings":"AAWA,SAAgB,EAAO,EAA8B,EAAoC,CACvF,IAAM,EAAoB,CAAC,EACrB,EAAM,EAAI,OAEhB,GAAI,GAAM,QACR,IAAK,IAAI,EAAI,EAAM,EAAG,GAAK,EAAG,IAC5B,GAAI,CACF,EAAI,EAAE,CAAE,CACV,OAAS,EAAK,CACZ,EAAO,KAAK,CAAG,CACjB,MAGF,IAAK,IAAM,KAAM,EACf,GAAI,CACF,EAAG,CACL,OAAS,EAAK,CACZ,EAAO,KAAK,CAAG,CACjB,CAIJ,GAAI,EAAO,OAAS,EAClB,MAAU,eAAe,EAAQ,8BAA8B,CAEnE"}
1
+ {"version":3,"file":"runAll.cjs","names":[],"sources":["../../src/function/runAll.ts"],"sourcesContent":["/**\n * Runs all functions in `fns`, collecting any thrown errors.\n * - With `reverse: true`, iterates in LIFO order (useful for cleanup/teardown stacks).\n * - Throws an `AggregateError` containing all failures if any function throws.\n *\n * @example\n * ```ts\n * const cleanups = [() => a.dispose(), () => b.dispose()];\n * runAll(cleanups, { reverse: true });\n * ```\n */\nexport function runAll(fns: readonly (() => void)[], opts?: { reverse?: boolean }): void {\n const errors: unknown[] = [];\n const len = fns.length;\n\n if (opts?.reverse) {\n for (let i = len - 1; i >= 0; i--) {\n try {\n fns[i]?.();\n } catch (err) {\n errors.push(err);\n }\n }\n } else {\n for (const fn of fns) {\n try {\n fn();\n } catch (err) {\n errors.push(err);\n }\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more callbacks failed');\n }\n}\n"],"mappings":"AAWA,SAAgB,EAAO,EAA8B,EAAoC,CACvF,IAAM,EAAoB,CAAC,EACrB,EAAM,EAAI,OAEhB,GAAI,GAAM,QACR,IAAK,IAAI,EAAI,EAAM,EAAG,GAAK,EAAG,IAC5B,GAAI,CACF,EAAI,EAAE,GAAG,CACX,OAAS,EAAK,CACZ,EAAO,KAAK,CAAG,CACjB,MAGF,IAAK,IAAM,KAAM,EACf,GAAI,CACF,EAAG,CACL,OAAS,EAAK,CACZ,EAAO,KAAK,CAAG,CACjB,CAIJ,GAAI,EAAO,OAAS,EAClB,MAAU,eAAe,EAAQ,8BAA8B,CAEnE"}
@@ -2,7 +2,7 @@
2
2
  function e(e, t) {
3
3
  let n = [], r = e.length;
4
4
  if (t?.reverse) for (let t = r - 1; t >= 0; t--) try {
5
- e[t]();
5
+ e[t]?.();
6
6
  } catch (e) {
7
7
  n.push(e);
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runAll.js","names":[],"sources":["../../src/function/runAll.ts"],"sourcesContent":["/**\n * Runs all functions in `fns`, collecting any thrown errors.\n * - With `reverse: true`, iterates in LIFO order (useful for cleanup/teardown stacks).\n * - Throws an `AggregateError` containing all failures if any function throws.\n *\n * @example\n * ```ts\n * const cleanups = [() => a.dispose(), () => b.dispose()];\n * runAll(cleanups, { reverse: true });\n * ```\n */\nexport function runAll(fns: readonly (() => void)[], opts?: { reverse?: boolean }): void {\n const errors: unknown[] = [];\n const len = fns.length;\n\n if (opts?.reverse) {\n for (let i = len - 1; i >= 0; i--) {\n try {\n fns[i]!();\n } catch (err) {\n errors.push(err);\n }\n }\n } else {\n for (const fn of fns) {\n try {\n fn();\n } catch (err) {\n errors.push(err);\n }\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more callbacks failed');\n }\n}\n"],"mappings":";AAWA,SAAgB,EAAO,GAA8B,GAAoC;CACvF,IAAM,IAAoB,CAAC,GACrB,IAAM,EAAI;CAEhB,IAAI,GAAM,SACR,KAAK,IAAI,IAAI,IAAM,GAAG,KAAK,GAAG,KAC5B,IAAI;EACF,EAAI,EAAE,CAAE;CACV,SAAS,GAAK;EACZ,EAAO,KAAK,CAAG;CACjB;MAGF,KAAK,IAAM,KAAM,GACf,IAAI;EACF,EAAG;CACL,SAAS,GAAK;EACZ,EAAO,KAAK,CAAG;CACjB;CAIJ,IAAI,EAAO,SAAS,GAClB,MAAU,eAAe,GAAQ,8BAA8B;AAEnE"}
1
+ {"version":3,"file":"runAll.js","names":[],"sources":["../../src/function/runAll.ts"],"sourcesContent":["/**\n * Runs all functions in `fns`, collecting any thrown errors.\n * - With `reverse: true`, iterates in LIFO order (useful for cleanup/teardown stacks).\n * - Throws an `AggregateError` containing all failures if any function throws.\n *\n * @example\n * ```ts\n * const cleanups = [() => a.dispose(), () => b.dispose()];\n * runAll(cleanups, { reverse: true });\n * ```\n */\nexport function runAll(fns: readonly (() => void)[], opts?: { reverse?: boolean }): void {\n const errors: unknown[] = [];\n const len = fns.length;\n\n if (opts?.reverse) {\n for (let i = len - 1; i >= 0; i--) {\n try {\n fns[i]?.();\n } catch (err) {\n errors.push(err);\n }\n }\n } else {\n for (const fn of fns) {\n try {\n fn();\n } catch (err) {\n errors.push(err);\n }\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more callbacks failed');\n }\n}\n"],"mappings":";AAWA,SAAgB,EAAO,GAA8B,GAAoC;CACvF,IAAM,IAAoB,CAAC,GACrB,IAAM,EAAI;CAEhB,IAAI,GAAM,SACR,KAAK,IAAI,IAAI,IAAM,GAAG,KAAK,GAAG,KAC5B,IAAI;EACF,EAAI,EAAE,GAAG;CACX,SAAS,GAAK;EACZ,EAAO,KAAK,CAAG;CACjB;MAGF,KAAK,IAAM,KAAM,GACf,IAAI;EACF,EAAG;CACL,SAAS,GAAK;EACZ,EAAO,KAAK,CAAG;CACjB;CAIJ,IAAI,EAAO,SAAS,GAClB,MAAU,eAAe,GAAQ,8BAA8B;AAEnE"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./isEqual.cjs"),t=require("./combinators.cjs"),n=require("./isAbortError.cjs"),r=require("./isDate.cjs"),i=require("./isDefined.cjs"),a=require("./isNil.cjs"),o=require("./isPlainObject.cjs"),s=require("./isEmpty.cjs"),c=require("./isError.cjs"),l=require("./isFunction.cjs"),u=require("./isMatch.cjs"),d=require("./isNumber.cjs"),f=require("./isPrimitive.cjs"),p=require("./isPromise.cjs"),m=require("./isRegex.cjs"),h=require("./shallowEqual.cjs");exports.allOf=t.allOf,exports.anyOf=t.anyOf,exports.isAbortError=n.isAbortError,exports.isDate=r.isDate,exports.isDefined=i.isDefined,exports.isEmpty=s.isEmpty,exports.isEqual=e.isEqual,exports.isError=c.isError,exports.isFunction=l.isFunction,exports.isMatch=u.isMatch,exports.isNil=a.isNil,exports.isNumber=d.isNumber,exports.isPlainObject=o.isPlainObject,exports.isPrimitive=f.isPrimitive,exports.isPromise=p.isPromise,exports.isRegex=m.isRegex,exports.noneOf=t.noneOf,exports.not=t.not,exports.shallowEqual=h.shallowEqual;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./isEqual.cjs"),t=require("./combinators.cjs"),n=require("./isAbortError.cjs"),r=require("./isDate.cjs"),i=require("./isDefined.cjs"),a=require("./isPlainObject.cjs"),o=require("./isEmpty.cjs"),s=require("./isError.cjs"),c=require("./isFunction.cjs"),l=require("./isMatch.cjs"),u=require("./isNil.cjs"),d=require("./isNumber.cjs"),f=require("./isPrimitive.cjs"),p=require("./isPromise.cjs"),m=require("./isRegex.cjs"),h=require("./shallowEqual.cjs");exports.allOf=t.allOf,exports.anyOf=t.anyOf,exports.isAbortError=n.isAbortError,exports.isDate=r.isDate,exports.isDefined=i.isDefined,exports.isEmpty=o.isEmpty,exports.isEqual=e.isEqual,exports.isError=s.isError,exports.isFunction=c.isFunction,exports.isMatch=l.isMatch,exports.isNil=u.isNil,exports.isNumber=d.isNumber,exports.isPlainObject=a.isPlainObject,exports.isPrimitive=f.isPrimitive,exports.isPromise=p.isPromise,exports.isRegex=m.isRegex,exports.noneOf=t.noneOf,exports.not=t.not,exports.shallowEqual=h.shallowEqual;
@@ -3,15 +3,15 @@ import { allOf as t, anyOf as n, noneOf as r, not as i } from "./combinators.js"
3
3
  import { isAbortError as a } from "./isAbortError.js";
4
4
  import { isDate as o } from "./isDate.js";
5
5
  import { isDefined as s } from "./isDefined.js";
6
- import { isNil as c } from "./isNil.js";
7
- import { isPlainObject as l } from "./isPlainObject.js";
8
- import { isEmpty as u } from "./isEmpty.js";
9
- import { isError as d } from "./isError.js";
10
- import { isFunction as f } from "./isFunction.js";
11
- import { isMatch as p } from "./isMatch.js";
6
+ import { isPlainObject as c } from "./isPlainObject.js";
7
+ import { isEmpty as l } from "./isEmpty.js";
8
+ import { isError as u } from "./isError.js";
9
+ import { isFunction as d } from "./isFunction.js";
10
+ import { isMatch as f } from "./isMatch.js";
11
+ import { isNil as p } from "./isNil.js";
12
12
  import { isNumber as m } from "./isNumber.js";
13
13
  import { isPrimitive as h } from "./isPrimitive.js";
14
14
  import { isPromise as g } from "./isPromise.js";
15
15
  import { isRegex as _ } from "./isRegex.js";
16
16
  import { shallowEqual as v } from "./shallowEqual.js";
17
- export { t as allOf, n as anyOf, a as isAbortError, o as isDate, s as isDefined, u as isEmpty, e as isEqual, d as isError, f as isFunction, p as isMatch, c as isNil, m as isNumber, l as isPlainObject, h as isPrimitive, g as isPromise, _ as isRegex, r as noneOf, i as not, v as shallowEqual };
17
+ export { t as allOf, n as anyOf, a as isAbortError, o as isDate, s as isDefined, l as isEmpty, e as isEqual, u as isError, d as isFunction, f as isMatch, p as isNil, m as isNumber, c as isPlainObject, h as isPrimitive, g as isPromise, _ as isRegex, r as noneOf, i as not, v as shallowEqual };
@@ -1,2 +1,2 @@
1
- const e=require("./isNil.cjs"),t=require("./isPlainObject.cjs");function n(n){return e.isNil(n)||n===``?!0:Array.isArray(n)?n.length===0:n instanceof Map||n instanceof Set?n.size===0:t.isPlainObject(n)?Object.keys(n).length===0:!1}exports.isEmpty=n;
1
+ const e=require("./isPlainObject.cjs");function t(t){return t==null||t===``?!0:Array.isArray(t)?t.length===0:t instanceof Map||t instanceof Set?t.size===0:e.isPlainObject(t)?Object.keys(t).length===0:!1}exports.isEmpty=t;
2
2
  //# sourceMappingURL=isEmpty.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"isEmpty.cjs","names":[],"sources":["../../src/guards/isEmpty.ts"],"sourcesContent":["import { isNil } from './isNil';\nimport { isPlainObject } from './isPlainObject';\n\n/**\n * Checks if the given argument is empty.\n *\n * @example\n * ```ts\n * isEmpty(null); // true\n * isEmpty(undefined); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(''); // true\n * isEmpty(0); // false\n * isEmpty(123); // false\n * isEmpty('abc'); // false\n * isEmpty([1, 2, 3]); // false\n * isEmpty({ a: 1, b: 2 }); // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if all arguments are `null`, `undefined`, `{}`, `[]`, or empty strings. Otherwise, it returns `false`.\n */\nexport function isEmpty(arg: unknown): boolean {\n if (isNil(arg) || arg === '') return true;\n\n if (Array.isArray(arg)) return arg.length === 0;\n\n if (arg instanceof Map || arg instanceof Set) return arg.size === 0;\n\n if (isPlainObject(arg)) return Object.keys(arg).length === 0;\n\n return false;\n}\n"],"mappings":"gEAwBA,SAAgB,EAAQ,EAAuB,CAS7C,OARI,EAAA,MAAM,CAAG,GAAK,IAAQ,GAAW,GAEjC,MAAM,QAAQ,CAAG,EAAU,EAAI,SAAW,EAE1C,aAAe,KAAO,aAAe,IAAY,EAAI,OAAS,EAE9D,EAAA,cAAc,CAAG,EAAU,OAAO,KAAK,CAAG,CAAC,CAAC,SAAW,EAEpD,EACT"}
1
+ {"version":3,"file":"isEmpty.cjs","names":[],"sources":["../../src/guards/isEmpty.ts"],"sourcesContent":["import { isPlainObject } from './isPlainObject';\n\n/**\n * Checks if the given argument is empty.\n *\n * @example\n * ```ts\n * isEmpty(null); // true\n * isEmpty(undefined); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(''); // true\n * isEmpty(0); // false\n * isEmpty(123); // false\n * isEmpty('abc'); // false\n * isEmpty([1, 2, 3]); // false\n * isEmpty({ a: 1, b: 2 }); // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if all arguments are `null`, `undefined`, `{}`, `[]`, or empty strings. Otherwise, it returns `false`.\n */\nexport function isEmpty(arg: unknown): boolean {\n if (arg === null || arg === undefined || arg === '') return true;\n\n if (Array.isArray(arg)) return arg.length === 0;\n\n if (arg instanceof Map || arg instanceof Set) return arg.size === 0;\n\n if (isPlainObject(arg)) return Object.keys(arg).length === 0;\n\n return false;\n}\n"],"mappings":"uCAuBA,SAAgB,EAAQ,EAAuB,CAS7C,OARI,GAAQ,MAA6B,IAAQ,GAAW,GAExD,MAAM,QAAQ,CAAG,EAAU,EAAI,SAAW,EAE1C,aAAe,KAAO,aAAe,IAAY,EAAI,OAAS,EAE9D,EAAA,cAAc,CAAG,EAAU,OAAO,KAAK,CAAG,CAAC,CAAC,SAAW,EAEpD,EACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"isEmpty.d.ts","sourceRoot":"","sources":["../../src/guards/isEmpty.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAU7C"}
1
+ {"version":3,"file":"isEmpty.d.ts","sourceRoot":"","sources":["../../src/guards/isEmpty.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAU7C"}
@@ -1,10 +1,9 @@
1
- import { isNil as e } from "./isNil.js";
2
- import { isPlainObject as t } from "./isPlainObject.js";
1
+ import { isPlainObject as e } from "./isPlainObject.js";
3
2
  //#region src/guards/isEmpty.ts
4
- function n(n) {
5
- return e(n) || n === "" ? !0 : Array.isArray(n) ? n.length === 0 : n instanceof Map || n instanceof Set ? n.size === 0 : t(n) ? Object.keys(n).length === 0 : !1;
3
+ function t(t) {
4
+ return t == null || t === "" ? !0 : Array.isArray(t) ? t.length === 0 : t instanceof Map || t instanceof Set ? t.size === 0 : e(t) ? Object.keys(t).length === 0 : !1;
6
5
  }
7
6
  //#endregion
8
- export { n as isEmpty };
7
+ export { t as isEmpty };
9
8
 
10
9
  //# sourceMappingURL=isEmpty.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isEmpty.js","names":[],"sources":["../../src/guards/isEmpty.ts"],"sourcesContent":["import { isNil } from './isNil';\nimport { isPlainObject } from './isPlainObject';\n\n/**\n * Checks if the given argument is empty.\n *\n * @example\n * ```ts\n * isEmpty(null); // true\n * isEmpty(undefined); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(''); // true\n * isEmpty(0); // false\n * isEmpty(123); // false\n * isEmpty('abc'); // false\n * isEmpty([1, 2, 3]); // false\n * isEmpty({ a: 1, b: 2 }); // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if all arguments are `null`, `undefined`, `{}`, `[]`, or empty strings. Otherwise, it returns `false`.\n */\nexport function isEmpty(arg: unknown): boolean {\n if (isNil(arg) || arg === '') return true;\n\n if (Array.isArray(arg)) return arg.length === 0;\n\n if (arg instanceof Map || arg instanceof Set) return arg.size === 0;\n\n if (isPlainObject(arg)) return Object.keys(arg).length === 0;\n\n return false;\n}\n"],"mappings":";;;AAwBA,SAAgB,EAAQ,GAAuB;CAS7C,OARI,EAAM,CAAG,KAAK,MAAQ,KAAW,KAEjC,MAAM,QAAQ,CAAG,IAAU,EAAI,WAAW,IAE1C,aAAe,OAAO,aAAe,MAAY,EAAI,SAAS,IAE9D,EAAc,CAAG,IAAU,OAAO,KAAK,CAAG,CAAC,CAAC,WAAW,IAEpD;AACT"}
1
+ {"version":3,"file":"isEmpty.js","names":[],"sources":["../../src/guards/isEmpty.ts"],"sourcesContent":["import { isPlainObject } from './isPlainObject';\n\n/**\n * Checks if the given argument is empty.\n *\n * @example\n * ```ts\n * isEmpty(null); // true\n * isEmpty(undefined); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(''); // true\n * isEmpty(0); // false\n * isEmpty(123); // false\n * isEmpty('abc'); // false\n * isEmpty([1, 2, 3]); // false\n * isEmpty({ a: 1, b: 2 }); // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if all arguments are `null`, `undefined`, `{}`, `[]`, or empty strings. Otherwise, it returns `false`.\n */\nexport function isEmpty(arg: unknown): boolean {\n if (arg === null || arg === undefined || arg === '') return true;\n\n if (Array.isArray(arg)) return arg.length === 0;\n\n if (arg instanceof Map || arg instanceof Set) return arg.size === 0;\n\n if (isPlainObject(arg)) return Object.keys(arg).length === 0;\n\n return false;\n}\n"],"mappings":";;AAuBA,SAAgB,EAAQ,GAAuB;CAS7C,OARI,KAAQ,QAA6B,MAAQ,KAAW,KAExD,MAAM,QAAQ,CAAG,IAAU,EAAI,WAAW,IAE1C,aAAe,OAAO,aAAe,MAAY,EAAI,SAAS,IAE9D,EAAc,CAAG,IAAU,OAAO,KAAK,CAAG,CAAC,CAAC,WAAW,IAEpD;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"isFunction.cjs","names":[],"sources":["../../src/guards/isFunction.ts"],"sourcesContent":["/**\n * Determines if the passed value is a function.\n *\n * @example\n * ```ts\n * isFunction(function() {}) // true\n * isFunction(() => {}) // true\n * isFunction('hello world') // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if the value is a function, else `false`.\n */\nexport function isFunction(arg: unknown): arg is (...args: any[]) => any {\n return typeof arg === 'function';\n}\n"],"mappings":"AAcA,SAAgB,EAAW,EAA8C,CACvE,OAAO,OAAO,GAAQ,UACxB"}
1
+ {"version":3,"file":"isFunction.cjs","names":[],"sources":["../../src/guards/isFunction.ts"],"sourcesContent":["/**\n * Determines if the passed value is a function.\n *\n * @example\n * ```ts\n * isFunction(function() {}) // true\n * isFunction(() => {}) // true\n * isFunction('hello world') // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if the value is a function, else `false`.\n */\nexport function isFunction(arg: unknown): arg is (...args: never[]) => unknown {\n return typeof arg === 'function';\n}\n"],"mappings":"AAcA,SAAgB,EAAW,EAAoD,CAC7E,OAAO,OAAO,GAAQ,UACxB"}
@@ -12,5 +12,5 @@
12
12
  *
13
13
  * @returns `true` if the value is a function, else `false`.
14
14
  */
15
- export declare function isFunction(arg: unknown): arg is (...args: any[]) => any;
15
+ export declare function isFunction(arg: unknown): arg is (...args: never[]) => unknown;
16
16
  //# sourceMappingURL=isFunction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isFunction.d.ts","sourceRoot":"","sources":["../../src/guards/isFunction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAEvE"}
1
+ {"version":3,"file":"isFunction.d.ts","sourceRoot":"","sources":["../../src/guards/isFunction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAE7E"}
@@ -1 +1 @@
1
- {"version":3,"file":"isFunction.js","names":[],"sources":["../../src/guards/isFunction.ts"],"sourcesContent":["/**\n * Determines if the passed value is a function.\n *\n * @example\n * ```ts\n * isFunction(function() {}) // true\n * isFunction(() => {}) // true\n * isFunction('hello world') // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if the value is a function, else `false`.\n */\nexport function isFunction(arg: unknown): arg is (...args: any[]) => any {\n return typeof arg === 'function';\n}\n"],"mappings":";AAcA,SAAgB,EAAW,GAA8C;CACvE,OAAO,OAAO,KAAQ;AACxB"}
1
+ {"version":3,"file":"isFunction.js","names":[],"sources":["../../src/guards/isFunction.ts"],"sourcesContent":["/**\n * Determines if the passed value is a function.\n *\n * @example\n * ```ts\n * isFunction(function() {}) // true\n * isFunction(() => {}) // true\n * isFunction('hello world') // false\n * ```\n *\n * @param arg - The argument to be checked.\n *\n * @returns `true` if the value is a function, else `false`.\n */\nexport function isFunction(arg: unknown): arg is (...args: never[]) => unknown {\n return typeof arg === 'function';\n}\n"],"mappings":";AAcA,SAAgB,EAAW,GAAoD;CAC7E,OAAO,OAAO,KAAQ;AACxB"}
@@ -1,2 +1,2 @@
1
- function e(e){let t=typeof e;return t===`string`||t===`boolean`||t===`number`&&!Number.isNaN(e)}exports.isPrimitive=e;
1
+ function e(e){return e===null||typeof e!=`object`&&typeof e!=`function`}exports.isPrimitive=e;
2
2
  //# sourceMappingURL=isPrimitive.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"isPrimitive.cjs","names":[],"sources":["../../src/guards/isPrimitive.ts"],"sourcesContent":["/**\n * Type guard to check if a value is a primitive\n *\n * @example\n * ```ts\n * isPrimitive('Hello World'); // true\n * isPrimitive(42); // true\n * isPrimitive(true); // true\n * isPrimitive({}); // false\n * isPrimitive([]); // false\n * isPrimitive(() => {}); // false\n * ```\n * @param arg - The argument to be checked.\n *\n * @returns `true` if the value is a primitive, else `false`.\n */\nexport function isPrimitive(arg: unknown): arg is string | number | boolean {\n const type = typeof arg;\n\n return type === 'string' || type === 'boolean' || (type === 'number' && !Number.isNaN(arg));\n}\n"],"mappings":"AAgBA,SAAgB,EAAY,EAAgD,CAC1E,IAAM,EAAO,OAAO,EAEpB,OAAO,IAAS,UAAY,IAAS,WAAc,IAAS,UAAY,CAAC,OAAO,MAAM,CAAG,CAC3F"}
1
+ {"version":3,"file":"isPrimitive.cjs","names":[],"sources":["../../src/guards/isPrimitive.ts"],"sourcesContent":["/** JavaScript values that are not objects or functions. */\nexport type PrimitiveValue = bigint | boolean | null | number | string | symbol | undefined;\n\n/** Checks whether a value is a JavaScript primitive. */\nexport function isPrimitive(value: unknown): value is PrimitiveValue {\n return value === null || (typeof value !== 'object' && typeof value !== 'function');\n}\n"],"mappings":"AAIA,SAAgB,EAAY,EAAyC,CACnE,OAAO,IAAU,MAAS,OAAO,GAAU,UAAY,OAAO,GAAU,UAC1E"}
@@ -1,18 +1,5 @@
1
- /**
2
- * Type guard to check if a value is a primitive
3
- *
4
- * @example
5
- * ```ts
6
- * isPrimitive('Hello World'); // true
7
- * isPrimitive(42); // true
8
- * isPrimitive(true); // true
9
- * isPrimitive({}); // false
10
- * isPrimitive([]); // false
11
- * isPrimitive(() => {}); // false
12
- * ```
13
- * @param arg - The argument to be checked.
14
- *
15
- * @returns `true` if the value is a primitive, else `false`.
16
- */
17
- export declare function isPrimitive(arg: unknown): arg is string | number | boolean;
1
+ /** JavaScript values that are not objects or functions. */
2
+ export type PrimitiveValue = bigint | boolean | null | number | string | symbol | undefined;
3
+ /** Checks whether a value is a JavaScript primitive. */
4
+ export declare function isPrimitive(value: unknown): value is PrimitiveValue;
18
5
  //# sourceMappingURL=isPrimitive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isPrimitive.d.ts","sourceRoot":"","sources":["../../src/guards/isPrimitive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,CAI1E"}
1
+ {"version":3,"file":"isPrimitive.d.ts","sourceRoot":"","sources":["../../src/guards/isPrimitive.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5F,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAEnE"}