@develia/commons 0.4.23 → 0.4.25

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 (354) hide show
  1. package/dist/array.d.ts.map +1 -0
  2. package/dist/array.js.map +1 -0
  3. package/dist/async-pool-executor.d.ts.map +1 -0
  4. package/dist/async-pool-executor.js.map +1 -0
  5. package/dist/browser/form-utilities.d.ts.map +1 -0
  6. package/dist/browser/form-utilities.js.map +1 -0
  7. package/dist/browser/geo-location.d.ts.map +1 -0
  8. package/dist/browser/geo-location.js.map +1 -0
  9. package/dist/browser/index.d.ts.map +1 -0
  10. package/dist/browser/index.js.map +1 -0
  11. package/dist/browser/native-bridge.d.ts.map +1 -0
  12. package/dist/browser/native-bridge.js.map +1 -0
  13. package/dist/cancellable-promise.d.ts.map +1 -0
  14. package/dist/cancellable-promise.js.map +1 -0
  15. package/dist/clean-url-search-params.d.ts.map +1 -0
  16. package/dist/clean-url-search-params.js.map +1 -0
  17. package/dist/collections/cache-dictionary.d.ts.map +1 -0
  18. package/dist/collections/cache-dictionary.js.map +1 -0
  19. package/dist/collections/default-map.d.ts.map +1 -0
  20. package/dist/collections/default-map.js.map +1 -0
  21. package/dist/collections/default-weak-map.d.ts.map +1 -0
  22. package/dist/collections/default-weak-map.js.map +1 -0
  23. package/dist/collections/from.d.ts.map +1 -0
  24. package/dist/collections/from.js.map +1 -0
  25. package/dist/collections/index.d.ts.map +1 -0
  26. package/dist/collections/index.js.map +1 -0
  27. package/dist/debouncer.d.ts +60 -0
  28. package/dist/debouncer.d.ts.map +1 -0
  29. package/dist/debouncer.js +118 -0
  30. package/dist/debouncer.js.map +1 -0
  31. package/dist/draft.d.ts.map +1 -0
  32. package/dist/draft.js.map +1 -0
  33. package/dist/event-bus.d.ts.map +1 -0
  34. package/dist/event-bus.js.map +1 -0
  35. package/dist/{types/functions.d.ts → functions.d.ts} +5 -35
  36. package/dist/functions.d.ts.map +1 -0
  37. package/dist/{esm/functions.js → functions.js} +0 -85
  38. package/dist/functions.js.map +1 -0
  39. package/dist/{types/index.d.ts → index.d.ts} +4 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/{web/index.js → index.js} +2 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/key-value-pair.d.ts.map +1 -0
  44. package/dist/key-value-pair.js.map +1 -0
  45. package/dist/keyed-debouncer.d.ts +56 -0
  46. package/dist/keyed-debouncer.d.ts.map +1 -0
  47. package/dist/keyed-debouncer.js +109 -0
  48. package/dist/keyed-debouncer.js.map +1 -0
  49. package/dist/lazy.d.ts.map +1 -0
  50. package/dist/lazy.js.map +1 -0
  51. package/dist/math.d.ts.map +1 -0
  52. package/dist/math.js.map +1 -0
  53. package/dist/order.d.ts.map +1 -0
  54. package/dist/order.js.map +1 -0
  55. package/dist/parse.d.ts.map +1 -0
  56. package/dist/parse.js.map +1 -0
  57. package/dist/patch.d.ts.map +1 -0
  58. package/dist/patch.js.map +1 -0
  59. package/dist/range.d.ts.map +1 -0
  60. package/dist/range.js.map +1 -0
  61. package/dist/result.d.ts.map +1 -0
  62. package/dist/result.js.map +1 -0
  63. package/dist/stopwatch.d.ts.map +1 -0
  64. package/dist/stopwatch.js.map +1 -0
  65. package/dist/string.d.ts.map +1 -0
  66. package/dist/string.js.map +1 -0
  67. package/dist/timer.d.ts.map +1 -0
  68. package/dist/timer.js.map +1 -0
  69. package/dist/timespan.d.ts.map +1 -0
  70. package/dist/timespan.js.map +1 -0
  71. package/dist/triggers.d.ts.map +1 -0
  72. package/dist/triggers.js.map +1 -0
  73. package/dist/type-code.d.ts.map +1 -0
  74. package/dist/type-code.js.map +1 -0
  75. package/dist/type.d.ts.map +1 -0
  76. package/dist/type.js.map +1 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/{types/utilities.d.ts → utilities.d.ts} +8 -3
  80. package/dist/utilities.d.ts.map +1 -0
  81. package/dist/{web/utilities.js → utilities.js} +27 -4
  82. package/dist/utilities.js.map +1 -0
  83. package/package.json +13 -62
  84. package/src/debouncer.ts +135 -0
  85. package/src/functions.ts +5 -114
  86. package/src/index.ts +4 -0
  87. package/src/keyed-debouncer.ts +121 -0
  88. package/src/utilities.ts +30 -4
  89. package/dist/cjs/array.js +0 -106
  90. package/dist/cjs/array.js.map +0 -1
  91. package/dist/cjs/async-pool-executor.js +0 -79
  92. package/dist/cjs/async-pool-executor.js.map +0 -1
  93. package/dist/cjs/browser/form-utilities.js +0 -162
  94. package/dist/cjs/browser/form-utilities.js.map +0 -1
  95. package/dist/cjs/browser/geo-location.js +0 -78
  96. package/dist/cjs/browser/geo-location.js.map +0 -1
  97. package/dist/cjs/browser/index.js +0 -99
  98. package/dist/cjs/browser/index.js.map +0 -1
  99. package/dist/cjs/browser/native-bridge.js +0 -81
  100. package/dist/cjs/browser/native-bridge.js.map +0 -1
  101. package/dist/cjs/cancellable-promise.js +0 -81
  102. package/dist/cjs/cancellable-promise.js.map +0 -1
  103. package/dist/cjs/clean-url-search-params.js +0 -34
  104. package/dist/cjs/clean-url-search-params.js.map +0 -1
  105. package/dist/cjs/collections/cache-dictionary.js +0 -102
  106. package/dist/cjs/collections/cache-dictionary.js.map +0 -1
  107. package/dist/cjs/collections/default-map.js +0 -45
  108. package/dist/cjs/collections/default-map.js.map +0 -1
  109. package/dist/cjs/collections/default-weak-map.js +0 -46
  110. package/dist/cjs/collections/default-weak-map.js.map +0 -1
  111. package/dist/cjs/collections/from.js +0 -778
  112. package/dist/cjs/collections/from.js.map +0 -1
  113. package/dist/cjs/collections/index.js +0 -15
  114. package/dist/cjs/collections/index.js.map +0 -1
  115. package/dist/cjs/draft.js +0 -225
  116. package/dist/cjs/draft.js.map +0 -1
  117. package/dist/cjs/event-bus.js +0 -71
  118. package/dist/cjs/event-bus.js.map +0 -1
  119. package/dist/cjs/functions.js +0 -348
  120. package/dist/cjs/functions.js.map +0 -1
  121. package/dist/cjs/index.js +0 -80
  122. package/dist/cjs/index.js.map +0 -1
  123. package/dist/cjs/key-value-pair.js +0 -22
  124. package/dist/cjs/key-value-pair.js.map +0 -1
  125. package/dist/cjs/lazy.js +0 -29
  126. package/dist/cjs/lazy.js.map +0 -1
  127. package/dist/cjs/math.js +0 -37
  128. package/dist/cjs/math.js.map +0 -1
  129. package/dist/cjs/order.js +0 -9
  130. package/dist/cjs/order.js.map +0 -1
  131. package/dist/cjs/parse.js +0 -174
  132. package/dist/cjs/parse.js.map +0 -1
  133. package/dist/cjs/patch.js +0 -52
  134. package/dist/cjs/patch.js.map +0 -1
  135. package/dist/cjs/range.js +0 -154
  136. package/dist/cjs/range.js.map +0 -1
  137. package/dist/cjs/result.js +0 -3
  138. package/dist/cjs/result.js.map +0 -1
  139. package/dist/cjs/stopwatch.js +0 -46
  140. package/dist/cjs/stopwatch.js.map +0 -1
  141. package/dist/cjs/string.js +0 -154
  142. package/dist/cjs/string.js.map +0 -1
  143. package/dist/cjs/timer.js +0 -57
  144. package/dist/cjs/timer.js.map +0 -1
  145. package/dist/cjs/timespan.js +0 -367
  146. package/dist/cjs/timespan.js.map +0 -1
  147. package/dist/cjs/triggers.js +0 -103
  148. package/dist/cjs/triggers.js.map +0 -1
  149. package/dist/cjs/type-code.js +0 -18
  150. package/dist/cjs/type-code.js.map +0 -1
  151. package/dist/cjs/type.js +0 -296
  152. package/dist/cjs/type.js.map +0 -1
  153. package/dist/cjs/types.js +0 -3
  154. package/dist/cjs/types.js.map +0 -1
  155. package/dist/cjs/utilities.js +0 -598
  156. package/dist/cjs/utilities.js.map +0 -1
  157. package/dist/esm/array.js.map +0 -1
  158. package/dist/esm/async-pool-executor.js.map +0 -1
  159. package/dist/esm/browser/form-utilities.js.map +0 -1
  160. package/dist/esm/browser/geo-location.js.map +0 -1
  161. package/dist/esm/browser/index.js.map +0 -1
  162. package/dist/esm/browser/native-bridge.js.map +0 -1
  163. package/dist/esm/cancellable-promise.js.map +0 -1
  164. package/dist/esm/clean-url-search-params.js.map +0 -1
  165. package/dist/esm/collections/cache-dictionary.js.map +0 -1
  166. package/dist/esm/collections/default-map.js.map +0 -1
  167. package/dist/esm/collections/default-weak-map.js.map +0 -1
  168. package/dist/esm/collections/from.js.map +0 -1
  169. package/dist/esm/collections/index.js.map +0 -1
  170. package/dist/esm/draft.js.map +0 -1
  171. package/dist/esm/event-bus.js.map +0 -1
  172. package/dist/esm/functions.js.map +0 -1
  173. package/dist/esm/index.js +0 -38
  174. package/dist/esm/index.js.map +0 -1
  175. package/dist/esm/key-value-pair.js.map +0 -1
  176. package/dist/esm/lazy.js.map +0 -1
  177. package/dist/esm/math.js.map +0 -1
  178. package/dist/esm/order.js.map +0 -1
  179. package/dist/esm/parse.js.map +0 -1
  180. package/dist/esm/patch.js.map +0 -1
  181. package/dist/esm/range.js.map +0 -1
  182. package/dist/esm/result.js.map +0 -1
  183. package/dist/esm/stopwatch.js.map +0 -1
  184. package/dist/esm/string.js.map +0 -1
  185. package/dist/esm/timer.js.map +0 -1
  186. package/dist/esm/timespan.js.map +0 -1
  187. package/dist/esm/triggers.js.map +0 -1
  188. package/dist/esm/type-code.js.map +0 -1
  189. package/dist/esm/type.js.map +0 -1
  190. package/dist/esm/types.js.map +0 -1
  191. package/dist/esm/utilities.js +0 -567
  192. package/dist/esm/utilities.js.map +0 -1
  193. package/dist/types/array.d.ts.map +0 -1
  194. package/dist/types/async-pool-executor.d.ts.map +0 -1
  195. package/dist/types/browser/form-utilities.d.ts.map +0 -1
  196. package/dist/types/browser/geo-location.d.ts.map +0 -1
  197. package/dist/types/browser/index.d.ts.map +0 -1
  198. package/dist/types/browser/native-bridge.d.ts.map +0 -1
  199. package/dist/types/cancellable-promise.d.ts.map +0 -1
  200. package/dist/types/clean-url-search-params.d.ts.map +0 -1
  201. package/dist/types/collections/cache-dictionary.d.ts.map +0 -1
  202. package/dist/types/collections/default-map.d.ts.map +0 -1
  203. package/dist/types/collections/default-weak-map.d.ts.map +0 -1
  204. package/dist/types/collections/from.d.ts.map +0 -1
  205. package/dist/types/collections/index.d.ts.map +0 -1
  206. package/dist/types/draft.d.ts.map +0 -1
  207. package/dist/types/event-bus.d.ts.map +0 -1
  208. package/dist/types/functions.d.ts.map +0 -1
  209. package/dist/types/index.d.ts.map +0 -1
  210. package/dist/types/key-value-pair.d.ts.map +0 -1
  211. package/dist/types/lazy.d.ts.map +0 -1
  212. package/dist/types/math.d.ts.map +0 -1
  213. package/dist/types/order.d.ts.map +0 -1
  214. package/dist/types/parse.d.ts.map +0 -1
  215. package/dist/types/patch.d.ts.map +0 -1
  216. package/dist/types/range.d.ts.map +0 -1
  217. package/dist/types/result.d.ts.map +0 -1
  218. package/dist/types/stopwatch.d.ts.map +0 -1
  219. package/dist/types/string.d.ts.map +0 -1
  220. package/dist/types/timer.d.ts.map +0 -1
  221. package/dist/types/timespan.d.ts.map +0 -1
  222. package/dist/types/triggers.d.ts.map +0 -1
  223. package/dist/types/type-code.d.ts.map +0 -1
  224. package/dist/types/type.d.ts.map +0 -1
  225. package/dist/types/types.d.ts.map +0 -1
  226. package/dist/types/utilities.d.ts.map +0 -1
  227. package/dist/web/array.js +0 -98
  228. package/dist/web/array.js.map +0 -1
  229. package/dist/web/async-pool-executor.js +0 -76
  230. package/dist/web/async-pool-executor.js.map +0 -1
  231. package/dist/web/browser/form-utilities.js +0 -155
  232. package/dist/web/browser/form-utilities.js.map +0 -1
  233. package/dist/web/browser/geo-location.js +0 -75
  234. package/dist/web/browser/geo-location.js.map +0 -1
  235. package/dist/web/browser/index.js +0 -75
  236. package/dist/web/browser/index.js.map +0 -1
  237. package/dist/web/browser/native-bridge.js +0 -78
  238. package/dist/web/browser/native-bridge.js.map +0 -1
  239. package/dist/web/cancellable-promise.js +0 -78
  240. package/dist/web/cancellable-promise.js.map +0 -1
  241. package/dist/web/clean-url-search-params.js +0 -31
  242. package/dist/web/clean-url-search-params.js.map +0 -1
  243. package/dist/web/collections/cache-dictionary.js +0 -99
  244. package/dist/web/collections/cache-dictionary.js.map +0 -1
  245. package/dist/web/collections/default-map.js +0 -42
  246. package/dist/web/collections/default-map.js.map +0 -1
  247. package/dist/web/collections/default-weak-map.js +0 -43
  248. package/dist/web/collections/default-weak-map.js.map +0 -1
  249. package/dist/web/collections/from.js +0 -770
  250. package/dist/web/collections/from.js.map +0 -1
  251. package/dist/web/collections/index.js +0 -5
  252. package/dist/web/collections/index.js.map +0 -1
  253. package/dist/web/draft.js +0 -222
  254. package/dist/web/draft.js.map +0 -1
  255. package/dist/web/event-bus.js +0 -66
  256. package/dist/web/event-bus.js.map +0 -1
  257. package/dist/web/functions.js +0 -336
  258. package/dist/web/functions.js.map +0 -1
  259. package/dist/web/index.js.map +0 -1
  260. package/dist/web/key-value-pair.js +0 -19
  261. package/dist/web/key-value-pair.js.map +0 -1
  262. package/dist/web/lazy.js +0 -26
  263. package/dist/web/lazy.js.map +0 -1
  264. package/dist/web/math.js +0 -33
  265. package/dist/web/math.js.map +0 -1
  266. package/dist/web/order.js +0 -7
  267. package/dist/web/order.js.map +0 -1
  268. package/dist/web/parse.js +0 -169
  269. package/dist/web/parse.js.map +0 -1
  270. package/dist/web/patch.js +0 -48
  271. package/dist/web/patch.js.map +0 -1
  272. package/dist/web/range.js +0 -151
  273. package/dist/web/range.js.map +0 -1
  274. package/dist/web/result.js +0 -2
  275. package/dist/web/result.js.map +0 -1
  276. package/dist/web/stopwatch.js +0 -40
  277. package/dist/web/stopwatch.js.map +0 -1
  278. package/dist/web/string.js +0 -142
  279. package/dist/web/string.js.map +0 -1
  280. package/dist/web/timer.js +0 -54
  281. package/dist/web/timer.js.map +0 -1
  282. package/dist/web/timespan.js +0 -365
  283. package/dist/web/timespan.js.map +0 -1
  284. package/dist/web/triggers.js +0 -99
  285. package/dist/web/triggers.js.map +0 -1
  286. package/dist/web/type-code.js +0 -16
  287. package/dist/web/type-code.js.map +0 -1
  288. package/dist/web/type.js +0 -292
  289. package/dist/web/type.js.map +0 -1
  290. package/dist/web/types.js +0 -2
  291. package/dist/web/types.js.map +0 -1
  292. package/dist/web/utilities.js.map +0 -1
  293. /package/dist/{types/array.d.ts → array.d.ts} +0 -0
  294. /package/dist/{esm/array.js → array.js} +0 -0
  295. /package/dist/{types/async-pool-executor.d.ts → async-pool-executor.d.ts} +0 -0
  296. /package/dist/{esm/async-pool-executor.js → async-pool-executor.js} +0 -0
  297. /package/dist/{types/browser → browser}/form-utilities.d.ts +0 -0
  298. /package/dist/{esm/browser → browser}/form-utilities.js +0 -0
  299. /package/dist/{types/browser → browser}/geo-location.d.ts +0 -0
  300. /package/dist/{esm/browser → browser}/geo-location.js +0 -0
  301. /package/dist/{types/browser → browser}/index.d.ts +0 -0
  302. /package/dist/{esm/browser → browser}/index.js +0 -0
  303. /package/dist/{types/browser → browser}/native-bridge.d.ts +0 -0
  304. /package/dist/{esm/browser → browser}/native-bridge.js +0 -0
  305. /package/dist/{types/cancellable-promise.d.ts → cancellable-promise.d.ts} +0 -0
  306. /package/dist/{esm/cancellable-promise.js → cancellable-promise.js} +0 -0
  307. /package/dist/{types/clean-url-search-params.d.ts → clean-url-search-params.d.ts} +0 -0
  308. /package/dist/{esm/clean-url-search-params.js → clean-url-search-params.js} +0 -0
  309. /package/dist/{types/collections → collections}/cache-dictionary.d.ts +0 -0
  310. /package/dist/{esm/collections → collections}/cache-dictionary.js +0 -0
  311. /package/dist/{types/collections → collections}/default-map.d.ts +0 -0
  312. /package/dist/{esm/collections → collections}/default-map.js +0 -0
  313. /package/dist/{types/collections → collections}/default-weak-map.d.ts +0 -0
  314. /package/dist/{esm/collections → collections}/default-weak-map.js +0 -0
  315. /package/dist/{types/collections → collections}/from.d.ts +0 -0
  316. /package/dist/{esm/collections → collections}/from.js +0 -0
  317. /package/dist/{types/collections → collections}/index.d.ts +0 -0
  318. /package/dist/{esm/collections → collections}/index.js +0 -0
  319. /package/dist/{types/draft.d.ts → draft.d.ts} +0 -0
  320. /package/dist/{esm/draft.js → draft.js} +0 -0
  321. /package/dist/{types/event-bus.d.ts → event-bus.d.ts} +0 -0
  322. /package/dist/{esm/event-bus.js → event-bus.js} +0 -0
  323. /package/dist/{types/key-value-pair.d.ts → key-value-pair.d.ts} +0 -0
  324. /package/dist/{esm/key-value-pair.js → key-value-pair.js} +0 -0
  325. /package/dist/{types/lazy.d.ts → lazy.d.ts} +0 -0
  326. /package/dist/{esm/lazy.js → lazy.js} +0 -0
  327. /package/dist/{types/math.d.ts → math.d.ts} +0 -0
  328. /package/dist/{esm/math.js → math.js} +0 -0
  329. /package/dist/{types/order.d.ts → order.d.ts} +0 -0
  330. /package/dist/{esm/order.js → order.js} +0 -0
  331. /package/dist/{types/parse.d.ts → parse.d.ts} +0 -0
  332. /package/dist/{esm/parse.js → parse.js} +0 -0
  333. /package/dist/{types/patch.d.ts → patch.d.ts} +0 -0
  334. /package/dist/{esm/patch.js → patch.js} +0 -0
  335. /package/dist/{types/range.d.ts → range.d.ts} +0 -0
  336. /package/dist/{esm/range.js → range.js} +0 -0
  337. /package/dist/{types/result.d.ts → result.d.ts} +0 -0
  338. /package/dist/{esm/result.js → result.js} +0 -0
  339. /package/dist/{types/stopwatch.d.ts → stopwatch.d.ts} +0 -0
  340. /package/dist/{esm/stopwatch.js → stopwatch.js} +0 -0
  341. /package/dist/{types/string.d.ts → string.d.ts} +0 -0
  342. /package/dist/{esm/string.js → string.js} +0 -0
  343. /package/dist/{types/timer.d.ts → timer.d.ts} +0 -0
  344. /package/dist/{esm/timer.js → timer.js} +0 -0
  345. /package/dist/{types/timespan.d.ts → timespan.d.ts} +0 -0
  346. /package/dist/{esm/timespan.js → timespan.js} +0 -0
  347. /package/dist/{types/triggers.d.ts → triggers.d.ts} +0 -0
  348. /package/dist/{esm/triggers.js → triggers.js} +0 -0
  349. /package/dist/{types/type-code.d.ts → type-code.d.ts} +0 -0
  350. /package/dist/{esm/type-code.js → type-code.js} +0 -0
  351. /package/dist/{types/type.d.ts → type.d.ts} +0 -0
  352. /package/dist/{esm/type.js → type.js} +0 -0
  353. /package/dist/{types/types.d.ts → types.d.ts} +0 -0
  354. /package/dist/{esm/types.js → types.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.js","sourceRoot":"","sources":["../src/draft.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Methods injected into a draft proxy in addition to the original object's properties.\n *\n * @template T - The shape of the wrapped object.\n */\ntype DraftMethods<T> = {\n /**\n * Apply pending changes to the original object.\n *\n * @param key - Optional property key. If provided, commits only that property.\n * If omitted, commits every modified property recursively.\n * @returns `true` when a single-property commit was applied,\n * `false` when the property was not modified,\n * `void` when committing the whole draft.\n */\n commit(key?: keyof T): boolean | void;\n\n /**\n * Discard pending changes, restoring values from the original object.\n *\n * @param key - Optional property key. If provided, rolls back only that property.\n * If omitted, rolls back every modified property recursively.\n * @returns `true` when a single-property rollback was applied,\n * `false` when the property was not modified,\n * `void` when rolling back the whole draft.\n */\n rollback(key?: keyof T): boolean | void;\n\n /**\n * Check whether the draft (or a specific property) has pending changes.\n *\n * @param key - Optional property key. If omitted, checks the whole draft.\n * @returns `true` if there are pending changes.\n */\n isModified(key?: keyof T): boolean;\n\n /**\n * Get the list of property keys with pending changes at this draft level.\n *\n * @returns Array of modified property keys (does not recurse into children).\n */\n modifiedProps(): (keyof T)[];\n\n /**\n * Manually mark (or unmark) a property as modified.\n * Primarily used by child drafts to notify their parent, but also\n * available for advanced manual control.\n *\n * @param key - Property key to flag.\n * @param modified - `true` to mark as modified (default), `false` to clear.\n */\n setModified(key: keyof T, modified?: boolean): void;\n};\n\n/**\n * A draft proxy: the original object's properties plus draft control methods.\n *\n * @template T - The shape of the wrapped object.\n */\nexport type Draft<T extends object> = T & DraftMethods<T>;\n\n/**\n * Link from a child draft to its parent, used to propagate modification status.\n */\ntype ParentLink = {\n /** Parent draft methods reference (we only need `setModified`). */\n parent: { setModified(key: PropertyKey, modified?: boolean): void };\n /** Key under which this draft is stored in the parent. */\n keyInParent: PropertyKey;\n};\n\nconst DRAFT_MATERIALIZE = Symbol(\"draft.materialize\");\n\ntype InternalDraft = Draft<any> & {\n [DRAFT_MATERIALIZE]: () => any;\n};\n\nfunction isDraftValue(value: any): value is InternalDraft {\n return value !== null &&\n typeof value === \"object\" &&\n typeof value[DRAFT_MATERIALIZE] === \"function\";\n}\n\nfunction materializeDraftValue(value: any): any {\n if (isDraftValue(value)) return value[DRAFT_MATERIALIZE]();\n if (value === null || typeof value !== \"object\") return value;\n\n const objectValue = value as any;\n if (objectValue instanceof Date) return new Date(objectValue);\n if (objectValue instanceof RegExp) return new RegExp(objectValue);\n\n if (objectValue instanceof Map) {\n const copy = new Map();\n for (const [k, v] of objectValue) {\n copy.set(materializeDraftValue(k), materializeDraftValue(v));\n }\n return copy;\n }\n\n if (objectValue instanceof Set) {\n const copy = new Set();\n for (const v of objectValue) {\n copy.add(materializeDraftValue(v));\n }\n return copy;\n }\n\n const copy: any = Array.isArray(objectValue)\n ? []\n : Object.create(Object.getPrototypeOf(objectValue));\n\n for (const key of Reflect.ownKeys(objectValue)) {\n copy[key] = materializeDraftValue(objectValue[key]);\n }\n\n return copy;\n}\n\n// ─────────────────────────────────────────────\n// deepDraft (internal)\n// ─────────────────────────────────────────────\n\n/**\n * Recursively wrap a value so that nested objects/arrays become child drafts\n * linked to a parent. Primitives, `Date`, `RegExp`, `Map` and `Set` instances\n * are cloned but not wrapped.\n *\n * @param value - The value to process.\n * @param parentLink - Optional link to a parent draft for change propagation.\n * @returns A drafted value (or a plain clone for non-wrappable types).\n */\nfunction deepDraft(value: any, parentLink?: ParentLink): any {\n if (value === null || typeof value !== \"object\") return value;\n if (value instanceof Date) return new Date(value);\n if (value instanceof RegExp) return new RegExp(value);\n\n if (value instanceof Map) {\n const copy = new Map();\n for (const [k, v] of value) {\n copy.set(deepDraft(k), deepDraft(v));\n }\n return copy;\n }\n if (value instanceof Set) {\n const copy = new Set();\n for (const v of value) {\n copy.add(deepDraft(v));\n }\n return copy;\n }\n\n return draft(value, parentLink);\n}\n\n/**\n * Create a draft proxy over `original`. The proxy exposes the same properties\n * as the original (with nested objects wrapped as child drafts) plus the\n * control methods `commit`, `rollback`, `isModified`, `modifiedProps` and\n * `setModified`.\n *\n * Mutations on the draft do not affect the original until `commit()` is called.\n * Nested mutations bubble up: modifying a deep property marks every ancestor\n * draft as modified at the corresponding key.\n *\n * @template T - The shape of the wrapped object.\n * @param original - The object to wrap. It will only be mutated on `commit()`.\n * @param parentLink - Internal link used when this draft is a child of another.\n * Do not pass manually.\n * @returns A draft proxy over a deep copy of `original`.\n */\nexport default function draft<T extends object>(\n original: T,\n parentLink?: ParentLink\n): Draft<T> {\n const copy: any = Array.isArray(original)\n ? []\n : Object.create(Object.getPrototypeOf(original));\n\n const touched = new Set<PropertyKey>();\n\n const notifyParent = (modified: boolean): void => {\n if (parentLink) {\n parentLink.parent.setModified(parentLink.keyInParent, modified);\n }\n };\n\n /**\n * Apply commit for a single key: delegate to the child draft if present,\n * otherwise copy the value into `original`.\n */\n const applyCommit = (key: PropertyKey): void => {\n const val = copy[key];\n if (isDraftValue(val)) {\n val.commit();\n (original as any)[key] = materializeDraftValue(val);\n return;\n }\n if (key in copy) {\n (original as any)[key] = copy[key];\n } else {\n delete (original as any)[key];\n }\n };\n /**\n * Apply rollback for a single key: delegate to the child draft if present,\n * otherwise restore the value from `original`.\n */\n const applyRollback = (key: PropertyKey): void => {\n if (key in original) {\n copy[key] = deepDraft((original as any)[key], {\n parent: methods,\n keyInParent: key,\n });\n } else {\n delete copy[key];\n }\n };\n\n const methods: DraftMethods<T> = {\n commit(key) {\n if (key === undefined) {\n for (const k of touched) applyCommit(k);\n touched.clear();\n notifyParent(false);\n return;\n }\n if (!touched.has(key)) return false;\n applyCommit(key);\n touched.delete(key);\n if (touched.size === 0) notifyParent(false);\n return true;\n },\n\n rollback(key) {\n if (key === undefined) {\n for (const k of touched) applyRollback(k);\n touched.clear();\n notifyParent(false);\n return;\n }\n if (!touched.has(key)) return false;\n applyRollback(key);\n touched.delete(key);\n if (touched.size === 0) notifyParent(false);\n return true;\n },\n\n isModified(key) {\n return key === undefined ? touched.size > 0 : touched.has(key);\n },\n\n modifiedProps() {\n return [...touched] as (keyof T)[];\n },\n\n setModified(key, modified = true) {\n if (modified) {\n touched.add(key);\n notifyParent(true);\n } else {\n touched.delete(key);\n if (touched.size === 0) notifyParent(false);\n }\n },\n };\n\n const isMethodKey = (prop: PropertyKey): prop is keyof DraftMethods<T> =>\n typeof prop === \"string\" && prop in methods;\n\n // Populate `copy` with child drafts linked to this draft.\n for (const key of Reflect.ownKeys(original)) {\n copy[key] = deepDraft((original as any)[key], {\n parent: methods,\n keyInParent: key,\n });\n }\n\n return new Proxy(copy, {\n get(target, prop, receiver) {\n if (prop === DRAFT_MATERIALIZE) return () => materializeDraftValue(target);\n if (isMethodKey(prop)) return (methods as any)[prop];\n return Reflect.get(target, prop, receiver);\n },\n\n set(target, prop, value, receiver) {\n if (isMethodKey(prop)) {\n throw new Error(`\"${String(prop)}\" is a reserved draft property`);\n }\n const wrapped = deepDraft(value, {\n parent: methods,\n keyInParent: prop,\n });\n touched.add(prop);\n notifyParent(true);\n return Reflect.set(target, prop, wrapped, receiver);\n },\n\n deleteProperty(target, prop) {\n if (isMethodKey(prop)) {\n throw new Error(`\"${String(prop)}\" is a reserved draft property`);\n }\n touched.add(prop);\n notifyParent(true);\n return Reflect.deleteProperty(target, prop);\n },\n }) as Draft<T>;\n}"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAEA,8BAAsB,KAAK;IACvB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAEzB,SAAS;IAIT,QAAQ,IAAI,MAAM;CAGrB;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,KAAK,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7D,KAAK,OAAO,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAOnD,qBAAa,QAAQ;IACjB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAyB;IAEjD,MAAM,KAAK,MAAM,IAAI,QAAQ,CAE5B;IAED,OAAO,CAAC,SAAS,CAAyC;IAE1D,EAAE,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAUnE,GAAG,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAUpE,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAarC,IAAI,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAQrE,KAAK,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAIjD,QAAQ,IAAI,IAAI;IAIhB,YAAY,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO;CAG9D"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA,WAAW;AAEX,MAAM,OAAgB,KAAK;IAGvB;QACI,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,QAAQ;QACJ,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC;IACvE,CAAC;CACJ;AAUD,MAAM,OAAO,QAAQ;IAArB;QAOY,cAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IAsD9D,CAAC;IA1DG,MAAM,KAAK,MAAM;QACb,OAAO,IAAI,CAAC,SAAS,KAAd,IAAI,CAAC,SAAS,GAAK,IAAI,QAAQ,EAAE,EAAC;IAC7C,CAAC;IAID,EAAE,CAAkB,IAAmB,EAAE,OAAmB;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC;YAC3B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAU,CAAC;SACjD,CAAC,CAAC;IACP,CAAC;IAED,GAAG,CAAkB,IAAmB,EAAE,OAAmB;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,CAAkB,KAAQ;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;YAClF,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAkB,IAAmB,EAAE,OAAmB;QAC1D,MAAM,OAAO,GAAe,CAAC,KAAQ,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAkB,IAAmB;QACtC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,YAAY,CAAkB,IAAmB;QAC7C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;;AA3Dc,kBAAS,GAAoB,IAAI,AAAxB,CAAyB","sourcesContent":["// event.ts\n\nexport abstract class Event {\n readonly timestamp: Date;\n\n protected constructor() {\n this.timestamp = new Date();\n }\n\n toString(): string {\n return `${this.constructor.name}(${this.timestamp.toISOString()})`;\n }\n}\n\ntype EventClass<T extends Event> = new (...args: any[]) => T;\ntype Handler<T extends Event> = (event: T) => void;\n\ninterface HandlerWrapper {\n original: Function;\n wrapped: (event: Event) => void;\n}\n\nexport class EventBus {\n private static _instance: EventBus | null = null;\n\n static get shared(): EventBus {\n return this._instance ??= new EventBus();\n }\n\n private _handlers = new Map<Function, HandlerWrapper[]>();\n\n on<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {\n if (!this._handlers.has(type)) {\n this._handlers.set(type, []);\n }\n this._handlers.get(type)!.push({\n original: handler,\n wrapped: (event: Event) => handler(event as T),\n });\n }\n\n off<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {\n const handlers = this._handlers.get(type);\n if (!handlers) return;\n\n let index = handlers.findIndex((h) => h.original === handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n emit<T extends Event>(event: T): void {\n const handlers = this._handlers.get(event.constructor);\n if (!handlers) return;\n\n for (const handler of [...handlers]) {\n try {\n handler.wrapped(event);\n } catch (e) {\n console.error(`[EventBus] Error en handler de ${event.constructor.name}:`, e);\n }\n }\n }\n\n once<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {\n const wrapper: Handler<T> = (event: T) => {\n this.off(type, wrapper);\n handler(event);\n };\n this.on(type, wrapper);\n }\n\n clear<T extends Event>(type: EventClass<T>): void {\n this._handlers.delete(type);\n }\n\n clearAll(): void {\n this._handlers.clear();\n }\n\n hasListeners<T extends Event>(type: EventClass<T>): boolean {\n return (this._handlers.get(type)?.length ?? 0) > 0;\n }\n}"]}
@@ -1,11 +1,4 @@
1
1
  type AnyFunction = (this: any, ...args: any[]) => any;
2
- /** Options that control when a debounced function is executed. */
3
- export interface DebounceOptions {
4
- /** Execute on the first call in a debounce window. Defaults to false. */
5
- leading?: boolean;
6
- /** Execute after the debounce window using the latest arguments. Defaults to true. */
7
- trailing?: boolean;
8
- }
9
2
  /** Options that control when a throttled function is executed. */
10
3
  export interface ThrottleOptions {
11
4
  /** Execute immediately on the first call in a throttle window. Defaults to true. */
@@ -14,15 +7,15 @@ export interface ThrottleOptions {
14
7
  trailing?: boolean;
15
8
  }
16
9
  /**
17
- * A delayed function returned by {@link debounce} or {@link throttle}.
10
+ * A delayed function returned by {@link throttle}.
18
11
  *
19
12
  * @example
20
13
  * ```ts
21
- * const saveLater = debounce(save, 250);
22
- * saveLater();
14
+ * const refresh = throttle(loadData, 250);
15
+ * refresh();
23
16
  *
24
- * if (saveLater.pending()) {
25
- * saveLater.flush();
17
+ * if (refresh.pending()) {
18
+ * refresh.flush();
26
19
  * }
27
20
  * ```
28
21
  */
@@ -133,29 +126,6 @@ export declare function once<F extends AnyFunction>(fn: F): F;
133
126
  * ```
134
127
  */
135
128
  export declare function memoize<F extends AnyFunction, K = Parameters<F>[0]>(fn: F, resolver?: (...args: Parameters<F>) => K, cache?: Map<K, ReturnType<F>>): MemoizedFunction<F, K>;
136
- /**
137
- * Delay a function until no calls have been made for the configured wait time.
138
- * The latest arguments and this-context are used for the trailing execution.
139
- *
140
- * @example
141
- * ```ts
142
- * const search = debounce((query: string) => {
143
- * console.log(query);
144
- * }, 300);
145
- *
146
- * search("com");
147
- * search("commons"); // only this value is printed after 300 ms
148
- * ```
149
- *
150
- * @example
151
- * ```ts
152
- * const track = debounce(sendAnalytics, 1000, {leading: true, trailing: false});
153
- *
154
- * track("open"); // executed immediately
155
- * track.cancel(); // cancel the pending debounce window
156
- * ```
157
- */
158
- export declare function debounce<F extends AnyFunction>(fn: F, wait: number, options?: DebounceOptions): DeferredFunction<F>;
159
129
  /**
160
130
  * Limit how often a function can run during a time window.
161
131
  * Calls made while the function is throttled can optionally be replayed once at the end with the latest arguments.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":"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"}
@@ -113,91 +113,6 @@ export function memoize(fn, resolver, cache = new Map()) {
113
113
  memoized.has = (...args) => cache.has(resolveKey(...args));
114
114
  return memoized;
115
115
  }
116
- /**
117
- * Delay a function until no calls have been made for the configured wait time.
118
- * The latest arguments and this-context are used for the trailing execution.
119
- *
120
- * @example
121
- * ```ts
122
- * const search = debounce((query: string) => {
123
- * console.log(query);
124
- * }, 300);
125
- *
126
- * search("com");
127
- * search("commons"); // only this value is printed after 300 ms
128
- * ```
129
- *
130
- * @example
131
- * ```ts
132
- * const track = debounce(sendAnalytics, 1000, {leading: true, trailing: false});
133
- *
134
- * track("open"); // executed immediately
135
- * track.cancel(); // cancel the pending debounce window
136
- * ```
137
- */
138
- export function debounce(fn, wait, options = {}) {
139
- const delay = normalizeDelay(wait);
140
- const leading = options.leading ?? false;
141
- const trailing = options.trailing ?? true;
142
- let timer;
143
- let lastArgs;
144
- let lastThis;
145
- let result;
146
- const invoke = () => {
147
- const args = lastArgs;
148
- const context = lastThis;
149
- lastArgs = undefined;
150
- lastThis = undefined;
151
- result = fn.apply(context, args);
152
- return result;
153
- };
154
- const expire = () => {
155
- timer = undefined;
156
- if (trailing && lastArgs) {
157
- invoke();
158
- }
159
- else {
160
- lastArgs = undefined;
161
- lastThis = undefined;
162
- }
163
- };
164
- const start = () => {
165
- timer = setTimeout(expire, delay);
166
- };
167
- const debounced = function (...args) {
168
- const invokeLeading = leading && timer === undefined;
169
- lastArgs = args;
170
- lastThis = this;
171
- if (timer !== undefined) {
172
- clearTimeout(timer);
173
- }
174
- start();
175
- if (invokeLeading) {
176
- return invoke();
177
- }
178
- return result;
179
- };
180
- debounced.cancel = () => {
181
- if (timer !== undefined) {
182
- clearTimeout(timer);
183
- }
184
- timer = undefined;
185
- lastArgs = undefined;
186
- lastThis = undefined;
187
- };
188
- debounced.flush = () => {
189
- if (timer !== undefined) {
190
- clearTimeout(timer);
191
- timer = undefined;
192
- if (lastArgs && trailing) {
193
- return invoke();
194
- }
195
- }
196
- return result;
197
- };
198
- debounced.pending = () => timer !== undefined;
199
- return debounced;
200
- }
201
116
  /**
202
117
  * Limit how often a function can run during a time window.
203
118
  * Calls made while the function is throttled can optionally be replayed once at the end with the latest arguments.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":"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","sourcesContent":["type AnyFunction = (this: any, ...args: any[]) => any;\ntype TimerHandle = ReturnType<typeof setTimeout>;\n\n/** Options that control when a throttled function is executed. */\nexport interface ThrottleOptions {\n /** Execute immediately on the first call in a throttle window. Defaults to true. */\n leading?: boolean;\n /** Execute once more at the end of the throttle window using the latest arguments. Defaults to true. */\n trailing?: boolean;\n}\n\n/**\n * A delayed function returned by {@link throttle}.\n *\n * @example\n * ```ts\n * const refresh = throttle(loadData, 250);\n * refresh();\n *\n * if (refresh.pending()) {\n * refresh.flush();\n * }\n * ```\n */\nexport type DeferredFunction<F extends AnyFunction> = ((\n this: ThisParameterType<F>,\n ...args: Parameters<F>\n) => ReturnType<F> | undefined) & {\n /** Cancel the scheduled call and forget the latest arguments. */\n cancel(): void;\n /** Execute the scheduled trailing call immediately, when one exists. */\n flush(): ReturnType<F> | undefined;\n /** Return true while a trailing call is scheduled. */\n pending(): boolean;\n};\n\n/**\n * A memoized function with helpers for inspecting and invalidating its cache.\n *\n * @example\n * ```ts\n * const getUser = memoize((id: string) => fetchUser(id));\n *\n * getUser(\"42\");\n * getUser.has(\"42\"); // true\n * getUser.delete(\"42\");\n * ```\n */\nexport type MemoizedFunction<F extends AnyFunction, K> = ((\n this: ThisParameterType<F>,\n ...args: Parameters<F>\n) => ReturnType<F>) & {\n /** The backing cache used by the memoized function. */\n readonly cache: Map<K, ReturnType<F>>;\n /** Remove every cached value. */\n clear(): void;\n /** Remove the cached value for the key resolved from the provided arguments. */\n delete(...args: Parameters<F>): boolean;\n /** Return true when a cached value exists for the key resolved from the provided arguments. */\n has(...args: Parameters<F>): boolean;\n};\n\ntype Unary<T, R> = (arg: T) => R;\n\n/**\n * Return the received value unchanged.\n * Useful as a default mapper, placeholder callback, or neutral transform in a pipeline.\n *\n * @example\n * ```ts\n * identity(5); // 5\n *\n * const value = {name: \"commons\"};\n * identity(value) === value; // true\n * ```\n */\nexport function identity<T>(value: T): T {\n return value;\n}\n\n/**\n * Create a function that always returns the same value.\n *\n * @example\n * ```ts\n * const getAnswer = constant(42);\n *\n * getAnswer(); // 42\n * getAnswer(); // 42\n * ```\n */\nexport function constant<T>(value: T): () => T {\n return () => value;\n}\n\n/**\n * Do nothing and return undefined.\n * Useful as a safe default callback.\n *\n * @example\n * ```ts\n * const onComplete = options.onComplete ?? noop;\n * onComplete();\n * ```\n */\nexport function noop(): void {\n // Intentionally empty.\n}\n\n/**\n * Create a function that can be executed only once.\n * Later calls return the result from the first execution without calling the original function again.\n *\n * @example\n * ```ts\n * const initialize = once(() => ({connected: true}));\n *\n * const first = initialize();\n * const second = initialize();\n * first === second; // true\n * ```\n */\nexport function once<F extends AnyFunction>(fn: F): F {\n let called = false;\n let result: ReturnType<F>;\n\n return function (this: ThisParameterType<F>, ...args: Parameters<F>): ReturnType<F> {\n if (!called) {\n called = true;\n result = fn.apply(this, args);\n }\n return result;\n } as F;\n}\n\n/**\n * Cache the result of a function and reuse it for calls with the same resolved key.\n * By default, the first argument is used as the cache key.\n *\n * @example\n * ```ts\n * const double = memoize((value: number) => value * 2);\n *\n * double(4); // 8, computed\n * double(4); // 8, read from cache\n * double.has(4); // true\n * ```\n *\n * @example\n * ```ts\n * const sum = memoize(\n * (left: number, right: number) => left + right,\n * (left, right) => `${left}:${right}`,\n * );\n *\n * sum(2, 3); // 5\n * sum.delete(2, 3); // true\n * sum.clear();\n * ```\n */\nexport function memoize<F extends AnyFunction, K = Parameters<F>[0]>(\n fn: F,\n resolver?: (...args: Parameters<F>) => K,\n cache: Map<K, ReturnType<F>> = new Map<K, ReturnType<F>>()\n): MemoizedFunction<F, K> {\n const resolveKey = (...args: Parameters<F>): K => {\n if (resolver) return resolver(...args);\n return args[0] as K;\n };\n\n const memoized = function (this: ThisParameterType<F>, ...args: Parameters<F>): ReturnType<F> {\n const key = resolveKey(...args);\n if (cache.has(key)) {\n return cache.get(key)!;\n }\n\n const value = fn.apply(this, args);\n cache.set(key, value);\n return value;\n } as MemoizedFunction<F, K>;\n\n Object.defineProperty(memoized, \"cache\", {\n value: cache,\n enumerable: false,\n });\n\n memoized.clear = () => cache.clear();\n memoized.delete = (...args: Parameters<F>) => cache.delete(resolveKey(...args));\n memoized.has = (...args: Parameters<F>) => cache.has(resolveKey(...args));\n\n return memoized;\n}\n\n/**\n * Limit how often a function can run during a time window.\n * Calls made while the function is throttled can optionally be replayed once at the end with the latest arguments.\n *\n * @example\n * ```ts\n * const onScroll = throttle(() => {\n * console.log(window.scrollY);\n * }, 100);\n *\n * window.addEventListener(\"scroll\", onScroll);\n * ```\n *\n * @example\n * ```ts\n * const refresh = throttle(loadData, 500, {leading: false});\n *\n * refresh(); // scheduled instead of executed immediately\n * refresh.flush(); // execute the scheduled call now\n * ```\n */\nexport function throttle<F extends AnyFunction>(\n fn: F,\n wait: number,\n options: ThrottleOptions = {}\n): DeferredFunction<F> {\n const delay = normalizeDelay(wait);\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? true;\n\n let timer: TimerHandle | undefined;\n let lastArgs: Parameters<F> | undefined;\n let lastThis: ThisParameterType<F> | undefined;\n let lastInvokeTime = 0;\n let hasInvoked = false;\n let result: ReturnType<F> | undefined;\n\n const invoke = (time: number): ReturnType<F> => {\n const args = lastArgs!;\n const context = lastThis!;\n lastArgs = undefined;\n lastThis = undefined;\n hasInvoked = true;\n lastInvokeTime = time;\n result = fn.apply(context, args);\n return result as ReturnType<F>;\n };\n\n const expire = (): void => {\n timer = undefined;\n if (trailing && lastArgs) {\n invoke(Date.now());\n } else {\n lastArgs = undefined;\n lastThis = undefined;\n }\n };\n\n const throttled = function (this: ThisParameterType<F>, ...args: Parameters<F>): ReturnType<F> | undefined {\n const now = Date.now();\n lastArgs = args;\n lastThis = this;\n\n if (!hasInvoked) {\n if (leading) {\n return invoke(now);\n }\n hasInvoked = true;\n lastInvokeTime = now;\n }\n\n const remaining = delay - (now - lastInvokeTime);\n if (remaining <= 0 || remaining > delay) {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n return invoke(now);\n }\n\n if (timer === undefined && trailing) {\n timer = setTimeout(expire, remaining);\n }\n\n return result;\n } as DeferredFunction<F>;\n\n throttled.cancel = (): void => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n timer = undefined;\n lastArgs = undefined;\n lastThis = undefined;\n lastInvokeTime = 0;\n hasInvoked = false;\n };\n\n throttled.flush = (): ReturnType<F> | undefined => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n if (lastArgs && trailing) {\n return invoke(Date.now());\n }\n }\n return result;\n };\n\n throttled.pending = (): boolean => timer !== undefined;\n\n return throttled;\n}\n\n/**\n * Create a function with one or more arguments already provided.\n * Later arguments are appended after the preset arguments.\n *\n * @example\n * ```ts\n * const sum = (a: number, b: number, c: number) => a + b + c;\n * const addFive = partial(sum, 2, 3);\n *\n * addFive(4); // 9\n * ```\n */\nexport function partial<F extends AnyFunction>(\n fn: F,\n ...presetArgs: unknown[]\n): (...laterArgs: unknown[]) => ReturnType<F> {\n return function (this: ThisParameterType<F>, ...laterArgs: unknown[]): ReturnType<F> {\n return fn.apply(this, [...presetArgs, ...laterArgs] as Parameters<F>);\n };\n}\n\n/**\n * Compose unary functions from left to right.\n * The first function receives the original arguments, and each next function receives the previous result.\n *\n * @example\n * ```ts\n * const transform = pipe(\n * (value: number) => value + 1,\n * (value: number) => value * 2,\n * );\n *\n * transform(2); // 6\n * ```\n */\nexport function pipe<A, B>(ab: Unary<A, B>): Unary<A, B>;\nexport function pipe<A, B, C>(ab: Unary<A, B>, bc: Unary<B, C>): Unary<A, C>;\nexport function pipe<A, B, C, D>(ab: Unary<A, B>, bc: Unary<B, C>, cd: Unary<C, D>): Unary<A, D>;\nexport function pipe<A, B, C, D, E>(ab: Unary<A, B>, bc: Unary<B, C>, cd: Unary<C, D>, de: Unary<D, E>): Unary<A, E>;\nexport function pipe(...fns: AnyFunction[]): AnyFunction {\n return createFlow(fns);\n}\n\n/**\n * Compose unary functions from right to left.\n * The rightmost function receives the original arguments, and each function to its left receives the previous result.\n *\n * @example\n * ```ts\n * const transform = compose(\n * (value: number) => value + 1,\n * (value: number) => value * 2,\n * );\n *\n * transform(2); // 5\n * ```\n */\nexport function compose<A, B>(ab: Unary<A, B>): Unary<A, B>;\nexport function compose<A, B, C>(bc: Unary<B, C>, ab: Unary<A, B>): Unary<A, C>;\nexport function compose<A, B, C, D>(cd: Unary<C, D>, bc: Unary<B, C>, ab: Unary<A, B>): Unary<A, D>;\nexport function compose<A, B, C, D, E>(de: Unary<D, E>, cd: Unary<C, D>, bc: Unary<B, C>, ab: Unary<A, B>): Unary<A, E>;\nexport function compose(...fns: AnyFunction[]): AnyFunction {\n return createFlow(fns.slice().reverse());\n}\n\nfunction createFlow(fns: AnyFunction[]): AnyFunction {\n if (fns.length === 0) return identity;\n\n return function (this: any, ...args: any[]): unknown {\n let result = fns[0].apply(this, args);\n for (let i = 1; i < fns.length; i++) {\n result = fns[i].call(this, result);\n }\n return result;\n };\n}\n\nfunction normalizeDelay(wait: number): number {\n return Number.isFinite(wait) ? Math.max(0, wait) : 0;\n}"]}
@@ -15,6 +15,10 @@ export { default as Stopwatch } from './stopwatch.js';
15
15
  export type { Result } from './result.js';
16
16
  export { TimeTrigger, CountTrigger } from './triggers.js';
17
17
  export { default as AsyncPoolExecutor } from './async-pool-executor.js';
18
+ export { default as Debouncer } from './debouncer.js';
19
+ export type { DebouncedTask, DebouncerOptions } from './debouncer.js';
20
+ export { default as KeyedDebouncer } from './keyed-debouncer.js';
21
+ export type { KeyedDebouncerOptions } from './keyed-debouncer.js';
18
22
  export { default as Lazy } from './lazy.js';
19
23
  export { default as from } from './collections/from.js';
20
24
  export { EventBus, Event } from './event-bus.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAGnD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,WAAW,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AACxD,OAAO,EAAC,OAAO,IAAI,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAC,aAAa,EAAE,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAC,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAGhE,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAC,OAAO,IAAI,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAC7E,mBAAmB;AACnB,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAKxF,mBAAmB;AACnB,cAAc,YAAY,CAAC;AAC3B,mBAAmB;AACnB,cAAc,wBAAwB,CAAC"}
@@ -19,6 +19,8 @@ export { default as TimeSpan } from './timespan.js';
19
19
  export { default as Stopwatch } from './stopwatch.js';
20
20
  export { TimeTrigger, CountTrigger } from './triggers.js';
21
21
  export { default as AsyncPoolExecutor } from './async-pool-executor.js';
22
+ export { default as Debouncer } from './debouncer.js';
23
+ export { default as KeyedDebouncer } from './keyed-debouncer.js';
22
24
  // ─── Patterns ────────────────────────────────────────
23
25
  export { default as Lazy } from './lazy.js';
24
26
  export { default as from } from './collections/from.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,wDAAwD;AACxD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAEnD,wDAAwD;AACxD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAC,OAAO,IAAI,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAEvE,uDAAuD;AACvD,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAE5C,uDAAuD;AACvD,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAC,OAAO,IAAI,QAAQ,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAC,WAAW,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AACxD,OAAO,EAAC,OAAO,IAAI,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAG/D,wDAAwD;AACxD,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAE5C,qDAAqD;AACrD,OAAO,EAAC,OAAO,IAAI,KAAK,EAAC,MAAM,YAAY,CAAC;AAE5C,wDAAwD;AACxD,OAAO,EAAC,OAAO,IAAI,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAC7E,mBAAmB;AACnB,OAAO,EAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAIxF,wDAAwD;AACxD,mBAAmB;AACnB,cAAc,YAAY,CAAC;AAC3B,mBAAmB;AACnB,cAAc,wBAAwB,CAAC","sourcesContent":["// src/index.ts\n\n// ─── Types ───────────────────────────────────────────\nexport * from './types.js';\nexport {default as Type} from './type.js';\nexport {default as TypeCode} from './type-code.js';\n\n// ─── Utilities ───────────────────────────────────────\nexport * from './utilities.js';\nexport * from './functions.js';\nexport * from './string.js';\nexport * from './math.js';\nexport * from './parse.js';\nexport {default as CancellablePromise} from \"./cancellable-promise.js\";\n\n// ─── Data Structures ────────────────────────────────\nexport {default as KeyValuePair} from './key-value-pair.js';\nexport {default as Order} from './order.js';\n\n// ─── Async & Timing ─────────────────────────────────\nexport {default as Timer} from './timer.js';\nexport {default as TimeSpan} from './timespan.js';\nexport {default as Stopwatch} from './stopwatch.js';\nexport type {Result} from './result.js';\nexport {TimeTrigger, CountTrigger} from './triggers.js';\nexport {default as AsyncPoolExecutor} from './async-pool-executor.js';\nexport {default as Debouncer} from './debouncer.js';\nexport type {DebouncedTask, DebouncerOptions} from './debouncer.js';\nexport {default as KeyedDebouncer} from './keyed-debouncer.js';\nexport type {KeyedDebouncerOptions} from './keyed-debouncer.js';\n\n// ─── Patterns ────────────────────────────────────────\nexport {default as Lazy} from './lazy.js';\nexport {default as from} from './collections/from.js';\nexport {EventBus, Event} from './event-bus.js';\nexport {default as Range} from './range.js';\n\n// ─── Draft ────────────────────────────────────────\nexport {default as draft} from './draft.js';\n\n// ─── Web ─────────────────────────────────────────────\nexport {default as CleanURLSearchParams} from './clean-url-search-params.js';\n/** @deprecated */\nexport {ajaxSubmit, ajaxSubmission, submitForm, formToObject} from './browser/index.js';\n\n\n\n// ─── Deprecated ──────────────────────────────────────\n/** @deprecated */\nexport * from './array.js';\n/** @deprecated */\nexport * from './collections/index.js';"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-value-pair.d.ts","sourceRoot":"","sources":["../src/key-value-pair.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM;IAC1C,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,GAAG,IAAI,IAAI,CAEd;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;CAMvC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-value-pair.js","sourceRoot":"","sources":["../src/key-value-pair.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAKD,YAAY,GAAS,EAAE,KAAa;QAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;CAGJ","sourcesContent":["/**\n * Represents a pair of key and value.\n *\n * @template TKey The type of the key.\n * @template TValue The type of the value.\n */\nexport default class KeyValuePair<TKey, TValue> {\n get value(): TValue {\n return this._value;\n }\n\n get key(): TKey {\n return this._key;\n }\n\n private readonly _key: TKey;\n private readonly _value: TValue;\n\n constructor(key: TKey, value: TValue) {\n this._key = key;\n this._value = value;\n }\n\n\n}"]}
@@ -0,0 +1,56 @@
1
+ import { type DebouncedTask } from "./debouncer.js";
2
+ /** Options accepted by {@link KeyedDebouncer}. Every callback receives the affected key. */
3
+ export interface KeyedDebouncerOptions<K> {
4
+ /** Default wait, in milliseconds, before a task is executed. */
5
+ delayMs: number;
6
+ /** Called every time a task is scheduled for `key`, after any previous task of that key has been cancelled. */
7
+ onSchedule?: (key: K) => void;
8
+ /** Called when the wait elapses and the task of `key` is about to run. */
9
+ onStart?: (key: K) => void;
10
+ /** Called when the task of `key` completes without throwing and without being cancelled. */
11
+ onSuccess?: (key: K) => void;
12
+ /** Called when a live task of `key` is cancelled, either explicitly or by being replaced. */
13
+ onCancel?: (key: K) => void;
14
+ /** Receives task errors. Cancellations never reach this callback. Defaults to `console.error`. */
15
+ onError?: (error: unknown, key: K) => void;
16
+ /** Called when `key` has no more pending work, after it has been removed from the debouncer. */
17
+ onIdle?: (key: K) => void;
18
+ }
19
+ /**
20
+ * An independent {@link Debouncer} per key.
21
+ * Debouncers only exist for keys with pending work: each one is created when
22
+ * its first task is scheduled and removed as soon as it becomes idle.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * const debouncer = new KeyedDebouncer<string>({delayMs: 1500});
27
+ *
28
+ * debouncer.schedule(chatId, async (signal) => {
29
+ * const pending = await store.getPending(chatId);
30
+ * const reply = await callAI(pending, {signal});
31
+ * if (signal.aborted) return;
32
+ * await sendReply(chatId, reply);
33
+ * });
34
+ * ```
35
+ */
36
+ export default class KeyedDebouncer<K = string> {
37
+ #private;
38
+ constructor(options: KeyedDebouncerOptions<K>);
39
+ /** Number of keys with a task waiting or running. */
40
+ get size(): number;
41
+ /**
42
+ * Schedule `task` for `key`, cancelling any previous task of that key.
43
+ *
44
+ * @param key - The key whose task is replaced.
45
+ * @param task - The task to run once the delay elapses.
46
+ * @param delayMs - Wait for this task only. Defaults to the configured `delayMs`.
47
+ */
48
+ schedule(key: K, task: DebouncedTask, delayMs?: number): void;
49
+ /** Cancel the task of `key`, if any. */
50
+ cancel(key: K): void;
51
+ /** Cancel every task. Useful when shutting the process down. */
52
+ cancelAll(): void;
53
+ /** Whether a task is waiting or running for `key`. */
54
+ isPending(key: K): boolean;
55
+ }
56
+ //# sourceMappingURL=keyed-debouncer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyed-debouncer.d.ts","sourceRoot":"","sources":["../src/keyed-debouncer.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAmB,KAAK,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAG/E,4FAA4F;AAC5F,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,+GAA+G;IAC/G,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC3B,4FAA4F;IAC5F,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,kGAAkG;IAClG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC3C,gGAAgG;IAChG,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc,CAAC,CAAC,GAAG,MAAM;;gBAU9B,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAW7C,qDAAqD;IACrD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAc7D,wCAAwC;IACxC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI;IAIpB,gEAAgE;IAChE,SAAS,IAAI,IAAI;IAOjB,sDAAsD;IACtD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;CAqB7B"}
@@ -0,0 +1,109 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _KeyedDebouncer_instances, _KeyedDebouncer_debouncers, _KeyedDebouncer_delayMs, _KeyedDebouncer_onSchedule, _KeyedDebouncer_onStart, _KeyedDebouncer_onSuccess, _KeyedDebouncer_onCancel, _KeyedDebouncer_onError, _KeyedDebouncer_onIdle, _KeyedDebouncer_create;
13
+ import Debouncer, { assertValidDelay } from "./debouncer.js";
14
+ import { noop } from "./functions.js";
15
+ /**
16
+ * An independent {@link Debouncer} per key.
17
+ * Debouncers only exist for keys with pending work: each one is created when
18
+ * its first task is scheduled and removed as soon as it becomes idle.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const debouncer = new KeyedDebouncer<string>({delayMs: 1500});
23
+ *
24
+ * debouncer.schedule(chatId, async (signal) => {
25
+ * const pending = await store.getPending(chatId);
26
+ * const reply = await callAI(pending, {signal});
27
+ * if (signal.aborted) return;
28
+ * await sendReply(chatId, reply);
29
+ * });
30
+ * ```
31
+ */
32
+ class KeyedDebouncer {
33
+ constructor(options) {
34
+ _KeyedDebouncer_instances.add(this);
35
+ _KeyedDebouncer_debouncers.set(this, new Map());
36
+ _KeyedDebouncer_delayMs.set(this, void 0);
37
+ _KeyedDebouncer_onSchedule.set(this, void 0);
38
+ _KeyedDebouncer_onStart.set(this, void 0);
39
+ _KeyedDebouncer_onSuccess.set(this, void 0);
40
+ _KeyedDebouncer_onCancel.set(this, void 0);
41
+ _KeyedDebouncer_onError.set(this, void 0);
42
+ _KeyedDebouncer_onIdle.set(this, void 0);
43
+ assertValidDelay(options.delayMs);
44
+ __classPrivateFieldSet(this, _KeyedDebouncer_delayMs, options.delayMs, "f");
45
+ __classPrivateFieldSet(this, _KeyedDebouncer_onSchedule, options.onSchedule ?? noop, "f");
46
+ __classPrivateFieldSet(this, _KeyedDebouncer_onStart, options.onStart ?? noop, "f");
47
+ __classPrivateFieldSet(this, _KeyedDebouncer_onSuccess, options.onSuccess ?? noop, "f");
48
+ __classPrivateFieldSet(this, _KeyedDebouncer_onCancel, options.onCancel ?? noop, "f");
49
+ __classPrivateFieldSet(this, _KeyedDebouncer_onError, options.onError ?? console.error, "f");
50
+ __classPrivateFieldSet(this, _KeyedDebouncer_onIdle, options.onIdle ?? noop, "f");
51
+ }
52
+ /** Number of keys with a task waiting or running. */
53
+ get size() {
54
+ return __classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").size;
55
+ }
56
+ /**
57
+ * Schedule `task` for `key`, cancelling any previous task of that key.
58
+ *
59
+ * @param key - The key whose task is replaced.
60
+ * @param task - The task to run once the delay elapses.
61
+ * @param delayMs - Wait for this task only. Defaults to the configured `delayMs`.
62
+ */
63
+ schedule(key, task, delayMs) {
64
+ const existing = __classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").get(key);
65
+ if (existing !== undefined) {
66
+ existing.schedule(task, delayMs);
67
+ return;
68
+ }
69
+ // Validate first so an invalid delay never registers the key.
70
+ assertValidDelay(delayMs ?? __classPrivateFieldGet(this, _KeyedDebouncer_delayMs, "f"));
71
+ const debouncer = __classPrivateFieldGet(this, _KeyedDebouncer_instances, "m", _KeyedDebouncer_create).call(this, key);
72
+ __classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").set(key, debouncer);
73
+ debouncer.schedule(task, delayMs);
74
+ }
75
+ /** Cancel the task of `key`, if any. */
76
+ cancel(key) {
77
+ __classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").get(key)?.cancel();
78
+ }
79
+ /** Cancel every task. Useful when shutting the process down. */
80
+ cancelAll() {
81
+ // Copy first: cancelling removes the debouncer from the map.
82
+ for (const debouncer of [...__classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").values()]) {
83
+ debouncer.cancel();
84
+ }
85
+ }
86
+ /** Whether a task is waiting or running for `key`. */
87
+ isPending(key) {
88
+ return __classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").has(key);
89
+ }
90
+ }
91
+ _KeyedDebouncer_debouncers = new WeakMap(), _KeyedDebouncer_delayMs = new WeakMap(), _KeyedDebouncer_onSchedule = new WeakMap(), _KeyedDebouncer_onStart = new WeakMap(), _KeyedDebouncer_onSuccess = new WeakMap(), _KeyedDebouncer_onCancel = new WeakMap(), _KeyedDebouncer_onError = new WeakMap(), _KeyedDebouncer_onIdle = new WeakMap(), _KeyedDebouncer_instances = new WeakSet(), _KeyedDebouncer_create = function _KeyedDebouncer_create(key) {
92
+ const debouncer = new Debouncer({
93
+ delayMs: __classPrivateFieldGet(this, _KeyedDebouncer_delayMs, "f"),
94
+ onSchedule: () => __classPrivateFieldGet(this, _KeyedDebouncer_onSchedule, "f").call(this, key),
95
+ onStart: () => __classPrivateFieldGet(this, _KeyedDebouncer_onStart, "f").call(this, key),
96
+ onSuccess: () => __classPrivateFieldGet(this, _KeyedDebouncer_onSuccess, "f").call(this, key),
97
+ onCancel: () => __classPrivateFieldGet(this, _KeyedDebouncer_onCancel, "f").call(this, key),
98
+ onError: (error) => __classPrivateFieldGet(this, _KeyedDebouncer_onError, "f").call(this, error, key),
99
+ onIdle: () => {
100
+ if (__classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").get(key) === debouncer) {
101
+ __classPrivateFieldGet(this, _KeyedDebouncer_debouncers, "f").delete(key);
102
+ __classPrivateFieldGet(this, _KeyedDebouncer_onIdle, "f").call(this, key);
103
+ }
104
+ },
105
+ });
106
+ return debouncer;
107
+ };
108
+ export default KeyedDebouncer;
109
+ //# sourceMappingURL=keyed-debouncer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyed-debouncer.js","sourceRoot":"","sources":["../src/keyed-debouncer.ts"],"names":[],"mappings":"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","sourcesContent":["import Debouncer, {assertValidDelay, type DebouncedTask} from \"./debouncer.js\";\nimport {noop} from \"./functions.js\";\n\n/** Options accepted by {@link KeyedDebouncer}. Every callback receives the affected key. */\nexport interface KeyedDebouncerOptions<K> {\n /** Default wait, in milliseconds, before a task is executed. */\n delayMs: number;\n /** Called every time a task is scheduled for `key`, after any previous task of that key has been cancelled. */\n onSchedule?: (key: K) => void;\n /** Called when the wait elapses and the task of `key` is about to run. */\n onStart?: (key: K) => void;\n /** Called when the task of `key` completes without throwing and without being cancelled. */\n onSuccess?: (key: K) => void;\n /** Called when a live task of `key` is cancelled, either explicitly or by being replaced. */\n onCancel?: (key: K) => void;\n /** Receives task errors. Cancellations never reach this callback. Defaults to `console.error`. */\n onError?: (error: unknown, key: K) => void;\n /** Called when `key` has no more pending work, after it has been removed from the debouncer. */\n onIdle?: (key: K) => void;\n}\n\n/**\n * An independent {@link Debouncer} per key.\n * Debouncers only exist for keys with pending work: each one is created when\n * its first task is scheduled and removed as soon as it becomes idle.\n *\n * @example\n * ```ts\n * const debouncer = new KeyedDebouncer<string>({delayMs: 1500});\n *\n * debouncer.schedule(chatId, async (signal) => {\n * const pending = await store.getPending(chatId);\n * const reply = await callAI(pending, {signal});\n * if (signal.aborted) return;\n * await sendReply(chatId, reply);\n * });\n * ```\n */\nexport default class KeyedDebouncer<K = string> {\n readonly #debouncers = new Map<K, Debouncer>();\n readonly #delayMs: number;\n readonly #onSchedule: (key: K) => void;\n readonly #onStart: (key: K) => void;\n readonly #onSuccess: (key: K) => void;\n readonly #onCancel: (key: K) => void;\n readonly #onError: (error: unknown, key: K) => void;\n readonly #onIdle: (key: K) => void;\n\n constructor(options: KeyedDebouncerOptions<K>) {\n assertValidDelay(options.delayMs);\n this.#delayMs = options.delayMs;\n this.#onSchedule = options.onSchedule ?? noop;\n this.#onStart = options.onStart ?? noop;\n this.#onSuccess = options.onSuccess ?? noop;\n this.#onCancel = options.onCancel ?? noop;\n this.#onError = options.onError ?? console.error;\n this.#onIdle = options.onIdle ?? noop;\n }\n\n /** Number of keys with a task waiting or running. */\n get size(): number {\n return this.#debouncers.size;\n }\n\n /**\n * Schedule `task` for `key`, cancelling any previous task of that key.\n *\n * @param key - The key whose task is replaced.\n * @param task - The task to run once the delay elapses.\n * @param delayMs - Wait for this task only. Defaults to the configured `delayMs`.\n */\n schedule(key: K, task: DebouncedTask, delayMs?: number): void {\n const existing = this.#debouncers.get(key);\n if (existing !== undefined) {\n existing.schedule(task, delayMs);\n return;\n }\n\n // Validate first so an invalid delay never registers the key.\n assertValidDelay(delayMs ?? this.#delayMs);\n const debouncer = this.#create(key);\n this.#debouncers.set(key, debouncer);\n debouncer.schedule(task, delayMs);\n }\n\n /** Cancel the task of `key`, if any. */\n cancel(key: K): void {\n this.#debouncers.get(key)?.cancel();\n }\n\n /** Cancel every task. Useful when shutting the process down. */\n cancelAll(): void {\n // Copy first: cancelling removes the debouncer from the map.\n for (const debouncer of [...this.#debouncers.values()]) {\n debouncer.cancel();\n }\n }\n\n /** Whether a task is waiting or running for `key`. */\n isPending(key: K): boolean {\n return this.#debouncers.has(key);\n }\n\n #create(key: K): Debouncer {\n const debouncer: Debouncer = new Debouncer({\n delayMs: this.#delayMs,\n onSchedule: () => this.#onSchedule(key),\n onStart: () => this.#onStart(key),\n onSuccess: () => this.#onSuccess(key),\n onCancel: () => this.#onCancel(key),\n onError: (error) => this.#onError(error, key),\n onIdle: () => {\n if (this.#debouncers.get(key) === debouncer) {\n this.#debouncers.delete(key);\n this.#onIdle(key);\n }\n },\n });\n return debouncer;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../src/lazy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,QAAQ,EAAC,MAAM,YAAY,CAAC;AAGnD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;gBAEjC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAI/B,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,IAAW,KAAK,IAAI,CAAC,CAMpB;IAED,KAAK,IAAI,IAAI;CAIhB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.js","sourceRoot":"","sources":["../src/lazy.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,IAAI;IAKrB,YAAY,MAAmB;QAJvB,kBAAa,GAAG,KAAK,CAAC;QACtB,WAAM,GAAgB,IAAI,CAAC;QAI/B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAW,KAAK;QACZ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,MAAW,CAAC;IAC5B,CAAC;IAED,KAAK;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;CACJ","sourcesContent":["import type {Nullable, Supplier} from \"./types.js\";\n\n\n/**\n * Represents a lazy value that is created only when it is accessed for the first time.\n * @template T The type of the lazy value.\n */\nexport default class Lazy<T> {\n private _valueCreated = false;\n private _value: Nullable<T> = null;\n private readonly _factoryMethod: Supplier<T>;\n\n constructor(getter: Supplier<T>) {\n this._factoryMethod = getter;\n }\n\n get valueCreated(): boolean {\n return this._valueCreated;\n }\n\n public get value(): T {\n if (!this._valueCreated) {\n this._value = this._factoryMethod();\n this._valueCreated = true;\n }\n return this._value as T;\n }\n\n reset(): void {\n this._valueCreated = false;\n this._value = null;\n }\n}"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpG;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMjE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,KAAa,EAAE,KAAa,EAAE,MAAc,EAAE,MAAc;IACxF,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW;IACrD,IAAI,CAAC,IAAI,GAAG;QACR,OAAO,GAAG,CAAC;IACf,IAAI,CAAC,IAAI,GAAG;QACR,OAAO,GAAG,CAAC;IACf,OAAO,CAAC,CAAA;AACZ,CAAC","sourcesContent":["/**\n * Linearly interpolates a number between two ranges.\n *\n * @param {number} n - The number to interpolate.\n * @param {number} inMin - The minimum value of the input range.\n * @param {number} inMax - The maximum value of the input range.\n * @param {number} outMin - The minimum value of the output range.\n * @param {number} outMax - The maximum value of the output range.\n *\n * @return {number} - The interpolated value.\n */\nexport function lerp(n: number, inMin: number, inMax: number, outMin: number, outMax: number): number {\n if (inMax === inMin) {\n throw new Error(\"Input range cannot be zero\");\n }\n return outMin + (outMax - outMin) * ((n - inMin) / (inMax - inMin))\n}\n\n/**\n * Clamps a number between a minimum and maximum value.\n *\n * @param {number} n - The value to be clamped.\n * @param {number} min - The minimum value.\n * @param {number} max - The maximum value.\n * @return {number} The clamped value.\n */\nexport function clamp(n: number, min: number, max: number): number {\n if (n <= min)\n return min;\n if (n >= max)\n return max;\n return n\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":"AAAA,aAAK,KAAK;IACN,SAAS,QAAQ;IACjB,UAAU,SAAS;CACtB;AAED,eAAe,KAAK,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":"AAAA,IAAK,KAGJ;AAHD,WAAK,KAAK;IACN,0BAAiB,CAAA;IACjB,4BAAmB,CAAA;AACvB,CAAC,EAHI,KAAK,KAAL,KAAK,QAGT;AAED,eAAe,KAAK,CAAC","sourcesContent":["enum Order {\n Ascending = \"asc\",\n Descending = \"desc\"\n}\n\nexport default Order;"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IAE7B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AA0BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,mBAAwB,GAClC,MAAM,GAAG,IAAI,CAiBf;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,mBAAwB,GAClC,MAAM,GAAG,IAAI,CAwBf;AASD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EACnD,OAAO,GAAE,mBAAwB,GAClC,OAAO,GAAG,IAAI,CAsBhB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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","sourcesContent":["// parse.ts\n/**\n * Options for {@link parseBoolean}.\n */\nexport interface ParseBooleanOptions {\n /**\n * Additional strings to consider as `true`.\n * These are matched case-insensitively.\n * @example [\"oui\", \"ja\"]\n */\n extraTruthy?: string[];\n\n /**\n * Additional strings to consider as `false`.\n * These are matched case-insensitively.\n * @example [\"non\", \"nein\"]\n */\n extraFalsy?: string[];\n}\n\n/**\n * Options for {@link parseInteger}.\n */\nexport interface ParseIntegerOptions {\n /**\n * Numeric base for conversion.\n * @default 10\n */\n radix?: number;\n\n /**\n * Thousands separator to strip before parsing.\n * @example \".\" for \"1.234.567\" → 1234567\n * @example \",\" for \"1,234,567\" → 1234567\n */\n thousandsSeparator?: string;\n}\n\n/**\n * Options for {@link parseDecimal}.\n */\nexport interface ParseDecimalOptions {\n /**\n * Character used as decimal point.\n * @default \".\"\n */\n decimalSeparator?: \".\" | \",\";\n\n /**\n * Thousands separator to strip before parsing.\n * @example \".\" for \"1.234,56\" (EU format)\n * @example \",\" for \"1,234.56\" (US format)\n */\n thousandsSeparator?: string;\n}\n\n// ============================================\n// HELPERS\n// ============================================\n\nfunction stripThousands(value: string, separator?: string): string {\n if (!separator) return value;\n return value.split(separator).join(\"\");\n}\n\nfunction isValidInteger(value: string, radix: number): boolean {\n if (!Number.isInteger(radix) || radix < 2 || radix > 36) return false;\n\n const signless = value.replace(/^[+-]/, \"\");\n if (signless === \"\") return false;\n\n const digits = \"0123456789abcdefghijklmnopqrstuvwxyz\".slice(0, radix);\n\n return [...signless.toLowerCase()].every((char) => digits.includes(char));\n}\n\n// ============================================\n// parseInteger\n// ============================================\n\n/**\n * Safely parses a value into an integer.\n * Returns `null` if the value cannot be parsed.\n *\n * - `null` or `undefined` → `null`\n * - `number` → returned as-is (floats are truncated)\n * - `string` → parsed with the given options\n *\n * @param value - The value to parse.\n * @param options - Optional parsing configuration.\n * @returns The parsed integer, or `null` on failure.\n *\n * @example\n * ```ts\n * parseInteger(42) // 42\n * parseInteger(3.7) // 3\n * parseInteger(null) // null\n * parseInteger(undefined) // null\n * parseInteger(\"42\") // 42\n * parseInteger(\"1.234.567\", { thousandsSeparator: \".\" }) // 1234567\n * parseInteger(\"FF\", { radix: 16 }) // 255\n * parseInteger(\"abc\") // null\n * ```\n */\nexport function parseInteger(\n value: string | number | null | undefined,\n options: ParseIntegerOptions = {}\n): number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? Math.trunc(value) : null;\n }\n\n const { radix = 10, thousandsSeparator } = options;\n\n const cleaned = stripThousands(value.trim(), thousandsSeparator);\n\n if (cleaned === \"\") return null;\n if (!isValidInteger(cleaned, radix)) return null;\n\n const parsed = Number.parseInt(cleaned, radix);\n\n return Number.isNaN(parsed) ? null : parsed;\n}\n\n// ============================================\n// parseDecimal\n// ============================================\n\n/**\n * Safely parses a value into a floating-point number.\n * Returns `null` if the value cannot be parsed.\n *\n * - `null` or `undefined` → `null`\n * - `number` → returned as-is (if finite)\n * - `string` → parsed with the given options\n *\n * Supports custom decimal and thousands separators, making it suitable\n * for both US (`1,234.56`) and EU (`1.234,56`) number formats.\n *\n * @param value - The value to parse.\n * @param options - Optional parsing configuration.\n * @returns The parsed float, or `null` on failure.\n *\n * @example\n * ```ts\n * parseDecimal(3.14) // 3.14\n * parseDecimal(null) // null\n * parseDecimal(undefined) // null\n * parseDecimal(\"3.14\") // 3.14\n * parseDecimal(\"3,14\", { decimalSeparator: \",\" }) // 3.14\n * parseDecimal(\"1.234,56\", { decimalSeparator: \",\", thousandsSeparator: \".\" }) // 1234.56\n * parseDecimal(\"abc\") // null\n * ```\n */\nexport function parseDecimal(\n value: string | number | null | undefined,\n options: ParseDecimalOptions = {}\n): number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : null;\n }\n\n const { decimalSeparator = \".\", thousandsSeparator } = options;\n\n let cleaned = stripThousands(value.trim(), thousandsSeparator);\n\n if (cleaned === \"\") return null;\n\n if (decimalSeparator === \",\") {\n const commaCount = (cleaned.match(/,/g) || []).length;\n if (commaCount > 1) return null;\n cleaned = cleaned.replace(\",\", \".\");\n }\n\n if (!/^[+-]?\\d+(\\.\\d+)?$/.test(cleaned)) return null;\n\n const parsed = Number.parseFloat(cleaned);\n\n return Number.isNaN(parsed) || !Number.isFinite(parsed) ? null : parsed;\n}\n\n// ============================================\n// parseBoolean\n// ============================================\n\nconst DEFAULT_TRUTHY = [\"true\", \"1\", \"yes\", \"si\", \"sí\", \"on\"];\nconst DEFAULT_FALSY = [\"false\", \"0\", \"no\", \"off\"];\n\n/**\n * Safely parses a value into a boolean.\n * Returns `null` if the value cannot be interpreted as boolean.\n *\n * - `null` or `undefined` → `null`\n * - `boolean` → returned as-is\n * - `number` → `0` is `false`, any other finite number is `true`\n * - `string` → matched case-insensitively against known truthy/falsy values\n *\n * Default truthy: `\"true\"`, `\"1\"`, `\"yes\"`, `\"si\"`, `\"sí\"`, `\"on\"`\n * Default falsy: `\"false\"`, `\"0\"`, `\"no\"`, `\"off\"`\n *\n * @param value - The value to parse.\n * @param options - Optional parsing configuration.\n * @returns The parsed boolean, or `null` on failure.\n *\n * @example\n * ```ts\n * parseBoolean(true) // true\n * parseBoolean(false) // false\n * parseBoolean(1) // true\n * parseBoolean(0) // false\n * parseBoolean(null) // null\n * parseBoolean(undefined) // null\n * parseBoolean(\"yes\") // true\n * parseBoolean(\"no\") // false\n * parseBoolean(\"sí\") // true\n * parseBoolean(\"TRUE\") // true\n * parseBoolean(\"oui\") // null\n * parseBoolean(\"oui\", { extraTruthy: [\"oui\"] }) // true\n * parseBoolean(\"nein\", { extraFalsy: [\"nein\"] }) // false\n * parseBoolean(\"whatever\") // null\n * ```\n */\nexport function parseBoolean(\n value: string | number | boolean | null | undefined,\n options: ParseBooleanOptions = {}\n): boolean | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === \"boolean\") return value;\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value !== 0 : null;\n }\n\n const { extraTruthy = [], extraFalsy = [] } = options;\n\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"\") return null;\n\n const truthy = [...DEFAULT_TRUTHY, ...extraTruthy.map((s) => s.toLowerCase())];\n const falsy = [...DEFAULT_FALSY, ...extraFalsy.map((s) => s.toLowerCase())];\n\n if (truthy.includes(normalized)) return true;\n if (falsy.includes(normalized)) return false;\n\n return null;\n}"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IACrE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;AAE9B,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,IAChC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,GACzC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAGlD,wBAAgB,KAAK,CAAC,CAAC,SAAS,WAAW,CAAC,GAAG,CAAC,EAC5C,YAAY,EAAE,CAAC,EACf,GAAG,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAChC,GAAG,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAAC;AAE/C,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAClC,YAAY,EAAE,CAAC,EACf,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,GAClB,GAAG,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAAC;AAqC/C,wBAAgB,OAAO,CAAC,CAAC,SAAS,WAAW,CAAC,GAAG,CAAC,EAC9C,YAAY,EAAE,CAAC,EACf,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC,GACrD,IAAI,CAAC;AACR,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EACpC,YAAY,EAAE,CAAC,EACf,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC,GACrD,IAAI,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,UAAU,KAAK,CACjB,YAAiB,EACjB,GAAmB;IAEnB,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAE1F,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0C,CAAC;IACjE,MAAM,OAAO,GACT,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAQ,CAAC;IAEzE,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,UAAyB,GAAG,IAAe;YACtD,OAAQ,EAAU,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,IAAI,CAAC;YACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC/B,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,KAAK;aACpB,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC,CAAC,aAAa;QACvB,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,YAAiB,EAAE,OAAoD;IAC3F,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1F,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;oBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,aAAa;QACvB,CAAC;IACL,CAAC;AACL,CAAC","sourcesContent":["import type {Constructor} from \"./types.js\";\n\nexport type PureMethod<T extends object, A extends any[] = any[], R = any> =\n (obj: T, ...args: A) => R;\n\nexport type PatchSpec<T extends object> =\n | Record<string, PureMethod<T, any[], any>>\n | Map<PropertyKey, PureMethod<T, any[], any>>;\n\n\nexport function patch<C extends Constructor<any>>(\n targetOrCtor: C,\n fns: PatchSpec<InstanceType<C>>\n): Map<PropertyKey, PropertyDescriptor | null>;\n\nexport function patch<T extends object>(\n targetOrCtor: T,\n fns: PatchSpec<T>\n): Map<PropertyKey, PropertyDescriptor | null>;\n\n/**\n * Devuelve un Map donde:\n * - clave -> null (método añadido nuevo)\n * - clave -> descriptorOriginal (método sustituido)\n */\nexport function patch(\n targetOrCtor: any,\n fns: PatchSpec<any>\n): Map<PropertyKey, PropertyDescriptor | null> {\n const target = typeof targetOrCtor === \"function\" ? targetOrCtor.prototype : targetOrCtor;\n\n const result = new Map<PropertyKey, PropertyDescriptor | null>();\n const entries: Array<[PropertyKey, PureMethod<any>]> =\n fns instanceof Map ? [...fns.entries()] : Object.entries(fns) as any;\n\n for (const [key, fn] of entries) {\n const prev = Object.getOwnPropertyDescriptor(target, key);\n const method = function (this: unknown, ...args: unknown[]) {\n return (fn as any)(this, ...args);\n };\n try {\n Object.defineProperty(target, key, {\n value: method,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n result.set(key, prev ?? null);\n } catch { /* ignorar */\n }\n }\n return result;\n}\n\n// Overloads unpatch\nexport function unpatch<C extends Constructor<any>>(\n targetOrCtor: C,\n changes: Map<PropertyKey, PropertyDescriptor | null>\n): void;\nexport function unpatch<T extends object>(\n targetOrCtor: T,\n changes: Map<PropertyKey, PropertyDescriptor | null>\n): void;\n\n/**\n * Revierte un patch a partir del mapa devuelto por `patch`.\n */\nexport function unpatch(targetOrCtor: any, changes: Map<PropertyKey, PropertyDescriptor | null>): void {\n const target = typeof targetOrCtor === \"function\" ? targetOrCtor.prototype : targetOrCtor;\n for (const [key, prev] of changes) {\n try {\n if (prev === null) {\n if (Object.prototype.hasOwnProperty.call(target, key)) delete target[key];\n } else {\n Object.defineProperty(target, key, prev);\n }\n } catch { /* ignorar */\n }\n }\n}"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../src/range.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,KAAK,CAAC,CAAC;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAI;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAI;IAExB;;;;OAIG;gBACS,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAK5B;;;;;OAKG;IACI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;IAWlD;;;;;OAKG;IACI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE;IAoB5C;;;;;OAKG;IACI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO;IAWzC;;;;;;OAMG;IACI,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,GAAE,OAAc,GAAG,OAAO;IAM3D;;OAEG;IACI,QAAQ,IAAI,CAAC;IAIpB;;OAEG;IACI,MAAM,IAAI,CAAC;IAIlB;;;;;;OAMG;WACW,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE;IAatF;;;;;;OAMG;WACW,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO;IAW/E;;;;;;OAMG;WACW,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE;CAiBxF"}