@vinicunca/perkakas 1.12.0 → 1.13.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 (643) hide show
  1. package/dist/add-prop.d.cts +1 -1
  2. package/dist/add-prop.d.ts +1 -1
  3. package/dist/add-prop.js +1 -1
  4. package/dist/add.js +1 -1
  5. package/dist/all-pass.js +1 -1
  6. package/dist/any-pass.js +1 -1
  7. package/dist/{array-required-prefix-DxzEAAwi.d.cts → array-required-prefix-BFDM7eSS.d.cts} +8 -8
  8. package/dist/{array-required-prefix-DxzEAAwi.d.cts.map → array-required-prefix-BFDM7eSS.d.cts.map} +1 -1
  9. package/dist/{array-required-prefix-CefHtaKs.d.ts → array-required-prefix-DwpaLy0D.d.ts} +8 -8
  10. package/dist/{array-required-prefix-CefHtaKs.d.ts.map → array-required-prefix-DwpaLy0D.d.ts.map} +1 -1
  11. package/dist/{binary-search-cutoff-index-yQ2qcJHb.js → binary-search-cutoff-index-CN25H71A.js} +1 -1
  12. package/dist/{binary-search-cutoff-index-yQ2qcJHb.js.map → binary-search-cutoff-index-CN25H71A.js.map} +1 -1
  13. package/dist/{bounded-partial-DBIIClPU.d.ts → bounded-partial-CPc1XU57.d.ts} +2 -2
  14. package/dist/{bounded-partial-DBIIClPU.d.ts.map → bounded-partial-CPc1XU57.d.ts.map} +1 -1
  15. package/dist/{bounded-partial-D6ouPlXl.d.cts → bounded-partial-CtOsGqxa.d.cts} +2 -2
  16. package/dist/{bounded-partial-D6ouPlXl.d.cts.map → bounded-partial-CtOsGqxa.d.cts.map} +1 -1
  17. package/dist/capitalize.cjs +1 -0
  18. package/dist/capitalize.d.cts +53 -0
  19. package/dist/capitalize.d.cts.map +1 -0
  20. package/dist/capitalize.d.ts +53 -0
  21. package/dist/capitalize.d.ts.map +1 -0
  22. package/dist/capitalize.js +2 -0
  23. package/dist/capitalize.js.map +1 -0
  24. package/dist/ceil.js +1 -1
  25. package/dist/chunk.d.cts +6 -6
  26. package/dist/chunk.d.ts +6 -6
  27. package/dist/chunk.js +1 -1
  28. package/dist/clamp.js +1 -1
  29. package/dist/{clamped-integer-subtract-sK2BlhSm.d.ts → clamped-integer-subtract-C-AIuFhk.d.ts} +1 -1
  30. package/dist/{clamped-integer-subtract-sK2BlhSm.d.ts.map → clamped-integer-subtract-C-AIuFhk.d.ts.map} +1 -1
  31. package/dist/{clamped-integer-subtract-oLs8msYu.d.cts → clamped-integer-subtract-DueGS_u_.d.cts} +1 -1
  32. package/dist/{clamped-integer-subtract-oLs8msYu.d.cts.map → clamped-integer-subtract-DueGS_u_.d.cts.map} +1 -1
  33. package/dist/clone.js +1 -1
  34. package/dist/{coerced-array-DS7cKtbA.d.cts → coerced-array-BKR9Bvsl.d.cts} +1 -1
  35. package/dist/{coerced-array-DS7cKtbA.d.cts.map → coerced-array-BKR9Bvsl.d.cts.map} +1 -1
  36. package/dist/{coerced-array-1Xs4p4iF.d.ts → coerced-array-BfTLxqLo.d.ts} +1 -1
  37. package/dist/{coerced-array-1Xs4p4iF.d.ts.map → coerced-array-BfTLxqLo.d.ts.map} +1 -1
  38. package/dist/concat.d.cts +1 -1
  39. package/dist/concat.d.ts +1 -1
  40. package/dist/concat.js +1 -1
  41. package/dist/{conditional-tssGt6Vy.d.cts → conditional-Br0uqqc9.d.cts} +1 -1
  42. package/dist/{conditional-tssGt6Vy.d.cts.map → conditional-Br0uqqc9.d.cts.map} +1 -1
  43. package/dist/{conditional-F_nq8vtA.d.ts → conditional-CDez6uXp.d.ts} +1 -1
  44. package/dist/{conditional-F_nq8vtA.d.ts.map → conditional-CDez6uXp.d.ts.map} +1 -1
  45. package/dist/{conditional-lp8ZHACd.js → conditional-WbmvQs8H.js} +1 -1
  46. package/dist/{conditional-lp8ZHACd.js.map → conditional-WbmvQs8H.js.map} +1 -1
  47. package/dist/conditional.d.cts +1 -1
  48. package/dist/conditional.d.ts +1 -1
  49. package/dist/conditional.js +1 -1
  50. package/dist/count-by.d.cts +1 -1
  51. package/dist/count-by.d.ts +1 -1
  52. package/dist/count-by.js +1 -1
  53. package/dist/{curry-d8_p_Jzt.d.ts → curry-CKDQ1osk.d.ts} +4 -2
  54. package/dist/curry-CKDQ1osk.d.ts.map +1 -0
  55. package/dist/{curry-BcQ8Up1_.js → curry-NmniqyJ0.js} +2 -2
  56. package/dist/curry-NmniqyJ0.js.map +1 -0
  57. package/dist/{curry-from-lazy-CYtJvyas.js → curry-from-lazy-PQ0BbG-7.js} +2 -2
  58. package/dist/{curry-from-lazy-CYtJvyas.js.map → curry-from-lazy-PQ0BbG-7.js.map} +1 -1
  59. package/dist/{curry-B20xQM_9.d.cts → curry-mh6BKSIA.d.cts} +4 -2
  60. package/dist/curry-mh6BKSIA.d.cts.map +1 -0
  61. package/dist/{curry-order-rules-cezUWcSx.d.cts → curry-order-rules-BoF09Dq2.d.cts} +1 -1
  62. package/dist/{curry-order-rules-cezUWcSx.d.cts.map → curry-order-rules-BoF09Dq2.d.cts.map} +1 -1
  63. package/dist/{curry-order-rules-BCcwbNxd.d.ts → curry-order-rules-CoO4bk5I.d.ts} +1 -1
  64. package/dist/{curry-order-rules-BCcwbNxd.d.ts.map → curry-order-rules-CoO4bk5I.d.ts.map} +1 -1
  65. package/dist/{curry-order-rules-C6bwcUwC.js → curry-order-rules-DwrF-_P1.js} +1 -1
  66. package/dist/{curry-order-rules-C6bwcUwC.js.map → curry-order-rules-DwrF-_P1.js.map} +1 -1
  67. package/dist/curry.d.cts +1 -1
  68. package/dist/curry.d.ts +1 -1
  69. package/dist/curry.js +1 -1
  70. package/dist/debounce.d.cts +5 -3
  71. package/dist/debounce.d.cts.map +1 -1
  72. package/dist/debounce.d.ts +5 -3
  73. package/dist/debounce.d.ts.map +1 -1
  74. package/dist/debounce.js.map +1 -1
  75. package/dist/{deduped-CXeQa-0F.d.cts → deduped-DdwAYzXs.d.cts} +3 -3
  76. package/dist/{deduped-CXeQa-0F.d.cts.map → deduped-DdwAYzXs.d.cts.map} +1 -1
  77. package/dist/{deduped-CL5-bmYU.d.ts → deduped-RY-1u-ns.d.ts} +3 -3
  78. package/dist/{deduped-CL5-bmYU.d.ts.map → deduped-RY-1u-ns.d.ts.map} +1 -1
  79. package/dist/difference-with.js +1 -1
  80. package/dist/difference.js +1 -1
  81. package/dist/dist-8XtUY3ad.cjs +114 -0
  82. package/dist/dist-Bd1vawFi.js +103 -0
  83. package/dist/dist-Bd1vawFi.js.map +1 -0
  84. package/dist/divide.js +1 -1
  85. package/dist/drop-first-by.d.cts +2 -2
  86. package/dist/drop-first-by.d.ts +2 -2
  87. package/dist/drop-first-by.js +1 -1
  88. package/dist/drop-last-while.d.cts +1 -1
  89. package/dist/drop-last-while.d.ts +1 -1
  90. package/dist/drop-last-while.js +1 -1
  91. package/dist/drop-last.d.cts +1 -1
  92. package/dist/drop-last.d.ts +1 -1
  93. package/dist/drop-last.js +1 -1
  94. package/dist/drop-while.d.cts +1 -1
  95. package/dist/drop-while.d.ts +1 -1
  96. package/dist/drop-while.js +1 -1
  97. package/dist/drop.d.cts +5 -5
  98. package/dist/drop.d.ts +5 -5
  99. package/dist/drop.js +1 -1
  100. package/dist/entries.d.cts +1 -1
  101. package/dist/entries.d.ts +1 -1
  102. package/dist/entries.js +1 -1
  103. package/dist/{enumerable-string-key-of-DMAkBhMk.d.ts → enumerable-string-key-of-CZQf3ld_.d.ts} +2 -2
  104. package/dist/{enumerable-string-key-of-DMAkBhMk.d.ts.map → enumerable-string-key-of-CZQf3ld_.d.ts.map} +1 -1
  105. package/dist/{enumerable-string-key-of-FUg082M_.d.cts → enumerable-string-key-of-DhcNc5iz.d.cts} +2 -2
  106. package/dist/{enumerable-string-key-of-FUg082M_.d.cts.map → enumerable-string-key-of-DhcNc5iz.d.cts.map} +1 -1
  107. package/dist/{enumerable-string-keyed-value-of-B2F2aTB7.d.ts → enumerable-string-keyed-value-of-CRlVAvdp.d.ts} +1 -1
  108. package/dist/{enumerable-string-keyed-value-of-B2F2aTB7.d.ts.map → enumerable-string-keyed-value-of-CRlVAvdp.d.ts.map} +1 -1
  109. package/dist/{enumerable-string-keyed-value-of-CEclDoqe.d.cts → enumerable-string-keyed-value-of-icm2q60J.d.cts} +1 -1
  110. package/dist/{enumerable-string-keyed-value-of-CEclDoqe.d.cts.map → enumerable-string-keyed-value-of-icm2q60J.d.cts.map} +1 -1
  111. package/dist/evolve.d.cts +1 -1
  112. package/dist/evolve.d.ts +1 -1
  113. package/dist/evolve.js +1 -1
  114. package/dist/filter.d.cts +2 -2
  115. package/dist/filter.d.ts +2 -2
  116. package/dist/filter.js +1 -1
  117. package/dist/filtered-array-C--8loav.d.cts +22 -0
  118. package/dist/filtered-array-C--8loav.d.cts.map +1 -0
  119. package/dist/filtered-array-wtIEwdU7.d.ts +22 -0
  120. package/dist/filtered-array-wtIEwdU7.d.ts.map +1 -0
  121. package/dist/find-index.js +1 -1
  122. package/dist/find-last-index.js +1 -1
  123. package/dist/find-last.js +1 -1
  124. package/dist/find.js +1 -1
  125. package/dist/first-by.d.cts +3 -3
  126. package/dist/first-by.d.ts +3 -3
  127. package/dist/first-by.js +1 -1
  128. package/dist/first.d.cts +1 -1
  129. package/dist/first.d.ts +1 -1
  130. package/dist/first.js +1 -1
  131. package/dist/flat-map.js +1 -1
  132. package/dist/flat.d.cts +1 -1
  133. package/dist/flat.d.ts +1 -1
  134. package/dist/flat.js +1 -1
  135. package/dist/floor.js +1 -1
  136. package/dist/for-each-obj.d.cts +2 -2
  137. package/dist/for-each-obj.d.ts +2 -2
  138. package/dist/for-each-obj.js +1 -1
  139. package/dist/for-each.d.cts +1 -1
  140. package/dist/for-each.d.ts +1 -1
  141. package/dist/for-each.js +1 -1
  142. package/dist/from-entries.d.cts +2 -2
  143. package/dist/from-entries.d.ts +2 -2
  144. package/dist/from-entries.js +1 -1
  145. package/dist/from-keys.d.cts +2 -2
  146. package/dist/from-keys.d.ts +2 -2
  147. package/dist/from-keys.js +1 -1
  148. package/dist/funnel.d.cts.map +1 -1
  149. package/dist/funnel.d.ts.map +1 -1
  150. package/dist/funnel.lodash-debounce-with-cached-value.test.cjs +1 -1
  151. package/dist/funnel.lodash-debounce-with-cached-value.test.js +1 -1
  152. package/dist/funnel.lodash-debounce-with-cached-value.test.js.map +1 -1
  153. package/dist/funnel.lodash-debounce.test.cjs +1 -1
  154. package/dist/funnel.lodash-debounce.test.js +1 -1
  155. package/dist/funnel.lodash-throttle-with-cached-value.test.cjs +1 -1
  156. package/dist/funnel.lodash-throttle-with-cached-value.test.js +1 -1
  157. package/dist/funnel.lodash-throttle-with-cached-value.test.js.map +1 -1
  158. package/dist/funnel.lodash-throttle.test.cjs +1 -1
  159. package/dist/funnel.lodash-throttle.test.js +1 -1
  160. package/dist/funnel.perkakas-debounce.test.cjs +1 -1
  161. package/dist/funnel.perkakas-debounce.test.js +1 -1
  162. package/dist/funnel.perkakas-debounce.test.js.map +1 -1
  163. package/dist/funnel.reference-batch.test.cjs +1 -1
  164. package/dist/funnel.reference-batch.test.js +1 -1
  165. package/dist/funnel.reference-batch.test.js.map +1 -1
  166. package/dist/funnel.test-d.cjs +1 -1
  167. package/dist/funnel.test-d.js +1 -1
  168. package/dist/funnel.test.cjs +1 -1
  169. package/dist/funnel.test.js +1 -1
  170. package/dist/funnel.test.js.map +1 -1
  171. package/dist/group-by-prop.d.cts +10 -10
  172. package/dist/group-by-prop.d.ts +10 -10
  173. package/dist/group-by-prop.js +1 -1
  174. package/dist/group-by-prop.js.map +1 -1
  175. package/dist/group-by.d.cts +2 -2
  176. package/dist/group-by.d.ts +2 -2
  177. package/dist/group-by.js +1 -1
  178. package/dist/has-at-least-Coy9sM-B.js +2 -0
  179. package/dist/{has-at-least-DyIhWZJH.js.map → has-at-least-Coy9sM-B.js.map} +1 -1
  180. package/dist/has-at-least.d.cts +2 -2
  181. package/dist/has-at-least.d.ts +2 -2
  182. package/dist/has-at-least.js +1 -1
  183. package/dist/has-sub-object.js +1 -1
  184. package/dist/{heap-bARaRULU.js → heap-BhpfhYWj.js} +2 -2
  185. package/dist/{heap-bARaRULU.js.map → heap-BhpfhYWj.js.map} +1 -1
  186. package/dist/index-by.d.cts +1 -1
  187. package/dist/index-by.d.ts +1 -1
  188. package/dist/index-by.js +1 -1
  189. package/dist/index.cjs +1 -1
  190. package/dist/index.d.cts +12 -14
  191. package/dist/index.d.cts.map +1 -1
  192. package/dist/index.d.ts +12 -14
  193. package/dist/index.d.ts.map +1 -1
  194. package/dist/index.js +1 -1
  195. package/dist/index.js.map +1 -1
  196. package/dist/{int-range-inclusive-ClGdUant.d.ts → int-range-inclusive-BlGXX6Cz.d.ts} +1 -1
  197. package/dist/{int-range-inclusive-ClGdUant.d.ts.map → int-range-inclusive-BlGXX6Cz.d.ts.map} +1 -1
  198. package/dist/{int-range-inclusive-q-Jb7w6P.d.cts → int-range-inclusive-KocNpK0p.d.cts} +1 -1
  199. package/dist/{int-range-inclusive-q-Jb7w6P.d.cts.map → int-range-inclusive-KocNpK0p.d.cts.map} +1 -1
  200. package/dist/intersection-with.js +1 -1
  201. package/dist/intersection.js +1 -1
  202. package/dist/invert.d.cts +1 -1
  203. package/dist/invert.d.ts +1 -1
  204. package/dist/invert.js +1 -1
  205. package/dist/is-array.d.cts +1 -1
  206. package/dist/is-array.d.ts +1 -1
  207. package/dist/is-big-int.d.cts +1 -1
  208. package/dist/is-big-int.d.ts +1 -1
  209. package/dist/is-boolean.d.cts +1 -1
  210. package/dist/is-boolean.d.ts +1 -1
  211. package/dist/{is-bounded-record-BGclJjRX.d.ts → is-bounded-record-Bx4n8QB0.d.ts} +1 -1
  212. package/dist/{is-bounded-record-BGclJjRX.d.ts.map → is-bounded-record-Bx4n8QB0.d.ts.map} +1 -1
  213. package/dist/{is-bounded-record-D9YK_OC8.d.cts → is-bounded-record-DV6ZQk9H.d.cts} +1 -1
  214. package/dist/{is-bounded-record-D9YK_OC8.d.cts.map → is-bounded-record-DV6ZQk9H.d.cts.map} +1 -1
  215. package/dist/is-deep-equal.js +1 -1
  216. package/dist/is-empty.d.cts +1 -1
  217. package/dist/is-empty.d.ts +1 -1
  218. package/dist/{is-emptyish-CIxZzxxz.d.ts → is-emptyish-9tX94IVx.d.cts} +2 -3
  219. package/dist/is-emptyish-9tX94IVx.d.cts.map +1 -0
  220. package/dist/{is-emptyish-oX5mpcfW.d.cts → is-emptyish-DVFGJe-T.d.ts} +2 -3
  221. package/dist/is-emptyish-DVFGJe-T.d.ts.map +1 -0
  222. package/dist/is-emptyish.d.cts +1 -1
  223. package/dist/is-emptyish.d.ts +1 -1
  224. package/dist/is-emptyish.js.map +1 -1
  225. package/dist/is-emptyish.test-d.cjs +1 -1
  226. package/dist/is-emptyish.test-d.js +1 -1
  227. package/dist/is-emptyish.test.cjs +1 -1
  228. package/dist/is-emptyish.test.js +1 -1
  229. package/dist/is-function.d.cts +5 -2
  230. package/dist/is-function.d.cts.map +1 -1
  231. package/dist/is-function.d.ts +5 -2
  232. package/dist/is-function.d.ts.map +1 -1
  233. package/dist/is-function.js.map +1 -1
  234. package/dist/is-included-in.d.cts +2 -3
  235. package/dist/is-included-in.d.cts.map +1 -1
  236. package/dist/is-included-in.d.ts +2 -3
  237. package/dist/is-included-in.d.ts.map +1 -1
  238. package/dist/is-included-in.js.map +1 -1
  239. package/dist/is-nullish.d.cts +1 -1
  240. package/dist/is-nullish.d.ts +1 -1
  241. package/dist/is-number.d.cts +1 -1
  242. package/dist/is-number.d.ts +1 -1
  243. package/dist/is-object-type.d.cts +1 -1
  244. package/dist/is-object-type.d.ts +1 -1
  245. package/dist/is-plain-object.d.cts +1 -1
  246. package/dist/is-plain-object.d.ts +1 -1
  247. package/dist/is-shallow-equal.js +1 -1
  248. package/dist/is-strict-equal.js +1 -1
  249. package/dist/is-string.d.cts +1 -1
  250. package/dist/is-string.d.ts +1 -1
  251. package/dist/is-symbol.d.cts +1 -1
  252. package/dist/is-symbol.d.ts +1 -1
  253. package/dist/{iterable-container-OFsaw8WL.d.cts → iterable-container-1TN3AJ3s.d.cts} +1 -1
  254. package/dist/{iterable-container-OFsaw8WL.d.cts.map → iterable-container-1TN3AJ3s.d.cts.map} +1 -1
  255. package/dist/{iterable-container-BdjPuIjL.d.ts → iterable-container-Dv5vSKht.d.ts} +1 -1
  256. package/dist/iterable-container-Dv5vSKht.d.ts.map +1 -0
  257. package/dist/join.js +1 -1
  258. package/dist/keys.d.cts +3 -3
  259. package/dist/keys.d.ts +3 -3
  260. package/dist/keys.js +1 -1
  261. package/dist/last.d.cts +1 -1
  262. package/dist/last.d.ts +1 -1
  263. package/dist/last.js +1 -1
  264. package/dist/{lazy-data-last-impl-DW5TXWv8.js → lazy-data-last-impl-R05wr4K6.js} +1 -1
  265. package/dist/lazy-data-last-impl-R05wr4K6.js.map +1 -0
  266. package/dist/length.js +1 -1
  267. package/dist/{magic-string.es-BY9a6RR2.js → magic-string.es-94aXgwpn.js} +1 -1
  268. package/dist/{magic-string.es-BY9a6RR2.js.map → magic-string.es-94aXgwpn.js.map} +1 -1
  269. package/dist/map-keys.d.cts +3 -3
  270. package/dist/map-keys.d.ts +3 -3
  271. package/dist/map-keys.js +1 -1
  272. package/dist/map-to-obj.js +1 -1
  273. package/dist/map-values.d.cts +2 -2
  274. package/dist/map-values.d.ts +2 -2
  275. package/dist/map-values.js +1 -1
  276. package/dist/map-with-feedback.d.cts +2 -2
  277. package/dist/map-with-feedback.d.ts +2 -2
  278. package/dist/map-with-feedback.js +1 -1
  279. package/dist/map.d.cts +2 -2
  280. package/dist/map.d.ts +2 -2
  281. package/dist/map.js +1 -1
  282. package/dist/{mapped-LCblUtt3.d.ts → mapped-BbrC9t3s.d.ts} +2 -2
  283. package/dist/mapped-BbrC9t3s.d.ts.map +1 -0
  284. package/dist/{mapped-m3FRlUOA.d.cts → mapped-CkRNfTnY.d.cts} +2 -2
  285. package/dist/mapped-CkRNfTnY.d.cts.map +1 -0
  286. package/dist/mean-by.js +1 -1
  287. package/dist/{merge-all-CW8DGAy8.d.cts → merge-all-CISawx-J.d.cts} +4 -4
  288. package/dist/{merge-all-CW8DGAy8.d.cts.map → merge-all-CISawx-J.d.cts.map} +1 -1
  289. package/dist/{merge-all-B9JBhVzy.d.ts → merge-all-DJ6n7R1b.d.ts} +4 -4
  290. package/dist/{merge-all-B9JBhVzy.d.ts.map → merge-all-DJ6n7R1b.d.ts.map} +1 -1
  291. package/dist/merge-all.d.cts +1 -1
  292. package/dist/merge-all.d.ts +1 -1
  293. package/dist/merge-deep.js +1 -1
  294. package/dist/merge.js +1 -1
  295. package/dist/multiply.js +1 -1
  296. package/dist/{n-tuple-Bu1e7UH_.d.cts → n-tuple-BkMobYQ9.d.cts} +1 -1
  297. package/dist/{n-tuple-Bu1e7UH_.d.cts.map → n-tuple-BkMobYQ9.d.cts.map} +1 -1
  298. package/dist/{n-tuple-DoE0z7Kl.d.ts → n-tuple-zo5g_mSL.d.ts} +1 -1
  299. package/dist/{n-tuple-DoE0z7Kl.d.ts.map → n-tuple-zo5g_mSL.d.ts.map} +1 -1
  300. package/dist/{narrowed-to-j75i8Rl2.d.ts → narrowed-to-B7tkuY2k.d.ts} +1 -1
  301. package/dist/{narrowed-to-j75i8Rl2.d.ts.map → narrowed-to-B7tkuY2k.d.ts.map} +1 -1
  302. package/dist/{narrowed-to-Yf5qTOcD.d.cts → narrowed-to-D_6H-aZW.d.cts} +1 -1
  303. package/dist/{narrowed-to-Yf5qTOcD.d.cts.map → narrowed-to-D_6H-aZW.d.cts.map} +1 -1
  304. package/dist/{non-empty-array-DXkY7ynY.d.ts → non-empty-array-DHAKSw6t.d.ts} +1 -1
  305. package/dist/non-empty-array-DHAKSw6t.d.ts.map +1 -0
  306. package/dist/{non-empty-array-CFG7wGD-.d.cts → non-empty-array-NDjbHRjk.d.cts} +1 -1
  307. package/dist/non-empty-array-NDjbHRjk.d.cts.map +1 -0
  308. package/dist/{nth-by-Bs6FNGL-.js → nth-by-JP3-Htbo.js} +2 -2
  309. package/dist/{nth-by-Bs6FNGL-.js.map → nth-by-JP3-Htbo.js.map} +1 -1
  310. package/dist/nth-by.d.cts +3 -3
  311. package/dist/nth-by.d.ts +3 -3
  312. package/dist/nth-by.js +1 -1
  313. package/dist/obj-of.js +1 -1
  314. package/dist/omit-DI8DRDHj.d.ts +71 -0
  315. package/dist/omit-DI8DRDHj.d.ts.map +1 -0
  316. package/dist/omit-DQiCiWAg.d.cts +71 -0
  317. package/dist/omit-DQiCiWAg.d.cts.map +1 -0
  318. package/dist/omit-by.d.cts +3 -3
  319. package/dist/omit-by.d.ts +3 -3
  320. package/dist/omit-by.js +1 -1
  321. package/dist/omit.d.cts +2 -29
  322. package/dist/omit.d.ts +2 -29
  323. package/dist/omit.js +1 -1
  324. package/dist/omit.js.map +1 -1
  325. package/dist/only.d.cts +1 -1
  326. package/dist/only.d.ts +1 -1
  327. package/dist/only.js +1 -1
  328. package/dist/optional-options-with-defaults-BFaBSKkF.d.ts +12 -0
  329. package/dist/optional-options-with-defaults-BFaBSKkF.d.ts.map +1 -0
  330. package/dist/optional-options-with-defaults-BZVW8GfC.d.cts +12 -0
  331. package/dist/optional-options-with-defaults-BZVW8GfC.d.cts.map +1 -0
  332. package/dist/{partial-array-CoV_xxyQ.d.cts → partial-array-CQF5oggb.d.cts} +1 -1
  333. package/dist/partial-array-CQF5oggb.d.cts.map +1 -0
  334. package/dist/{partial-array-CeoXpbZU.d.ts → partial-array-DU-2Vkyx.d.ts} +1 -1
  335. package/dist/partial-array-DU-2Vkyx.d.ts.map +1 -0
  336. package/dist/partition-by-union-BztEpKVh.d.cts +20 -0
  337. package/dist/partition-by-union-BztEpKVh.d.cts.map +1 -0
  338. package/dist/partition-by-union-DnfiiEMU.d.ts +20 -0
  339. package/dist/partition-by-union-DnfiiEMU.d.ts.map +1 -0
  340. package/dist/partition.js +1 -1
  341. package/dist/path-or.js +1 -1
  342. package/dist/{perkakas-type-error-DmmsEmEF.d.ts → perkakas-type-error-B9ULNhW0.d.ts} +1 -1
  343. package/dist/{perkakas-type-error-DmmsEmEF.d.ts.map → perkakas-type-error-B9ULNhW0.d.ts.map} +1 -1
  344. package/dist/{perkakas-type-error-BERl_sWR.d.cts → perkakas-type-error-ClCCHBW1.d.cts} +1 -1
  345. package/dist/{perkakas-type-error-BERl_sWR.d.cts.map → perkakas-type-error-ClCCHBW1.d.cts.map} +1 -1
  346. package/dist/pick-by.d.cts +4 -4
  347. package/dist/pick-by.d.cts.map +1 -1
  348. package/dist/pick-by.d.ts +4 -4
  349. package/dist/pick-by.d.ts.map +1 -1
  350. package/dist/pick-by.js +1 -1
  351. package/dist/pick-by.js.map +1 -1
  352. package/dist/pick.d.cts +4 -15
  353. package/dist/pick.d.cts.map +1 -1
  354. package/dist/pick.d.ts +4 -15
  355. package/dist/pick.d.ts.map +1 -1
  356. package/dist/pick.js +1 -1
  357. package/dist/pick.js.map +1 -1
  358. package/dist/{pipe-BGazHnZ_.js → pipe-CZKusDA-.js} +2 -2
  359. package/dist/pipe-CZKusDA-.js.map +1 -0
  360. package/dist/pipe.d.cts +95 -23
  361. package/dist/pipe.d.cts.map +1 -1
  362. package/dist/pipe.d.ts +95 -23
  363. package/dist/pipe.d.ts.map +1 -1
  364. package/dist/pipe.js +1 -1
  365. package/dist/piped.js +1 -1
  366. package/dist/product.d.cts +2 -2
  367. package/dist/product.d.ts +2 -2
  368. package/dist/product.js +1 -1
  369. package/dist/product.js.map +1 -1
  370. package/dist/{prop-DulcbWGG.d.ts → prop-D-4cFXSd.d.cts} +5 -6
  371. package/dist/prop-D-4cFXSd.d.cts.map +1 -0
  372. package/dist/{prop-C3rYih5m.d.cts → prop-DL-oRBeN.d.ts} +5 -6
  373. package/dist/prop-DL-oRBeN.d.ts.map +1 -0
  374. package/dist/prop.d.cts +1 -1
  375. package/dist/prop.d.ts +1 -1
  376. package/dist/prop.js.map +1 -1
  377. package/dist/pull-object.d.cts +2 -2
  378. package/dist/pull-object.d.ts +2 -2
  379. package/dist/pull-object.js +1 -1
  380. package/dist/random-integer.d.cts +1 -1
  381. package/dist/random-integer.d.ts +1 -1
  382. package/dist/random-string.js +1 -1
  383. package/dist/range.js +1 -1
  384. package/dist/rank-by.d.cts +2 -2
  385. package/dist/rank-by.d.ts +2 -2
  386. package/dist/rank-by.js +1 -1
  387. package/dist/reduce.js +1 -1
  388. package/dist/{reordered-array-B2klHneX.d.ts → reordered-array-BWG6tVSK.d.ts} +2 -2
  389. package/dist/reordered-array-BWG6tVSK.d.ts.map +1 -0
  390. package/dist/{reordered-array-BsUBOnYh.d.cts → reordered-array-CmReuxDi.d.cts} +2 -2
  391. package/dist/reordered-array-CmReuxDi.d.cts.map +1 -0
  392. package/dist/reverse.js +1 -1
  393. package/dist/round.js +1 -1
  394. package/dist/sample.d.cts +5 -5
  395. package/dist/sample.d.ts +5 -5
  396. package/dist/sample.js +1 -1
  397. package/dist/set-path.d.cts +1 -1
  398. package/dist/set-path.d.ts +1 -1
  399. package/dist/set-path.js +1 -1
  400. package/dist/set.d.cts +1 -1
  401. package/dist/set.d.ts +1 -1
  402. package/dist/set.js +1 -1
  403. package/dist/shuffle.d.cts +2 -2
  404. package/dist/shuffle.d.ts +2 -2
  405. package/dist/shuffle.js +1 -1
  406. package/dist/sort-by.d.cts +4 -4
  407. package/dist/sort-by.d.ts +4 -4
  408. package/dist/sort-by.js +1 -1
  409. package/dist/sort.d.cts +2 -2
  410. package/dist/sort.d.ts +2 -2
  411. package/dist/sort.js +1 -1
  412. package/dist/sorted-index-by.js +1 -1
  413. package/dist/sorted-index-with.js +1 -1
  414. package/dist/sorted-index.js +1 -1
  415. package/dist/sorted-last-index-by.js +1 -1
  416. package/dist/sorted-last-index.js +1 -1
  417. package/dist/splice.js +1 -1
  418. package/dist/split-at.js +1 -1
  419. package/dist/split-when.js +1 -1
  420. package/dist/split.d.cts +8 -8
  421. package/dist/split.d.cts.map +1 -1
  422. package/dist/split.d.ts +8 -8
  423. package/dist/split.d.ts.map +1 -1
  424. package/dist/split.js.map +1 -1
  425. package/dist/strict-function-BBgKFNUw.d.ts +26 -0
  426. package/dist/strict-function-BBgKFNUw.d.ts.map +1 -0
  427. package/dist/strict-function-CPTwDgnZ.d.cts +26 -0
  428. package/dist/strict-function-CPTwDgnZ.d.cts.map +1 -0
  429. package/dist/subtract.js +1 -1
  430. package/dist/sum-by.d.cts +1 -1
  431. package/dist/sum-by.d.ts +1 -1
  432. package/dist/sum-by.js +1 -1
  433. package/dist/sum.d.cts +1 -1
  434. package/dist/sum.d.ts +1 -1
  435. package/dist/sum.js +1 -1
  436. package/dist/{swap-in-place-COm7qHj4.js → swap-in-place-C_jXKHuD.js} +1 -1
  437. package/dist/{swap-in-place-COm7qHj4.js.map → swap-in-place-C_jXKHuD.js.map} +1 -1
  438. package/dist/swap-indices.d.cts +1 -1
  439. package/dist/swap-indices.d.ts +1 -1
  440. package/dist/swap-indices.js +1 -1
  441. package/dist/swap-props.js +1 -1
  442. package/dist/take-first-by.d.cts +2 -2
  443. package/dist/take-first-by.d.ts +2 -2
  444. package/dist/take-first-by.js +1 -1
  445. package/dist/take-last-while.d.cts +1 -1
  446. package/dist/take-last-while.d.ts +1 -1
  447. package/dist/take-last-while.js +1 -1
  448. package/dist/take-last.d.cts +1 -1
  449. package/dist/take-last.d.ts +1 -1
  450. package/dist/take-last.js +1 -1
  451. package/dist/take-while.d.cts +1 -1
  452. package/dist/take-while.d.ts +1 -1
  453. package/dist/take-while.js +1 -1
  454. package/dist/take.d.cts +1 -1
  455. package/dist/take.d.ts +1 -1
  456. package/dist/take.js +1 -1
  457. package/dist/tap.js +1 -1
  458. package/dist/times.js +1 -1
  459. package/dist/to-camel-case.cjs +1 -1
  460. package/dist/to-camel-case.d.cts +72 -20
  461. package/dist/to-camel-case.d.cts.map +1 -1
  462. package/dist/to-camel-case.d.ts +72 -20
  463. package/dist/to-camel-case.d.ts.map +1 -1
  464. package/dist/to-camel-case.js +1 -1
  465. package/dist/to-camel-case.js.map +1 -1
  466. package/dist/to-kebab-case.cjs +1 -1
  467. package/dist/to-kebab-case.d.cts +48 -19
  468. package/dist/to-kebab-case.d.cts.map +1 -1
  469. package/dist/to-kebab-case.d.ts +48 -19
  470. package/dist/to-kebab-case.d.ts.map +1 -1
  471. package/dist/to-kebab-case.js +1 -1
  472. package/dist/to-kebab-case.js.map +1 -1
  473. package/dist/to-lower-case.cjs +1 -0
  474. package/dist/to-lower-case.d.cts +51 -0
  475. package/dist/to-lower-case.d.cts.map +1 -0
  476. package/dist/to-lower-case.d.ts +51 -0
  477. package/dist/to-lower-case.d.ts.map +1 -0
  478. package/dist/to-lower-case.js +2 -0
  479. package/dist/to-lower-case.js.map +1 -0
  480. package/dist/{to-single-vYpRavjM.js → to-single-BKYbBic-.js} +1 -1
  481. package/dist/to-single-BKYbBic-.js.map +1 -0
  482. package/dist/to-snake-case.cjs +1 -1
  483. package/dist/to-snake-case.d.cts +48 -19
  484. package/dist/to-snake-case.d.cts.map +1 -1
  485. package/dist/to-snake-case.d.ts +48 -19
  486. package/dist/to-snake-case.d.ts.map +1 -1
  487. package/dist/to-snake-case.js +1 -1
  488. package/dist/to-snake-case.js.map +1 -1
  489. package/dist/{to-string-Se4KcQka.d.cts → to-string-DkC3zRUJ.d.cts} +1 -1
  490. package/dist/to-string-DkC3zRUJ.d.cts.map +1 -0
  491. package/dist/{to-string-C6_OnZ6e.d.ts → to-string-YIFx2KS6.d.ts} +1 -1
  492. package/dist/to-string-YIFx2KS6.d.ts.map +1 -0
  493. package/dist/to-title-case.cjs +1 -0
  494. package/dist/to-title-case.d.cts +86 -0
  495. package/dist/to-title-case.d.cts.map +1 -0
  496. package/dist/to-title-case.d.ts +86 -0
  497. package/dist/to-title-case.d.ts.map +1 -0
  498. package/dist/to-title-case.js +2 -0
  499. package/dist/to-title-case.js.map +1 -0
  500. package/dist/to-upper-case.cjs +1 -0
  501. package/dist/to-upper-case.d.cts +51 -0
  502. package/dist/to-upper-case.d.cts.map +1 -0
  503. package/dist/to-upper-case.d.ts +51 -0
  504. package/dist/to-upper-case.d.ts.map +1 -0
  505. package/dist/to-upper-case.js +2 -0
  506. package/dist/to-upper-case.js.map +1 -0
  507. package/dist/{tuple-parts-Bhbm4jiu.d.ts → tuple-parts-BYI4o8Vk.d.ts} +8 -8
  508. package/dist/{tuple-parts-Bhbm4jiu.d.ts.map → tuple-parts-BYI4o8Vk.d.ts.map} +1 -1
  509. package/dist/{tuple-parts-BJQEORxn.d.cts → tuple-parts-CzQQupgi.d.cts} +8 -8
  510. package/dist/{tuple-parts-BJQEORxn.d.cts.map → tuple-parts-CzQQupgi.d.cts.map} +1 -1
  511. package/dist/uncapitalize.cjs +1 -0
  512. package/dist/uncapitalize.d.cts +51 -0
  513. package/dist/uncapitalize.d.cts.map +1 -0
  514. package/dist/uncapitalize.d.ts +51 -0
  515. package/dist/uncapitalize.d.ts.map +1 -0
  516. package/dist/uncapitalize.js +2 -0
  517. package/dist/uncapitalize.js.map +1 -0
  518. package/dist/unique-by.d.cts +2 -2
  519. package/dist/unique-by.d.ts +2 -2
  520. package/dist/unique-by.js +1 -1
  521. package/dist/unique-with.d.cts +2 -2
  522. package/dist/unique-with.d.ts +2 -2
  523. package/dist/unique-with.js +1 -1
  524. package/dist/unique.d.cts +2 -2
  525. package/dist/unique.d.ts +2 -2
  526. package/dist/unique.js +1 -1
  527. package/dist/{upsert-prop-__xTQQ07.d.ts → upsert-prop-0hwik6JJ.d.cts} +2 -3
  528. package/dist/{upsert-prop-__xTQQ07.d.ts.map → upsert-prop-0hwik6JJ.d.cts.map} +1 -1
  529. package/dist/{upsert-prop-P-aJDDII.d.cts → upsert-prop-_NpaZwm4.d.ts} +2 -3
  530. package/dist/upsert-prop-_NpaZwm4.d.ts.map +1 -0
  531. package/dist/{utility-evaluators-BwYLtB8b.js → utility-evaluators-Boc-TMbq.js} +1 -1
  532. package/dist/{utility-evaluators-BwYLtB8b.js.map → utility-evaluators-Boc-TMbq.js.map} +1 -1
  533. package/dist/values.d.cts +2 -2
  534. package/dist/values.d.ts +2 -2
  535. package/dist/values.js +1 -1
  536. package/dist/{with-precision-CWWiMmxZ.js → with-precision-CQ90Walk.js} +1 -1
  537. package/dist/{with-precision-CWWiMmxZ.js.map → with-precision-CQ90Walk.js.map} +1 -1
  538. package/dist/words-DQCM5umD.js +3 -0
  539. package/dist/words-DQCM5umD.js.map +1 -0
  540. package/dist/words-DRQKxzLU.cjs +2 -0
  541. package/dist/zip-with.d.cts +1 -1
  542. package/dist/zip-with.d.ts +1 -1
  543. package/dist/zip-with.js +1 -1
  544. package/dist/zip.d.cts +1 -1
  545. package/dist/zip.d.ts +1 -1
  546. package/dist/zip.js +1 -1
  547. package/package.json +4 -6
  548. package/dist/case.transform-CCMWrBmz.js +0 -2
  549. package/dist/case.transform-CCMWrBmz.js.map +0 -1
  550. package/dist/case.transform-FNx2XsC3.cjs +0 -1
  551. package/dist/case.types-BxuWJgN1.d.cts +0 -19
  552. package/dist/case.types-BxuWJgN1.d.cts.map +0 -1
  553. package/dist/case.types-CVfGg990.d.ts +0 -19
  554. package/dist/case.types-CVfGg990.d.ts.map +0 -1
  555. package/dist/curry-B20xQM_9.d.cts.map +0 -1
  556. package/dist/curry-BcQ8Up1_.js.map +0 -1
  557. package/dist/curry-d8_p_Jzt.d.ts.map +0 -1
  558. package/dist/dist-CUT1dnRU.js +0 -343
  559. package/dist/dist-CUT1dnRU.js.map +0 -1
  560. package/dist/dist-CiyBKPT6.cjs +0 -343
  561. package/dist/filtered-array-D_RqQ8tX.d.cts +0 -13
  562. package/dist/filtered-array-D_RqQ8tX.d.cts.map +0 -1
  563. package/dist/filtered-array-Yij-X3T4.d.ts +0 -13
  564. package/dist/filtered-array-Yij-X3T4.d.ts.map +0 -1
  565. package/dist/has-at-least-DyIhWZJH.js +0 -2
  566. package/dist/is-emptyish-CIxZzxxz.d.ts.map +0 -1
  567. package/dist/is-emptyish-oX5mpcfW.d.cts.map +0 -1
  568. package/dist/is-union-Bu19sEkP.d.ts +0 -8
  569. package/dist/is-union-Bu19sEkP.d.ts.map +0 -1
  570. package/dist/is-union-Dp9mCo1b.d.cts +0 -8
  571. package/dist/is-union-Dp9mCo1b.d.cts.map +0 -1
  572. package/dist/iterable-container-BdjPuIjL.d.ts.map +0 -1
  573. package/dist/lazy-data-last-impl-DW5TXWv8.js.map +0 -1
  574. package/dist/mapped-LCblUtt3.d.ts.map +0 -1
  575. package/dist/mapped-m3FRlUOA.d.cts.map +0 -1
  576. package/dist/no-infer-BIHbaQcD.d.ts +0 -5
  577. package/dist/no-infer-BIHbaQcD.d.ts.map +0 -1
  578. package/dist/no-infer-BVbyldno.d.cts +0 -5
  579. package/dist/no-infer-BVbyldno.d.cts.map +0 -1
  580. package/dist/non-empty-array-CFG7wGD-.d.cts.map +0 -1
  581. package/dist/non-empty-array-DXkY7ynY.d.ts.map +0 -1
  582. package/dist/omit.d.cts.map +0 -1
  583. package/dist/omit.d.ts.map +0 -1
  584. package/dist/partial-array-CeoXpbZU.d.ts.map +0 -1
  585. package/dist/partial-array-CoV_xxyQ.d.cts.map +0 -1
  586. package/dist/pipe-BGazHnZ_.js.map +0 -1
  587. package/dist/prop-C3rYih5m.d.cts.map +0 -1
  588. package/dist/prop-DulcbWGG.d.ts.map +0 -1
  589. package/dist/reordered-array-B2klHneX.d.ts.map +0 -1
  590. package/dist/reordered-array-BsUBOnYh.d.cts.map +0 -1
  591. package/dist/to-capital-case.cjs +0 -1
  592. package/dist/to-capital-case.d.cts +0 -31
  593. package/dist/to-capital-case.d.cts.map +0 -1
  594. package/dist/to-capital-case.d.ts +0 -31
  595. package/dist/to-capital-case.d.ts.map +0 -1
  596. package/dist/to-capital-case.js +0 -2
  597. package/dist/to-capital-case.js.map +0 -1
  598. package/dist/to-constant-case.cjs +0 -1
  599. package/dist/to-constant-case.d.cts +0 -31
  600. package/dist/to-constant-case.d.cts.map +0 -1
  601. package/dist/to-constant-case.d.ts +0 -31
  602. package/dist/to-constant-case.d.ts.map +0 -1
  603. package/dist/to-constant-case.js +0 -2
  604. package/dist/to-constant-case.js.map +0 -1
  605. package/dist/to-no-case.cjs +0 -1
  606. package/dist/to-no-case.d.cts +0 -31
  607. package/dist/to-no-case.d.cts.map +0 -1
  608. package/dist/to-no-case.d.ts +0 -31
  609. package/dist/to-no-case.d.ts.map +0 -1
  610. package/dist/to-no-case.js +0 -2
  611. package/dist/to-no-case.js.map +0 -1
  612. package/dist/to-pascal-case.cjs +0 -1
  613. package/dist/to-pascal-case.d.cts +0 -32
  614. package/dist/to-pascal-case.d.cts.map +0 -1
  615. package/dist/to-pascal-case.d.ts +0 -32
  616. package/dist/to-pascal-case.d.ts.map +0 -1
  617. package/dist/to-pascal-case.js +0 -2
  618. package/dist/to-pascal-case.js.map +0 -1
  619. package/dist/to-pascal-snake-case.cjs +0 -1
  620. package/dist/to-pascal-snake-case.d.cts +0 -31
  621. package/dist/to-pascal-snake-case.d.cts.map +0 -1
  622. package/dist/to-pascal-snake-case.d.ts +0 -31
  623. package/dist/to-pascal-snake-case.d.ts.map +0 -1
  624. package/dist/to-pascal-snake-case.js +0 -2
  625. package/dist/to-pascal-snake-case.js.map +0 -1
  626. package/dist/to-sentence-case.cjs +0 -1
  627. package/dist/to-sentence-case.d.cts +0 -31
  628. package/dist/to-sentence-case.d.cts.map +0 -1
  629. package/dist/to-sentence-case.d.ts +0 -31
  630. package/dist/to-sentence-case.d.ts.map +0 -1
  631. package/dist/to-sentence-case.js +0 -2
  632. package/dist/to-sentence-case.js.map +0 -1
  633. package/dist/to-single-vYpRavjM.js.map +0 -1
  634. package/dist/to-string-C6_OnZ6e.d.ts.map +0 -1
  635. package/dist/to-string-Se4KcQka.d.cts.map +0 -1
  636. package/dist/to-train-case.cjs +0 -1
  637. package/dist/to-train-case.d.cts +0 -31
  638. package/dist/to-train-case.d.cts.map +0 -1
  639. package/dist/to-train-case.d.ts +0 -31
  640. package/dist/to-train-case.d.ts.map +0 -1
  641. package/dist/to-train-case.js +0 -2
  642. package/dist/to-train-case.js.map +0 -1
  643. package/dist/upsert-prop-P-aJDDII.d.cts.map +0 -1
@@ -1 +1 @@
1
- const e=require(`./dist-CiyBKPT6.cjs`),t=require(`./constant.cjs`),n=require(`./do-nothing.cjs`),r=require(`./funnel.cjs`),i=require(`./sleep.cjs`),a=16;function o(e,t){return e===void 0?[t]:[...e,t]}e.i(`reducer behavior`,()=>{e.a(`passes the reduced arg to the executor`,()=>{let n=e.r.fn();r.funnel(n,{reducer:t.constant(`hello world`),triggerAt:`start`,minQuietPeriodMs:16}).call(),e.n(n).toHaveBeenCalledTimes(1),e.n(n).toHaveBeenLastCalledWith(`hello world`)}),e.a(`reduces call args`,async()=>{let t=e.r.fn(e=>{}),n=r.funnel(t,{reducer:(e,t)=>(e??0)+t,minQuietPeriodMs:32,triggerAt:`end`});n.call(1),n.call(2),n.call(3),await i.sleep(16),n.call(4),n.call(5),n.call(6),await i.sleep(32),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith(21)}),e.a(`does not invoke if reduceArgs returns undefined`,async()=>{let n=e.r.fn();r.funnel(n,{reducer:t.constant(void 0),triggerAt:`end`,minQuietPeriodMs:16}).call(),await i.sleep(32),e.n(n).toHaveBeenCalledTimes(0)}),e.a(`supports multiple arguments`,()=>{let t=e.r.fn();r.funnel(t,{reducer:(e,t,n,r)=>[e,t,n,r],triggerAt:`start`,minQuietPeriodMs:16}).call(1,`a`,!0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([void 0,1,`a`,!0])}),e.a(`reducer isn't called again when 'invokedAt: start'`,async()=>{let t=e.r.fn(o),a=r.funnel(n.doNothing(),{reducer:t,triggerAt:`start`,minQuietPeriodMs:16});a.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith(void 0,`a`),a.call(`b`),a.call(`c`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(32),e.n(t).toHaveBeenCalledTimes(1)})}),e.i(`non-trivial (>0ms) timer duration`,()=>{e.i(`delay timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minGapMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),n.call(`d`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`])}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`invocations in the middle of a window`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(.75*16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(.75*16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])})}),e.i(`burst timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),n.call(`d`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`])}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(4),e.n(t).toHaveBeenLastCalledWith([`e`,`f`])}),e.a(`invokedAt: end`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),n.call(`e`),n.call(`f`),n.call(`g`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`e`,`f`,`g`])}),e.a(`invocations in the middle of a window`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(.9*16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(.1*16),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`,`d`,`e`,`f`])}),e.a(`maxBurstDurationMs limits the burst duration`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minQuietPeriodMs:16,maxBurstDurationMs:32,triggerAt:`end`});n.call(`a`),await i.sleep(.75*16),n.call(`b`),await i.sleep(.75*16),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(.75*16),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),e.i(`both timers`,()=>{e.a(`delay is longer than burst`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:32,minQuietPeriodMs:16,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e.a(`burst is longer than delay`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:16,minQuietPeriodMs:32,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e.a(`burst and delay are equal`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:16,minQuietPeriodMs:16,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`delay and maxBurstDurationMs are equal`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:16,minQuietPeriodMs:32,maxBurstDurationMs:16,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])})})}),e.i(`immediate (===0) timer durations`,()=>{e.i(`delay timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minGapMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2)}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`with a non-trivial burst timer`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:16});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`])})}),e.i(`burst timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2)}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(4),e.n(t).toHaveBeenLastCalledWith([`e`,`f`])}),e.a(`invokedAt: end`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`with a non-trivial delay timer`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:16,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`])}),e.a(`burst timer with non-trivial maxBurstDuration`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minQuietPeriodMs:0,maxBurstDurationMs:16,triggerAt:`end`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),e.a(`both timers`,async()=>{let t=e.r.fn();r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0}).call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1)}),e.a(`maxBurstDurationMs = 0 limits the burst immediately`,async()=>{let t=e.r.fn();r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16,maxBurstDurationMs:0}).call(`a`),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`])}),e.a(`all timeouts zero`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0,maxBurstDurationMs:0});n.call(`a`),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`])})}),e.i(`default minQuietPeriodMs === 0 when minGapMs is not defined`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),n.call(`c`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`c`])}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`]),n.call(`c`),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`c`])})}),e.i(`utility functions`,()=>{e.i(`flush`,()=>{e.a(`flush triggers an immediate invocation`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),n.flush(),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1)}),e.a(`flush during active burst`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:32});n.call(`a`),n.call(`b`),n.call(`c`),await i.sleep(16),n.flush(),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await i.sleep(32),e.n(t).toHaveBeenCalledTimes(1)})}),e.i(`cancel`,()=>{e.a(`cancel prevents invocation`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),n.cancel(),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(0)}),e.a(`cancel during delay period`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minGapMs:32});n.call(`a`),n.call(`b`),await i.sleep(16),n.cancel(),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1)})}),e.i(`isIdle`,()=>{e.a(`isIdle reflects the funnel's state`,()=>{let t=r.funnel(e.r.fn(),{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});e.n(t.isIdle).toBe(!0),t.call(`a`),e.n(t.isIdle).toBe(!1),t.cancel(),e.n(t.isIdle).toBe(!0)}),e.a(`isIdle works when burst duration is 0`,async()=>{let t=r.funnel(e.r.fn(),{reducer:o,triggerAt:`end`,minQuietPeriodMs:0});e.n(t.isIdle).toBe(!0),t.call(`a`),t.call(`b`),t.call(`c`),e.n(t.isIdle).toBe(!1),await i.sleep(0),e.n(t.isIdle).toBe(!0)})})}),e.i(`edge-cases`,()=>{e.a(`bursts that start late don't prevent delayed invocations`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:16,minGapMs:32});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(1.5*16),e.n(t).toHaveBeenCalledTimes(1),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(.5*16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e.a(`delay timeouts don't cause an invocation in the middle of bursts`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:32,minGapMs:16});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),n.call(`d`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2)})});
1
+ const e=require(`./dist-8XtUY3ad.cjs`),t=require(`./constant.cjs`),n=require(`./do-nothing.cjs`),r=require(`./funnel.cjs`),i=require(`./sleep.cjs`),a=16;function o(e,t){return e===void 0?[t]:[...e,t]}e.i(`reducer behavior`,()=>{e.a(`passes the reduced arg to the executor`,()=>{let n=e.r.fn();r.funnel(n,{reducer:t.constant(`hello world`),triggerAt:`start`,minQuietPeriodMs:16}).call(),e.n(n).toHaveBeenCalledTimes(1),e.n(n).toHaveBeenLastCalledWith(`hello world`)}),e.a(`reduces call args`,async()=>{let t=e.r.fn(e=>{}),n=r.funnel(t,{reducer:(e,t)=>(e??0)+t,minQuietPeriodMs:32,triggerAt:`end`});n.call(1),n.call(2),n.call(3),await i.sleep(16),n.call(4),n.call(5),n.call(6),await i.sleep(32),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith(21)}),e.a(`does not invoke if reduceArgs returns undefined`,async()=>{let n=e.r.fn();r.funnel(n,{reducer:t.constant(void 0),triggerAt:`end`,minQuietPeriodMs:16}).call(),await i.sleep(32),e.n(n).toHaveBeenCalledTimes(0)}),e.a(`supports multiple arguments`,()=>{let t=e.r.fn();r.funnel(t,{reducer:(e,t,n,r)=>[e,t,n,r],triggerAt:`start`,minQuietPeriodMs:16}).call(1,`a`,!0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([void 0,1,`a`,!0])}),e.a(`reducer isn't called again when 'invokedAt: start'`,async()=>{let t=e.r.fn(o),a=r.funnel(n.doNothing(),{reducer:t,triggerAt:`start`,minQuietPeriodMs:16});a.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith(void 0,`a`),a.call(`b`),a.call(`c`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(32),e.n(t).toHaveBeenCalledTimes(1)})}),e.i(`non-trivial (>0ms) timer duration`,()=>{e.i(`delay timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minGapMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),n.call(`d`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`])}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`invocations in the middle of a window`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(.75*16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(.75*16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])})}),e.i(`burst timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),n.call(`d`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`])}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(4),e.n(t).toHaveBeenLastCalledWith([`e`,`f`])}),e.a(`invokedAt: end`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),n.call(`e`),n.call(`f`),n.call(`g`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`e`,`f`,`g`])}),e.a(`invocations in the middle of a window`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(.9*16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(.1*16),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`,`d`,`e`,`f`])}),e.a(`maxBurstDurationMs limits the burst duration`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minQuietPeriodMs:16,maxBurstDurationMs:32,triggerAt:`end`});n.call(`a`),await i.sleep(.75*16),n.call(`b`),await i.sleep(.75*16),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(.75*16),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),e.i(`both timers`,()=>{e.a(`delay is longer than burst`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:32,minQuietPeriodMs:16,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e.a(`burst is longer than delay`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:16,minQuietPeriodMs:32,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e.a(`burst and delay are equal`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:16,minQuietPeriodMs:16,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`delay and maxBurstDurationMs are equal`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minGapMs:16,minQuietPeriodMs:32,maxBurstDurationMs:16,triggerAt:`both`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])})})}),e.i(`immediate (===0) timer durations`,()=>{e.i(`delay timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minGapMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2)}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`with a non-trivial burst timer`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:16});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`])})}),e.i(`burst timer`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2)}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`d`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(4),e.n(t).toHaveBeenLastCalledWith([`e`,`f`])}),e.a(`invokedAt: end`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e.a(`with a non-trivial delay timer`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:16,minQuietPeriodMs:0});n.call(`a`),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`])}),e.a(`burst timer with non-trivial maxBurstDuration`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,minQuietPeriodMs:0,maxBurstDurationMs:16,triggerAt:`end`});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(0),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),e.a(`both timers`,async()=>{let t=e.r.fn();r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0}).call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1)}),e.a(`maxBurstDurationMs = 0 limits the burst immediately`,async()=>{let t=e.r.fn();r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16,maxBurstDurationMs:0}).call(`a`),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`])}),e.a(`all timeouts zero`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0,maxBurstDurationMs:0});n.call(`a`),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`])})}),e.i(`default minQuietPeriodMs === 0 when minGapMs is not defined`,()=>{e.a(`invokedAt: start`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(1),n.call(`c`),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`c`])}),e.a(`invokedAt: both`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(0),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`]),n.call(`c`),e.n(t).toHaveBeenCalledTimes(3),e.n(t).toHaveBeenLastCalledWith([`c`])})}),e.i(`utility functions`,()=>{e.i(`flush`,()=>{e.a(`flush triggers an immediate invocation`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),n.flush(),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1)}),e.a(`flush during active burst`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:32});n.call(`a`),n.call(`b`),n.call(`c`),await i.sleep(16),n.flush(),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await i.sleep(32),e.n(t).toHaveBeenCalledTimes(1)})}),e.i(`cancel`,()=>{e.a(`cancel prevents invocation`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});n.call(`a`),n.call(`b`),n.call(`c`),n.cancel(),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(0)}),e.a(`cancel during delay period`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`start`,minGapMs:32});n.call(`a`),n.call(`b`),await i.sleep(16),n.cancel(),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1)})}),e.i(`isIdle`,()=>{e.a(`isIdle reflects the funnel's state`,()=>{let t=r.funnel(e.r.fn(),{reducer:o,triggerAt:`end`,minQuietPeriodMs:16});e.n(t.isIdle).toBe(!0),t.call(`a`),e.n(t.isIdle).toBe(!1),t.cancel(),e.n(t.isIdle).toBe(!0)}),e.a(`isIdle works when burst duration is 0`,async()=>{let t=r.funnel(e.r.fn(),{reducer:o,triggerAt:`end`,minQuietPeriodMs:0});e.n(t.isIdle).toBe(!0),t.call(`a`),t.call(`b`),t.call(`c`),e.n(t.isIdle).toBe(!1),await i.sleep(0),e.n(t.isIdle).toBe(!0)})})}),e.i(`edge-cases`,()=>{e.a(`bursts that start late don't prevent delayed invocations`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:16,minGapMs:32});n.call(`a`),n.call(`b`),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(1.5*16),e.n(t).toHaveBeenCalledTimes(1),n.call(`d`),n.call(`e`),n.call(`f`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(.5*16),e.n(t).toHaveBeenCalledTimes(2),e.n(t).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e.a(`delay timeouts don't cause an invocation in the middle of bursts`,async()=>{let t=e.r.fn(),n=r.funnel(t,{reducer:o,triggerAt:`both`,minQuietPeriodMs:32,minGapMs:16});n.call(`a`),e.n(t).toHaveBeenCalledTimes(1),e.n(t).toHaveBeenLastCalledWith([`a`]),await i.sleep(16),n.call(`b`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),n.call(`c`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),n.call(`d`),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(1),await i.sleep(16),e.n(t).toHaveBeenCalledTimes(2)})});
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,r}from"./dist-CUT1dnRU.js";import{constant as i}from"./constant.js";import{doNothing as a}from"./do-nothing.js";import{funnel as o}from"./funnel.js";import{sleep as s}from"./sleep.js";function c(e,t){return e===void 0?[t]:[...e,t]}t(`reducer behavior`,()=>{e(`passes the reduced arg to the executor`,()=>{let e=r.fn();o(e,{reducer:i(`hello world`),triggerAt:`start`,minQuietPeriodMs:16}).call(),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith(`hello world`)}),e(`reduces call args`,async()=>{let e=r.fn(e=>{}),t=o(e,{reducer:(e,t)=>(e??0)+t,minQuietPeriodMs:32,triggerAt:`end`});t.call(1),t.call(2),t.call(3),await s(16),t.call(4),t.call(5),t.call(6),await s(32),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith(21)}),e(`does not invoke if reduceArgs returns undefined`,async()=>{let e=r.fn();o(e,{reducer:i(void 0),triggerAt:`end`,minQuietPeriodMs:16}).call(),await s(32),n(e).toHaveBeenCalledTimes(0)}),e(`supports multiple arguments`,()=>{let e=r.fn();o(e,{reducer:(e,t,n,r)=>[e,t,n,r],triggerAt:`start`,minQuietPeriodMs:16}).call(1,`a`,!0),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([void 0,1,`a`,!0])}),e(`reducer isn't called again when 'invokedAt: start'`,async()=>{let e=r.fn(c),t=o(a(),{reducer:e,triggerAt:`start`,minQuietPeriodMs:16});t.call(`a`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith(void 0,`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),await s(32),n(e).toHaveBeenCalledTimes(1)})}),t(`non-trivial (>0ms) timer duration`,()=>{t(`delay timer`,()=>{e(`invokedAt: start`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`start`,minGapMs:16});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),n(e).toHaveBeenCalledTimes(1),t.call(`d`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`d`])}),e(`invokedAt: both`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:16});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(2),await s(16),n(e).toHaveBeenCalledTimes(3),n(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e(`invocations in the middle of a window`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:16});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(.75*16),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(1),await s(.75*16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])})}),t(`burst timer`,()=>{e(`invokedAt: start`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`start`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),n(e).toHaveBeenCalledTimes(1),t.call(`d`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`d`])}),e(`invokedAt: both`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(3),n(e).toHaveBeenLastCalledWith([`d`]),await s(16),n(e).toHaveBeenCalledTimes(4),n(e).toHaveBeenLastCalledWith([`e`,`f`])}),e(`invokedAt: end`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(0),await s(16),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),t.call(`e`),t.call(`f`),t.call(`g`),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`e`,`f`,`g`])}),e(`invocations in the middle of a window`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(0),await s(.9*16),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(0),await s(.1*16),n(e).toHaveBeenCalledTimes(0),await s(16),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`,`b`,`c`,`d`,`e`,`f`])}),e(`maxBurstDurationMs limits the burst duration`,async()=>{let e=r.fn(),t=o(e,{reducer:c,minQuietPeriodMs:16,maxBurstDurationMs:32,triggerAt:`end`});t.call(`a`),await s(.75*16),t.call(`b`),await s(.75*16),t.call(`c`),n(e).toHaveBeenCalledTimes(0),await s(.75*16),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),t(`both timers`,()=>{e(`delay is longer than burst`,async()=>{let e=r.fn(),t=o(e,{reducer:c,minGapMs:32,minQuietPeriodMs:16,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e(`burst is longer than delay`,async()=>{let e=r.fn(),t=o(e,{reducer:c,minGapMs:16,minQuietPeriodMs:32,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e(`burst and delay are equal`,async()=>{let e=r.fn(),t=o(e,{reducer:c,minGapMs:16,minQuietPeriodMs:16,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`]),await s(16),n(e).toHaveBeenCalledTimes(3),n(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e(`delay and maxBurstDurationMs are equal`,async()=>{let e=r.fn(),t=o(e,{reducer:c,minGapMs:16,minQuietPeriodMs:32,maxBurstDurationMs:16,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`]),await s(16),n(e).toHaveBeenCalledTimes(3),n(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])})})}),t(`immediate (===0) timer durations`,()=>{t(`delay timer`,()=>{e(`invokedAt: start`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`start`,minGapMs:0});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(0),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`d`]),await s(0),n(e).toHaveBeenCalledTimes(2)}),e(`invokedAt: both`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:0});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(0),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`]),await s(0),n(e).toHaveBeenCalledTimes(3),n(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e(`with a non-trivial burst timer`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:16});t.call(`a`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),t.call(`b`),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`])})}),t(`burst timer`,()=>{e(`invokedAt: start`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`start`,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(0),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`d`]),await s(0),n(e).toHaveBeenCalledTimes(2)}),e(`invokedAt: both`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(0),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(3),n(e).toHaveBeenLastCalledWith([`d`]),await s(0),n(e).toHaveBeenCalledTimes(4),n(e).toHaveBeenLastCalledWith([`e`,`f`])}),e(`invokedAt: end`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(0),await s(0),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(1),await s(0),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),e(`with a non-trivial delay timer`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:16,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(0),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`])}),e(`burst timer with non-trivial maxBurstDuration`,async()=>{let e=r.fn(),t=o(e,{reducer:c,minQuietPeriodMs:0,maxBurstDurationMs:16,triggerAt:`end`});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(0),await s(0),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),e(`both timers`,async()=>{let e=r.fn();o(e,{reducer:c,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0}).call(`a`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(0),n(e).toHaveBeenCalledTimes(1)}),e(`maxBurstDurationMs = 0 limits the burst immediately`,async()=>{let e=r.fn();o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16,maxBurstDurationMs:0}).call(`a`),await s(0),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`])}),e(`all timeouts zero`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0,maxBurstDurationMs:0});t.call(`a`),t.call(`b`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(0),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`])})}),t(`default minQuietPeriodMs === 0 when minGapMs is not defined`,()=>{e(`invokedAt: start`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`start`});t.call(`a`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),t.call(`b`),n(e).toHaveBeenCalledTimes(1),await s(0),n(e).toHaveBeenCalledTimes(1),t.call(`c`),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`c`])}),e(`invokedAt: both`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`});t.call(`a`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),t.call(`b`),n(e).toHaveBeenCalledTimes(1),await s(0),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`]),t.call(`c`),n(e).toHaveBeenCalledTimes(3),n(e).toHaveBeenLastCalledWith([`c`])})}),t(`utility functions`,()=>{t(`flush`,()=>{e(`flush triggers an immediate invocation`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),t.flush(),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await s(16),n(e).toHaveBeenCalledTimes(1)}),e(`flush during active burst`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:32});t.call(`a`),t.call(`b`),t.call(`c`),await s(16),t.flush(),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await s(32),n(e).toHaveBeenCalledTimes(1)})}),t(`cancel`,()=>{e(`cancel prevents invocation`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),t.cancel(),await s(16),n(e).toHaveBeenCalledTimes(0)}),e(`cancel during delay period`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`start`,minGapMs:32});t.call(`a`),t.call(`b`),await s(16),t.cancel(),await s(16),n(e).toHaveBeenCalledTimes(1)})}),t(`isIdle`,()=>{e(`isIdle reflects the funnel's state`,()=>{let e=o(r.fn(),{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});n(e.isIdle).toBe(!0),e.call(`a`),n(e.isIdle).toBe(!1),e.cancel(),n(e.isIdle).toBe(!0)}),e(`isIdle works when burst duration is 0`,async()=>{let e=o(r.fn(),{reducer:c,triggerAt:`end`,minQuietPeriodMs:0});n(e.isIdle).toBe(!0),e.call(`a`),e.call(`b`),e.call(`c`),n(e.isIdle).toBe(!1),await s(0),n(e.isIdle).toBe(!0)})})}),t(`edge-cases`,()=>{e(`bursts that start late don't prevent delayed invocations`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:16,minGapMs:32});t.call(`a`),t.call(`b`),t.call(`c`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(1.5*16),n(e).toHaveBeenCalledTimes(1),t.call(`d`),t.call(`e`),t.call(`f`),n(e).toHaveBeenCalledTimes(1),await s(.5*16),n(e).toHaveBeenCalledTimes(2),n(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),e(`delay timeouts don't cause an invocation in the middle of bursts`,async()=>{let e=r.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:32,minGapMs:16});t.call(`a`),n(e).toHaveBeenCalledTimes(1),n(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`b`),n(e).toHaveBeenCalledTimes(1),await s(16),t.call(`c`),n(e).toHaveBeenCalledTimes(1),await s(16),t.call(`d`),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(1),await s(16),n(e).toHaveBeenCalledTimes(2)})});
1
+ import{constant as e}from"./constant.js";import{doNothing as t}from"./do-nothing.js";import{a as n,i as r,n as i,r as a}from"./dist-Bd1vawFi.js";import{funnel as o}from"./funnel.js";import{sleep as s}from"./sleep.js";function c(e,t){return e===void 0?[t]:[...e,t]}r(`reducer behavior`,()=>{n(`passes the reduced arg to the executor`,()=>{let t=a.fn();o(t,{reducer:e(`hello world`),triggerAt:`start`,minQuietPeriodMs:16}).call(),i(t).toHaveBeenCalledTimes(1),i(t).toHaveBeenLastCalledWith(`hello world`)}),n(`reduces call args`,async()=>{let e=a.fn(e=>{}),t=o(e,{reducer:(e,t)=>(e??0)+t,minQuietPeriodMs:32,triggerAt:`end`});t.call(1),t.call(2),t.call(3),await s(16),t.call(4),t.call(5),t.call(6),await s(32),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith(21)}),n(`does not invoke if reduceArgs returns undefined`,async()=>{let t=a.fn();o(t,{reducer:e(void 0),triggerAt:`end`,minQuietPeriodMs:16}).call(),await s(32),i(t).toHaveBeenCalledTimes(0)}),n(`supports multiple arguments`,()=>{let e=a.fn();o(e,{reducer:(e,t,n,r)=>[e,t,n,r],triggerAt:`start`,minQuietPeriodMs:16}).call(1,`a`,!0),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([void 0,1,`a`,!0])}),n(`reducer isn't called again when 'invokedAt: start'`,async()=>{let e=a.fn(c),n=o(t(),{reducer:e,triggerAt:`start`,minQuietPeriodMs:16});n.call(`a`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith(void 0,`a`),n.call(`b`),n.call(`c`),i(e).toHaveBeenCalledTimes(1),await s(32),i(e).toHaveBeenCalledTimes(1)})}),r(`non-trivial (>0ms) timer duration`,()=>{r(`delay timer`,()=>{n(`invokedAt: start`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`start`,minGapMs:16});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),i(e).toHaveBeenCalledTimes(1),t.call(`d`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`d`])}),n(`invokedAt: both`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:16});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(2),await s(16),i(e).toHaveBeenCalledTimes(3),i(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),n(`invocations in the middle of a window`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:16});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(.75*16),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(1),await s(.75*16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])})}),r(`burst timer`,()=>{n(`invokedAt: start`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`start`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),i(e).toHaveBeenCalledTimes(1),t.call(`d`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`d`])}),n(`invokedAt: both`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(3),i(e).toHaveBeenLastCalledWith([`d`]),await s(16),i(e).toHaveBeenCalledTimes(4),i(e).toHaveBeenLastCalledWith([`e`,`f`])}),n(`invokedAt: end`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(0),await s(16),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),t.call(`e`),t.call(`f`),t.call(`g`),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`e`,`f`,`g`])}),n(`invocations in the middle of a window`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(0),await s(.9*16),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(0),await s(.1*16),i(e).toHaveBeenCalledTimes(0),await s(16),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`,`b`,`c`,`d`,`e`,`f`])}),n(`maxBurstDurationMs limits the burst duration`,async()=>{let e=a.fn(),t=o(e,{reducer:c,minQuietPeriodMs:16,maxBurstDurationMs:32,triggerAt:`end`});t.call(`a`),await s(.75*16),t.call(`b`),await s(.75*16),t.call(`c`),i(e).toHaveBeenCalledTimes(0),await s(.75*16),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),r(`both timers`,()=>{n(`delay is longer than burst`,async()=>{let e=a.fn(),t=o(e,{reducer:c,minGapMs:32,minQuietPeriodMs:16,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),n(`burst is longer than delay`,async()=>{let e=a.fn(),t=o(e,{reducer:c,minGapMs:16,minQuietPeriodMs:32,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),n(`burst and delay are equal`,async()=>{let e=a.fn(),t=o(e,{reducer:c,minGapMs:16,minQuietPeriodMs:16,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`]),await s(16),i(e).toHaveBeenCalledTimes(3),i(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),n(`delay and maxBurstDurationMs are equal`,async()=>{let e=a.fn(),t=o(e,{reducer:c,minGapMs:16,minQuietPeriodMs:32,maxBurstDurationMs:16,triggerAt:`both`});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`]),await s(16),i(e).toHaveBeenCalledTimes(3),i(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])})})}),r(`immediate (===0) timer durations`,()=>{r(`delay timer`,()=>{n(`invokedAt: start`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`start`,minGapMs:0});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(0),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`d`]),await s(0),i(e).toHaveBeenCalledTimes(2)}),n(`invokedAt: both`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:0});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(0),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`]),await s(0),i(e).toHaveBeenCalledTimes(3),i(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),n(`with a non-trivial burst timer`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:16});t.call(`a`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),t.call(`b`),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`])})}),r(`burst timer`,()=>{n(`invokedAt: start`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`start`,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(0),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`d`]),await s(0),i(e).toHaveBeenCalledTimes(2)}),n(`invokedAt: both`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(0),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(3),i(e).toHaveBeenLastCalledWith([`d`]),await s(0),i(e).toHaveBeenCalledTimes(4),i(e).toHaveBeenLastCalledWith([`e`,`f`])}),n(`invokedAt: end`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(0),await s(0),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(1),await s(0),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`d`,`e`,`f`])}),n(`with a non-trivial delay timer`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:16,minQuietPeriodMs:0});t.call(`a`),t.call(`b`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(0),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`])}),n(`burst timer with non-trivial maxBurstDuration`,async()=>{let e=a.fn(),t=o(e,{reducer:c,minQuietPeriodMs:0,maxBurstDurationMs:16,triggerAt:`end`});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(0),await s(0),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`,`b`,`c`])})}),n(`both timers`,async()=>{let e=a.fn();o(e,{reducer:c,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0}).call(`a`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(0),i(e).toHaveBeenCalledTimes(1)}),n(`maxBurstDurationMs = 0 limits the burst immediately`,async()=>{let e=a.fn();o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16,maxBurstDurationMs:0}).call(`a`),await s(0),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`])}),n(`all timeouts zero`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minGapMs:0,minQuietPeriodMs:0,maxBurstDurationMs:0});t.call(`a`),t.call(`b`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(0),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`])})}),r(`default minQuietPeriodMs === 0 when minGapMs is not defined`,()=>{n(`invokedAt: start`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`start`});t.call(`a`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),t.call(`b`),i(e).toHaveBeenCalledTimes(1),await s(0),i(e).toHaveBeenCalledTimes(1),t.call(`c`),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`c`])}),n(`invokedAt: both`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`});t.call(`a`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),t.call(`b`),i(e).toHaveBeenCalledTimes(1),await s(0),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`]),t.call(`c`),i(e).toHaveBeenCalledTimes(3),i(e).toHaveBeenLastCalledWith([`c`])})}),r(`utility functions`,()=>{r(`flush`,()=>{n(`flush triggers an immediate invocation`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),t.flush(),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await s(16),i(e).toHaveBeenCalledTimes(1)}),n(`flush during active burst`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:32});t.call(`a`),t.call(`b`),t.call(`c`),await s(16),t.flush(),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`,`b`,`c`]),await s(32),i(e).toHaveBeenCalledTimes(1)})}),r(`cancel`,()=>{n(`cancel prevents invocation`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});t.call(`a`),t.call(`b`),t.call(`c`),t.cancel(),await s(16),i(e).toHaveBeenCalledTimes(0)}),n(`cancel during delay period`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`start`,minGapMs:32});t.call(`a`),t.call(`b`),await s(16),t.cancel(),await s(16),i(e).toHaveBeenCalledTimes(1)})}),r(`isIdle`,()=>{n(`isIdle reflects the funnel's state`,()=>{let e=o(a.fn(),{reducer:c,triggerAt:`end`,minQuietPeriodMs:16});i(e.isIdle).toBe(!0),e.call(`a`),i(e.isIdle).toBe(!1),e.cancel(),i(e.isIdle).toBe(!0)}),n(`isIdle works when burst duration is 0`,async()=>{let e=o(a.fn(),{reducer:c,triggerAt:`end`,minQuietPeriodMs:0});i(e.isIdle).toBe(!0),e.call(`a`),e.call(`b`),e.call(`c`),i(e.isIdle).toBe(!1),await s(0),i(e.isIdle).toBe(!0)})})}),r(`edge-cases`,()=>{n(`bursts that start late don't prevent delayed invocations`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:16,minGapMs:32});t.call(`a`),t.call(`b`),t.call(`c`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(1.5*16),i(e).toHaveBeenCalledTimes(1),t.call(`d`),t.call(`e`),t.call(`f`),i(e).toHaveBeenCalledTimes(1),await s(.5*16),i(e).toHaveBeenCalledTimes(2),i(e).toHaveBeenLastCalledWith([`b`,`c`,`d`,`e`,`f`])}),n(`delay timeouts don't cause an invocation in the middle of bursts`,async()=>{let e=a.fn(),t=o(e,{reducer:c,triggerAt:`both`,minQuietPeriodMs:32,minGapMs:16});t.call(`a`),i(e).toHaveBeenCalledTimes(1),i(e).toHaveBeenLastCalledWith([`a`]),await s(16),t.call(`b`),i(e).toHaveBeenCalledTimes(1),await s(16),t.call(`c`),i(e).toHaveBeenCalledTimes(1),await s(16),t.call(`d`),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(1),await s(16),i(e).toHaveBeenCalledTimes(2)})});
2
2
  //# sourceMappingURL=funnel.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"funnel.test.js","names":[],"sources":["../src/funnel.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from 'vitest';\nimport { constant } from './constant';\nimport { doNothing } from './do-nothing';\nimport { funnel } from './funnel';\nimport { sleep } from './sleep';\n\n/**\n * We need some non-trivial duration to use in all our tests, to abstract the\n * actual chosen value we use this UnitOfTime (UT) constant. As long as it is a\n * positive integer, the actual value doesn't matter (but the larger it is,\n * the longer the tests would take to run). The number is in milliseconds.\n */\nconst UT = 16;\n\n// We use this reducer to collect arguments from each invocation so we can test what the function was invoked with.\nfunction ARGS_COLLECTOR(accumulator: ReadonlyArray<string> | undefined, item: string): ReadonlyArray<string> {\n return accumulator === undefined ? [item] : [...accumulator, item];\n}\n\ndescribe('reducer behavior', () => {\n it('passes the reduced arg to the executor', () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: constant('hello world'),\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call();\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith('hello world');\n });\n\n it('reduces call args', async () => {\n const mockFn = vi.fn((_total: number): void => {\n /* do nothing */\n });\n\n const foo = funnel(mockFn, {\n reducer: (total, item: number) => (total ?? 0) + item,\n minQuietPeriodMs: 2 * UT,\n triggerAt: 'end',\n });\n foo.call(1);\n foo.call(2);\n foo.call(3);\n await sleep(UT);\n foo.call(4);\n foo.call(5);\n foo.call(6);\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(21 /* 1 + 2 + ... + 6 */);\n });\n\n it('does not invoke if reduceArgs returns undefined', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: constant(undefined),\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call();\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n });\n\n it('supports multiple arguments', () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: (ret: unknown, a: number, b: string, c: boolean) => [\n ret,\n a,\n b,\n c,\n ],\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call(1, 'a', true);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith([undefined, 1, 'a', true]);\n });\n\n it('reducer isn\\'t called again when \\'invokedAt: start\\'', async () => {\n const mockFn = vi.fn(ARGS_COLLECTOR);\n const foo = funnel(doNothing(), {\n reducer: mockFn,\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(undefined, 'a');\n\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n});\n\ndescribe('non-trivial (>0ms) timer duration', () => {\n describe('delay timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minGapMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('d');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('invocations in the middle of a window', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0.75 * UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0.75 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n });\n\n describe('burst timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('d');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(4);\n expect(mockFn).toHaveBeenLastCalledWith(['e', 'f']);\n });\n\n it('invokedAt: end', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n foo.call('e');\n foo.call('f');\n foo.call('g');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['e', 'f', 'g']);\n });\n\n it('invocations in the middle of a window', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0.9 * UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0.1 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c', 'd', 'e', 'f']);\n });\n\n it('maxBurstDurationMs limits the burst duration', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minQuietPeriodMs: UT,\n maxBurstDurationMs: 2 * UT,\n triggerAt: 'end',\n });\n foo.call('a');\n await sleep(0.75 * UT);\n foo.call('b');\n await sleep(0.75 * UT);\n foo.call('c');\n\n // Total time is approximately 1.5*UT, less than 2UT which is\n // maxBurstDurationMs\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n // We sleep less than minQuietPeriodMs but more than our\n // maxBurstDurationMs so that we validate that the burst is being ended\n // prematurely.\n await sleep(0.75 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n });\n });\n\n describe('both timers', () => {\n it('delay is longer than burst', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: 2 * UT,\n minQuietPeriodMs: UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n\n it('burst is longer than delay', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: UT,\n minQuietPeriodMs: 2 * UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n\n it('burst and delay are equal', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: UT,\n minQuietPeriodMs: UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('delay and maxBurstDurationMs are equal', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: UT,\n minQuietPeriodMs: 2 * UT,\n maxBurstDurationMs: UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n });\n});\n\ndescribe('immediate (===0) timer durations', () => {\n describe('delay timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minGapMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('with a non-trivial burst timer', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n });\n });\n\n describe('burst timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(4);\n expect(mockFn).toHaveBeenLastCalledWith(['e', 'f']);\n });\n\n it('invokedAt: end', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('with a non-trivial delay timer', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: UT,\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n });\n\n it('burst timer with non-trivial maxBurstDuration', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minQuietPeriodMs: 0,\n maxBurstDurationMs: UT,\n triggerAt: 'end',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n });\n });\n\n it('both timers', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n\n it('maxBurstDurationMs = 0 limits the burst immediately', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n maxBurstDurationMs: 0,\n });\n foo.call('a');\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n });\n\n it('all timeouts zero', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n minQuietPeriodMs: 0,\n maxBurstDurationMs: 0,\n });\n foo.call('a');\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n });\n});\n\ndescribe('default minQuietPeriodMs === 0 when minGapMs is not defined', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['c']);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['c']);\n });\n});\n\ndescribe('utility functions', () => {\n describe('flush', () => {\n it('flush triggers an immediate invocation', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n foo.flush();\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n\n it('flush during active burst', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: 2 * UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n await sleep(UT);\n\n foo.flush();\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('cancel', () => {\n it('cancel prevents invocation', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n foo.cancel();\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n });\n\n it('cancel during delay period', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minGapMs: 2 * UT,\n });\n foo.call('a');\n foo.call('b');\n\n await sleep(UT);\n foo.cancel();\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('isIdle', () => {\n it('isIdle reflects the funnel\\'s state', () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n\n expect(foo.isIdle).toBe(true);\n\n foo.call('a');\n\n expect(foo.isIdle).toBe(false);\n\n foo.cancel();\n\n expect(foo.isIdle).toBe(true);\n });\n\n it('isIdle works when burst duration is 0', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: 0,\n });\n\n expect(foo.isIdle).toBe(true);\n\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(foo.isIdle).toBe(false);\n\n await sleep(0);\n\n expect(foo.isIdle).toBe(true);\n });\n });\n});\n\ndescribe('edge-cases', () => {\n it('bursts that start late don\\'t prevent delayed invocations', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: UT,\n minGapMs: 2 * UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n // We expect the function to be called once because we invoke it both at\n // the start and end of the blackout periods.\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(1.5 * UT);\n\n // But because our delay time is still longer, we still expect that the\n // function hasn't been called yet again for the end of the blackout period.\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0.5 * UT);\n\n // After the delay is over we expect the function to be invoked again for\n // the end of the blackout period.\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n\n it('delay timeouts don\\'t cause an invocation in the middle of bursts', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: 2 * UT,\n minGapMs: UT,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n foo.call('d');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"funnel.test.js","names":[],"sources":["../src/funnel.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from 'vitest';\nimport { constant } from './constant';\nimport { doNothing } from './do-nothing';\nimport { funnel } from './funnel';\nimport { sleep } from './sleep';\n\n/**\n * We need some non-trivial duration to use in all our tests, to abstract the\n * actual chosen value we use this UnitOfTime (UT) constant. As long as it is a\n * positive integer, the actual value doesn't matter (but the larger it is,\n * the longer the tests would take to run). The number is in milliseconds.\n */\nconst UT = 16;\n\n// We use this reducer to collect arguments from each invocation so we can test what the function was invoked with.\nfunction ARGS_COLLECTOR(accumulator: ReadonlyArray<string> | undefined, item: string): ReadonlyArray<string> {\n return accumulator === undefined ? [item] : [...accumulator, item];\n}\n\ndescribe('reducer behavior', () => {\n it('passes the reduced arg to the executor', () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: constant('hello world'),\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call();\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith('hello world');\n });\n\n it('reduces call args', async () => {\n const mockFn = vi.fn((_total: number): void => {\n /* do nothing */\n });\n\n const foo = funnel(mockFn, {\n reducer: (total, item: number) => (total ?? 0) + item,\n minQuietPeriodMs: 2 * UT,\n triggerAt: 'end',\n });\n foo.call(1);\n foo.call(2);\n foo.call(3);\n await sleep(UT);\n foo.call(4);\n foo.call(5);\n foo.call(6);\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(21 /* 1 + 2 + ... + 6 */);\n });\n\n it('does not invoke if reduceArgs returns undefined', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: constant(undefined),\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call();\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n });\n\n it('supports multiple arguments', () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: (ret: unknown, a: number, b: string, c: boolean) => [\n ret,\n a,\n b,\n c,\n ],\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call(1, 'a', true);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith([undefined, 1, 'a', true]);\n });\n\n it('reducer isn\\'t called again when \\'invokedAt: start\\'', async () => {\n const mockFn = vi.fn(ARGS_COLLECTOR);\n const foo = funnel(doNothing(), {\n reducer: mockFn,\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(undefined, 'a');\n\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n});\n\ndescribe('non-trivial (>0ms) timer duration', () => {\n describe('delay timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minGapMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('d');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('invocations in the middle of a window', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0.75 * UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0.75 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n });\n\n describe('burst timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('d');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(4);\n expect(mockFn).toHaveBeenLastCalledWith(['e', 'f']);\n });\n\n it('invokedAt: end', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n foo.call('e');\n foo.call('f');\n foo.call('g');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['e', 'f', 'g']);\n });\n\n it('invocations in the middle of a window', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0.9 * UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0.1 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c', 'd', 'e', 'f']);\n });\n\n it('maxBurstDurationMs limits the burst duration', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minQuietPeriodMs: UT,\n maxBurstDurationMs: 2 * UT,\n triggerAt: 'end',\n });\n foo.call('a');\n await sleep(0.75 * UT);\n foo.call('b');\n await sleep(0.75 * UT);\n foo.call('c');\n\n // Total time is approximately 1.5*UT, less than 2UT which is\n // maxBurstDurationMs\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n // We sleep less than minQuietPeriodMs but more than our\n // maxBurstDurationMs so that we validate that the burst is being ended\n // prematurely.\n await sleep(0.75 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n });\n });\n\n describe('both timers', () => {\n it('delay is longer than burst', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: 2 * UT,\n minQuietPeriodMs: UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n\n it('burst is longer than delay', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: UT,\n minQuietPeriodMs: 2 * UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n\n it('burst and delay are equal', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: UT,\n minQuietPeriodMs: UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('delay and maxBurstDurationMs are equal', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minGapMs: UT,\n minQuietPeriodMs: 2 * UT,\n maxBurstDurationMs: UT,\n triggerAt: 'both',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n });\n});\n\ndescribe('immediate (===0) timer durations', () => {\n describe('delay timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minGapMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('with a non-trivial burst timer', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n });\n });\n\n describe('burst timer', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n // \"b\" and \"c\" have been ignored because the funnel is only configured to\n // run the function at the start of the delay window, meaning anything\n // after that is simply dropped.\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['d']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(4);\n expect(mockFn).toHaveBeenLastCalledWith(['e', 'f']);\n });\n\n it('invokedAt: end', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['d', 'e', 'f']);\n });\n\n it('with a non-trivial delay timer', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: UT,\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n });\n\n it('burst timer with non-trivial maxBurstDuration', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n minQuietPeriodMs: 0,\n maxBurstDurationMs: UT,\n triggerAt: 'end',\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n });\n });\n\n it('both timers', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n minQuietPeriodMs: 0,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n\n it('maxBurstDurationMs = 0 limits the burst immediately', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n maxBurstDurationMs: 0,\n });\n foo.call('a');\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n });\n\n it('all timeouts zero', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minGapMs: 0,\n minQuietPeriodMs: 0,\n maxBurstDurationMs: 0,\n });\n foo.call('a');\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n });\n});\n\ndescribe('default minQuietPeriodMs === 0 when minGapMs is not defined', () => {\n it('invokedAt: start', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['c']);\n });\n\n it('invokedAt: both', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b']);\n\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(3);\n expect(mockFn).toHaveBeenLastCalledWith(['c']);\n });\n});\n\ndescribe('utility functions', () => {\n describe('flush', () => {\n it('flush triggers an immediate invocation', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n foo.flush();\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n\n it('flush during active burst', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: 2 * UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n await sleep(UT);\n\n foo.flush();\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a', 'b', 'c']);\n\n await sleep(2 * UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('cancel', () => {\n it('cancel prevents invocation', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n foo.cancel();\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(0);\n });\n\n it('cancel during delay period', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'start',\n minGapMs: 2 * UT,\n });\n foo.call('a');\n foo.call('b');\n\n await sleep(UT);\n foo.cancel();\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('isIdle', () => {\n it('isIdle reflects the funnel\\'s state', () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: UT,\n });\n\n expect(foo.isIdle).toBe(true);\n\n foo.call('a');\n\n expect(foo.isIdle).toBe(false);\n\n foo.cancel();\n\n expect(foo.isIdle).toBe(true);\n });\n\n it('isIdle works when burst duration is 0', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'end',\n minQuietPeriodMs: 0,\n });\n\n expect(foo.isIdle).toBe(true);\n\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n expect(foo.isIdle).toBe(false);\n\n await sleep(0);\n\n expect(foo.isIdle).toBe(true);\n });\n });\n});\n\ndescribe('edge-cases', () => {\n it('bursts that start late don\\'t prevent delayed invocations', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: UT,\n minGapMs: 2 * UT,\n });\n foo.call('a');\n foo.call('b');\n foo.call('c');\n\n // We expect the function to be called once because we invoke it both at\n // the start and end of the blackout periods.\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(1.5 * UT);\n\n // But because our delay time is still longer, we still expect that the\n // function hasn't been called yet again for the end of the blackout period.\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n foo.call('d');\n foo.call('e');\n foo.call('f');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(0.5 * UT);\n\n // After the delay is over we expect the function to be invoked again for\n // the end of the blackout period.\n expect(mockFn).toHaveBeenCalledTimes(2);\n expect(mockFn).toHaveBeenLastCalledWith(['b', 'c', 'd', 'e', 'f']);\n });\n\n it('delay timeouts don\\'t cause an invocation in the middle of bursts', async () => {\n const mockFn = vi.fn();\n const foo = funnel(mockFn, {\n reducer: ARGS_COLLECTOR,\n triggerAt: 'both',\n minQuietPeriodMs: 2 * UT,\n minGapMs: UT,\n });\n foo.call('a');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n expect(mockFn).toHaveBeenLastCalledWith(['a']);\n\n await sleep(UT);\n foo.call('b');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n foo.call('c');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n foo.call('d');\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(1);\n\n await sleep(UT);\n\n expect(mockFn).toHaveBeenCalledTimes(2);\n });\n});\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { t as IterableContainer } from "./iterable-container-OFsaw8WL.cjs";
2
- import { t as TupleParts } from "./tuple-parts-BJQEORxn.cjs";
3
- import { t as BoundedPartial } from "./bounded-partial-D6ouPlXl.cjs";
4
- import { t as FilteredArray } from "./filtered-array-D_RqQ8tX.cjs";
5
- import { t as ArrayRequiredPrefix } from "./array-required-prefix-DxzEAAwi.cjs";
1
+ import { t as IterableContainer } from "./iterable-container-1TN3AJ3s.cjs";
2
+ import { t as TupleParts } from "./tuple-parts-CzQQupgi.cjs";
3
+ import { t as BoundedPartial } from "./bounded-partial-CtOsGqxa.cjs";
4
+ import { t as FilteredArray } from "./filtered-array-C--8loav.cjs";
5
+ import { t as ArrayRequiredPrefix } from "./array-required-prefix-BFDM7eSS.cjs";
6
6
  import { AllUnionFields, ConditionalKeys, EmptyObject, IsNever, Or, Simplify } from "type-fest";
7
7
 
8
8
  //#region src/group-by-prop.d.ts
@@ -40,9 +40,9 @@ type CoercedNonEmptyValues<T extends Record<PropertyKey, IterableContainer>> = {
40
40
  * @param data - The items to group.
41
41
  * @param prop - The property name to group by.
42
42
  * @signature
43
- * P.groupByProp(data, prop)
43
+ * R.groupByProp(data, prop)
44
44
  * @example
45
- * const result = P.groupByProp(
45
+ * const result = R.groupByProp(
46
46
  * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }
47
47
  * [{ a: 'cat' }, { a: 'dog' }] as const,
48
48
  * 'a',
@@ -73,12 +73,12 @@ declare function groupByProp<T extends IterableContainer, const Prop extends Gro
73
73
  *
74
74
  * @param prop - The property name to group by.
75
75
  * @signature
76
- * P.groupByProp(prop)(data);
76
+ * R.groupByProp(prop)(data);
77
77
  * @example
78
- * const result = P.pipe(
78
+ * const result = R.pipe(
79
79
  * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }
80
80
  * [{ a: 'cat' }, { a: 'dog' }] as const,
81
- * P.groupByProp('a'),
81
+ * R.groupByProp('a'),
82
82
  * );
83
83
  * @dataLast
84
84
  * @category Array
@@ -1,8 +1,8 @@
1
- import { t as IterableContainer } from "./iterable-container-BdjPuIjL.js";
2
- import { t as TupleParts } from "./tuple-parts-Bhbm4jiu.js";
3
- import { t as BoundedPartial } from "./bounded-partial-DBIIClPU.js";
4
- import { t as FilteredArray } from "./filtered-array-Yij-X3T4.js";
5
- import { t as ArrayRequiredPrefix } from "./array-required-prefix-CefHtaKs.js";
1
+ import { t as IterableContainer } from "./iterable-container-Dv5vSKht.js";
2
+ import { t as TupleParts } from "./tuple-parts-BYI4o8Vk.js";
3
+ import { t as BoundedPartial } from "./bounded-partial-CPc1XU57.js";
4
+ import { t as FilteredArray } from "./filtered-array-wtIEwdU7.js";
5
+ import { t as ArrayRequiredPrefix } from "./array-required-prefix-DwpaLy0D.js";
6
6
  import { AllUnionFields, ConditionalKeys, EmptyObject, IsNever, Or, Simplify } from "type-fest";
7
7
 
8
8
  //#region src/group-by-prop.d.ts
@@ -40,9 +40,9 @@ type CoercedNonEmptyValues<T extends Record<PropertyKey, IterableContainer>> = {
40
40
  * @param data - The items to group.
41
41
  * @param prop - The property name to group by.
42
42
  * @signature
43
- * P.groupByProp(data, prop)
43
+ * R.groupByProp(data, prop)
44
44
  * @example
45
- * const result = P.groupByProp(
45
+ * const result = R.groupByProp(
46
46
  * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }
47
47
  * [{ a: 'cat' }, { a: 'dog' }] as const,
48
48
  * 'a',
@@ -73,12 +73,12 @@ declare function groupByProp<T extends IterableContainer, const Prop extends Gro
73
73
  *
74
74
  * @param prop - The property name to group by.
75
75
  * @signature
76
- * P.groupByProp(prop)(data);
76
+ * R.groupByProp(prop)(data);
77
77
  * @example
78
- * const result = P.pipe(
78
+ * const result = R.pipe(
79
79
  * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }
80
80
  * [{ a: 'cat' }, { a: 'dog' }] as const,
81
- * P.groupByProp('a'),
81
+ * R.groupByProp('a'),
82
82
  * );
83
83
  * @dataLast
84
84
  * @category Array
@@ -1,2 +1,2 @@
1
- import{t as e}from"./curry-BcQ8Up1_.js";function t(...t){return e(n,t)}function n(e,t){let n=Object.create(null);for(let r of e){let e=r?.[t];if(e!==void 0){let t=n[e];t===void 0?n[e]=[r]:t.push(r)}}return Object.setPrototypeOf(n,Object.prototype),n}export{t as groupByProp};
1
+ import{t as e}from"./curry-NmniqyJ0.js";function t(...t){return e(n,t)}function n(e,t){let n=Object.create(null);for(let r of e){let e=r?.[t];if(e!==void 0){let t=n[e];t===void 0?n[e]=[r]:t.push(r)}}return Object.setPrototypeOf(n,Object.prototype),n}export{t as groupByProp};
2
2
  //# sourceMappingURL=group-by-prop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"group-by-prop.js","names":["output: BoundedPartial<\n Record<AllPropValues<T, Prop>, Array<T[number]>>\n >"],"sources":["../src/group-by-prop.ts"],"sourcesContent":["import type {\n AllUnionFields,\n ConditionalKeys,\n EmptyObject,\n IsNever,\n Or,\n Simplify,\n} from 'type-fest';\nimport type { ArrayRequiredPrefix } from './internal/types/array-required-prefix';\nimport type { BoundedPartial } from './internal/types/bounded-partial';\nimport type { FilteredArray } from './internal/types/filtered-array';\nimport type { IterableContainer } from './internal/types/iterable-container';\nimport type { TupleParts } from './internal/types/tuple-parts';\nimport { curry } from './curry';\n\ntype GroupByProp<T extends IterableContainer, Prop extends GroupableProps<T>>\n // Distribute unions.\n = T extends unknown\n ? FixEmptyObject<EnsureValuesAreNonEmpty<GroupByPropRaw<T, Prop>>>\n : never;\n\n// For each possible value of the prop we filter the input tuple with the prop\n// assigned to the value, e.g. `{ type: \"cat\" }`\ntype GroupByPropRaw<\n T extends IterableContainer,\n Prop extends GroupableProps<T>,\n> = {\n [Value in AllPropValues<T, Prop>]: FilteredArray<T, Record<Prop, Value>>;\n};\n\n// We can only group by props that only have values that could be used to key\n// an object (i.e. PropertyKey), or if they are undefined (which would filter\n// them out of the grouping).\ntype GroupableProps<T extends IterableContainer> = ConditionalKeys<\n ItemsSuperObject<T>,\n PropertyKey | undefined\n>;\n\n// The union of all possible values that the prop could have within the tuple.\ntype AllPropValues<\n T extends IterableContainer,\n Prop extends GroupableProps<T>,\n> = Extract<ItemsSuperObject<T>[Prop], PropertyKey>;\n\n// Creates a singular object type that all items in the tuple would extend. This\n// provides us a way to check, for each prop, what are all values it would\n// have within the tuple. We use this to map which props are candidates for\n// grouping, and when a prop is selected, the full list of values that would\n// exist in the output. For example:\n// `{ a: number, b: \"cat\", c: string } | { b: \"dog\", c: Date }` is groupable\n// by 'a' and 'b', but not 'c', and when selecting by 'b', the output would\n// have a prop for \"cat\" and a prop for \"dog\".\ntype ItemsSuperObject<T extends IterableContainer> = AllUnionFields<\n // If the input tuple contains optional elements they would add `undefined` to\n // T[number] (and could technically show up in the array itself). Because\n // undefined breaks AllUnionFields we need to remove it from the union. This\n // is OK because we handle this in the implementation too.\n Exclude<T[number], undefined>\n>;\n\n// When the input array is empty the constructed result type would be `{}`\n// because our mapped type would never run; but this doesn't represent the\n// semantics of the return value for that case, because it effectively means\n// \"any object\" and not \"empty object\". This can happen in 2 situations:\n// A union of tuples where one of the tuples doesn't have any item with the\n// groupable prop, or when the groupable prop has a value of `undefined` for\n// all items. The former is extra problematic because it would add `| {}` to the\n// result type which effectively cancels out all other parts of the union.\ntype FixEmptyObject<T> = IsNever<keyof T> extends true ? EmptyObject : T;\n\n// Group by can never return an empty tuple but our filtered arrays might not\n// represent that. We need to reshape the tuples so that they always have at\n// least one item in them.\ntype EnsureValuesAreNonEmpty<T extends Record<PropertyKey, IterableContainer>>\n = Simplify<\n Omit<T, PossiblyEmptyArrayKeys<T>>\n & BoundedPartial<CoercedNonEmptyValues<Pick<T, PossiblyEmptyArrayKeys<T>>>>\n >;\n\n// Go over the keys the object and return those that their value can accept an\n// empty array.\ntype PossiblyEmptyArrayKeys<T extends Record<PropertyKey, IterableContainer>>\n = keyof T extends infer Key extends unknown\n ? Key extends keyof T\n ? IsNonEmptyArray<T[Key]> extends true\n ? never\n : Key\n : never\n : never;\n\n// An array is non-empty if any of the fixed parts are non-empty.\ntype IsNonEmptyArray<T extends IterableContainer> = Or<\n IsNonEmptyFixedTuple<TupleParts<T>['required']>,\n IsNonEmptyFixedTuple<TupleParts<T>['suffix']>\n>;\n\n// A fixed tuple (one without optional or a rest element in it) is non-empty if\n// we can't extract the empty tuple from it.\ntype IsNonEmptyFixedTuple<T> = IsNever<Extract<T, readonly []>>;\n\n// We coerce the arbitrary array values to have a prefix of at least one item.\ntype CoercedNonEmptyValues<T extends Record<PropertyKey, IterableContainer>> = {\n [P in keyof T]: ArrayRequiredPrefix<T[P], 1>;\n};\n\n/**\n * Groups the elements of an array of objects based on the values of a\n * specified property of those objects. The result would contain a property for\n * each unique value of the specific property, with it's value being the input\n * array filtered to only items that have that property set to that value.\n * For any object where the property is missing, or if it's value is\n * `undefined` the item would be filtered out.\n *\n * The grouping property is enforced at the type level to exist in at least one\n * item and to never have a value that cannot be used as an object key (e.g. it\n * must be `PropertyKey | undefined`).\n *\n * The resulting arrays are filtered with the prop and it's value as a\n * type-guard, effectively narrowing the items in each output arrays. This\n * means that when the grouping property is the discriminator of a\n * discriminated union type each output array would contain just the subtype for\n * that value.\n *\n * If you need more control over the grouping you should use `groupBy` instead.\n *\n * @param data - The items to group.\n * @param prop - The property name to group by.\n * @signature\n * P.groupByProp(data, prop)\n * @example\n * const result = P.groupByProp(\n * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }\n * [{ a: 'cat' }, { a: 'dog' }] as const,\n * 'a',\n * );\n * @dataFirst\n * @category Array\n */\nexport function groupByProp<\n T extends IterableContainer,\n const Prop extends GroupableProps<T>,\n>(data: T, prop: Prop): GroupByProp<T, Prop>;\n\n/**\n * Groups the elements of an array of objects based on the values of a\n * specified property of those objects. The result would contain a property for\n * each unique value of the specific property, with it's value being the input\n * array filtered to only items that have that property set to that value.\n * For any object where the property is missing, or if it's value is\n * `undefined` the item would be filtered out.\n *\n * The grouping property is enforced at the type level to exist in at least one\n * item and to never have a value that cannot be used as an object key (e.g. it\n * must be `PropertyKey | undefined`).\n *\n * The resulting arrays are filtered with the prop and it's value as a\n * type-guard, effectively narrowing the items in each output arrays. This\n * means that when the grouping property is the discriminator of a\n * discriminated union type each output array would contain just the subtype for\n * that value.\n *\n * If you need more control over the grouping you should use `groupBy` instead.\n *\n * @param prop - The property name to group by.\n * @signature\n * P.groupByProp(prop)(data);\n * @example\n * const result = P.pipe(\n * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }\n * [{ a: 'cat' }, { a: 'dog' }] as const,\n * P.groupByProp('a'),\n * );\n * @dataLast\n * @category Array\n */\nexport function groupByProp<\n T extends IterableContainer,\n const Prop extends GroupableProps<T>,\n>(prop: Prop): (data: T) => GroupByProp<T, Prop>;\n\nexport function groupByProp(...args: ReadonlyArray<unknown>): unknown {\n return curry(groupByPropImplementation, args);\n}\n\nfunction groupByPropImplementation<\n T extends IterableContainer,\n Prop extends GroupableProps<T>,\n>(data: T, prop: Prop): GroupByProp<T, Prop> {\n const output: BoundedPartial<\n Record<AllPropValues<T, Prop>, Array<T[number]>>\n > = Object.create(null);\n\n for (const item of data) {\n // @ts-expect-error [ts18046] -- `item` should be typed `T[number]` but TypeScript isn't inferring that correctly here, in fact, the item could also be typed as ItemsSuperObject<T> because it extends from it. When item is typed as such this error goes away, maybe in the future TypeScript would be able to infer this by itself.\n\n const key = item?.[prop];\n if (key !== undefined) {\n // Once the prototype chain is fixed, it is safe to access the prop\n // directly without needing to check existence or types.\n // @ts-expect-error [ts7053] -- `key` should be typed `AllPropValues<T, Prop>` but TypeScript isn't inferring that correctly, causing an error when we try to access this prop on the output object.\n const items = output[key];\n\n if (items === undefined) {\n // It is more performant to create a 1-element array over creating an\n // empty array and falling through to a unified the push. It is also\n // more performant to mutate the existing object over using spread to\n // continually create new objects on every unique key.\n // @ts-expect-error [ts7053] -- For the same reasons as mentioned above, TypeScript isn't inferring `key` correctly, and therefore is erroring when trying to access the output object using it.\n output[key] = [item];\n } else {\n // It is more performant to add the items to an existing array instead\n // of creating a new array via spreading every time we add an item to\n // it (e.g., `[...current, item]`).\n items.push(item);\n }\n }\n }\n\n // Set the prototype as if we initialized our object as a normal object (e.g.\n // `{}`). Without this none of the built-in object methods like `toString`\n // would work on this object and it would act differently than expected.\n Object.setPrototypeOf(output, Object.prototype);\n\n // @ts-expect-error [ts2322] -- This is fine! We use a broader type for output while we build it because it more accurately represents the shape of the object *while it is being built*. TypeScript can't tell that we finished building the object so can't ensure that output matches the expected output at this point.\n return output;\n}\n"],"mappings":"wCAoLA,SAAgB,EAAY,GAAG,EAAuC,CACpE,OAAO,EAAM,EAA2B,EAAK,CAG/C,SAAS,EAGP,EAAS,EAAkC,CAC3C,IAAMA,EAEF,OAAO,OAAO,KAAK,CAEvB,IAAK,IAAM,KAAQ,EAAM,CAGvB,IAAM,EAAM,IAAO,GACnB,GAAI,IAAQ,IAAA,GAAW,CAIrB,IAAM,EAAQ,EAAO,GAEjB,IAAU,IAAA,GAMZ,EAAO,GAAO,CAAC,EAAK,CAKpB,EAAM,KAAK,EAAK,EAWtB,OAHA,OAAO,eAAe,EAAQ,OAAO,UAAU,CAGxC"}
1
+ {"version":3,"file":"group-by-prop.js","names":["output: BoundedPartial<\n Record<AllPropValues<T, Prop>, Array<T[number]>>\n >"],"sources":["../src/group-by-prop.ts"],"sourcesContent":["import type {\n AllUnionFields,\n ConditionalKeys,\n EmptyObject,\n IsNever,\n Or,\n Simplify,\n} from 'type-fest';\nimport type { ArrayRequiredPrefix } from './internal/types/array-required-prefix';\nimport type { BoundedPartial } from './internal/types/bounded-partial';\nimport type { FilteredArray } from './internal/types/filtered-array';\nimport type { IterableContainer } from './internal/types/iterable-container';\nimport type { TupleParts } from './internal/types/tuple-parts';\nimport { curry } from './curry';\n\ntype GroupByProp<T extends IterableContainer, Prop extends GroupableProps<T>>\n // Distribute unions.\n = T extends unknown\n ? FixEmptyObject<EnsureValuesAreNonEmpty<GroupByPropRaw<T, Prop>>>\n : never;\n\n// For each possible value of the prop we filter the input tuple with the prop\n// assigned to the value, e.g. `{ type: \"cat\" }`\ntype GroupByPropRaw<\n T extends IterableContainer,\n Prop extends GroupableProps<T>,\n> = {\n [Value in AllPropValues<T, Prop>]: FilteredArray<T, Record<Prop, Value>>;\n};\n\n// We can only group by props that only have values that could be used to key\n// an object (i.e. PropertyKey), or if they are undefined (which would filter\n// them out of the grouping).\ntype GroupableProps<T extends IterableContainer> = ConditionalKeys<\n ItemsSuperObject<T>,\n PropertyKey | undefined\n>;\n\n// The union of all possible values that the prop could have within the tuple.\ntype AllPropValues<\n T extends IterableContainer,\n Prop extends GroupableProps<T>,\n> = Extract<ItemsSuperObject<T>[Prop], PropertyKey>;\n\n// Creates a singular object type that all items in the tuple would extend. This\n// provides us a way to check, for each prop, what are all values it would\n// have within the tuple. We use this to map which props are candidates for\n// grouping, and when a prop is selected, the full list of values that would\n// exist in the output. For example:\n// `{ a: number, b: \"cat\", c: string } | { b: \"dog\", c: Date }` is groupable\n// by 'a' and 'b', but not 'c', and when selecting by 'b', the output would\n// have a prop for \"cat\" and a prop for \"dog\".\ntype ItemsSuperObject<T extends IterableContainer> = AllUnionFields<\n // If the input tuple contains optional elements they would add `undefined` to\n // T[number] (and could technically show up in the array itself). Because\n // undefined breaks AllUnionFields we need to remove it from the union. This\n // is OK because we handle this in the implementation too.\n Exclude<T[number], undefined>\n>;\n\n// When the input array is empty the constructed result type would be `{}`\n// because our mapped type would never run; but this doesn't represent the\n// semantics of the return value for that case, because it effectively means\n// \"any object\" and not \"empty object\". This can happen in 2 situations:\n// A union of tuples where one of the tuples doesn't have any item with the\n// groupable prop, or when the groupable prop has a value of `undefined` for\n// all items. The former is extra problematic because it would add `| {}` to the\n// result type which effectively cancels out all other parts of the union.\ntype FixEmptyObject<T> = IsNever<keyof T> extends true ? EmptyObject : T;\n\n// Group by can never return an empty tuple but our filtered arrays might not\n// represent that. We need to reshape the tuples so that they always have at\n// least one item in them.\ntype EnsureValuesAreNonEmpty<T extends Record<PropertyKey, IterableContainer>>\n = Simplify<\n Omit<T, PossiblyEmptyArrayKeys<T>>\n & BoundedPartial<CoercedNonEmptyValues<Pick<T, PossiblyEmptyArrayKeys<T>>>>\n >;\n\n// Go over the keys the object and return those that their value can accept an\n// empty array.\ntype PossiblyEmptyArrayKeys<T extends Record<PropertyKey, IterableContainer>>\n = keyof T extends infer Key extends unknown\n ? Key extends keyof T\n ? IsNonEmptyArray<T[Key]> extends true\n ? never\n : Key\n : never\n : never;\n\n// An array is non-empty if any of the fixed parts are non-empty.\ntype IsNonEmptyArray<T extends IterableContainer> = Or<\n IsNonEmptyFixedTuple<TupleParts<T>['required']>,\n IsNonEmptyFixedTuple<TupleParts<T>['suffix']>\n>;\n\n// A fixed tuple (one without optional or a rest element in it) is non-empty if\n// we can't extract the empty tuple from it.\ntype IsNonEmptyFixedTuple<T> = IsNever<Extract<T, readonly []>>;\n\n// We coerce the arbitrary array values to have a prefix of at least one item.\ntype CoercedNonEmptyValues<T extends Record<PropertyKey, IterableContainer>> = {\n [P in keyof T]: ArrayRequiredPrefix<T[P], 1>;\n};\n\n/**\n * Groups the elements of an array of objects based on the values of a\n * specified property of those objects. The result would contain a property for\n * each unique value of the specific property, with it's value being the input\n * array filtered to only items that have that property set to that value.\n * For any object where the property is missing, or if it's value is\n * `undefined` the item would be filtered out.\n *\n * The grouping property is enforced at the type level to exist in at least one\n * item and to never have a value that cannot be used as an object key (e.g. it\n * must be `PropertyKey | undefined`).\n *\n * The resulting arrays are filtered with the prop and it's value as a\n * type-guard, effectively narrowing the items in each output arrays. This\n * means that when the grouping property is the discriminator of a\n * discriminated union type each output array would contain just the subtype for\n * that value.\n *\n * If you need more control over the grouping you should use `groupBy` instead.\n *\n * @param data - The items to group.\n * @param prop - The property name to group by.\n * @signature\n * R.groupByProp(data, prop)\n * @example\n * const result = R.groupByProp(\n * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }\n * [{ a: 'cat' }, { a: 'dog' }] as const,\n * 'a',\n * );\n * @dataFirst\n * @category Array\n */\nexport function groupByProp<\n T extends IterableContainer,\n const Prop extends GroupableProps<T>,\n>(data: T, prop: Prop): GroupByProp<T, Prop>;\n\n/**\n * Groups the elements of an array of objects based on the values of a\n * specified property of those objects. The result would contain a property for\n * each unique value of the specific property, with it's value being the input\n * array filtered to only items that have that property set to that value.\n * For any object where the property is missing, or if it's value is\n * `undefined` the item would be filtered out.\n *\n * The grouping property is enforced at the type level to exist in at least one\n * item and to never have a value that cannot be used as an object key (e.g. it\n * must be `PropertyKey | undefined`).\n *\n * The resulting arrays are filtered with the prop and it's value as a\n * type-guard, effectively narrowing the items in each output arrays. This\n * means that when the grouping property is the discriminator of a\n * discriminated union type each output array would contain just the subtype for\n * that value.\n *\n * If you need more control over the grouping you should use `groupBy` instead.\n *\n * @param prop - The property name to group by.\n * @signature\n * R.groupByProp(prop)(data);\n * @example\n * const result = R.pipe(\n * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }\n * [{ a: 'cat' }, { a: 'dog' }] as const,\n * R.groupByProp('a'),\n * );\n * @dataLast\n * @category Array\n */\nexport function groupByProp<\n T extends IterableContainer,\n const Prop extends GroupableProps<T>,\n>(prop: Prop): (data: T) => GroupByProp<T, Prop>;\n\nexport function groupByProp(...args: ReadonlyArray<unknown>): unknown {\n return curry(groupByPropImplementation, args);\n}\n\nfunction groupByPropImplementation<\n T extends IterableContainer,\n Prop extends GroupableProps<T>,\n>(data: T, prop: Prop): GroupByProp<T, Prop> {\n const output: BoundedPartial<\n Record<AllPropValues<T, Prop>, Array<T[number]>>\n > = Object.create(null);\n\n for (const item of data) {\n const key = item?.[prop];\n if (key !== undefined) {\n // Once the prototype chain is fixed, it is safe to access the prop\n // directly without needing to check existence or types.\n const items = output[key];\n\n if (items === undefined) {\n // It is more performant to create a 1-element array over creating an\n // empty array and falling through to a unified the push. It is also\n // more performant to mutate the existing object over using spread to\n // continually create new objects on every unique key.\n // @ts-expect-error [ts7053] -- For the same reasons as mentioned above, TypeScript isn't inferring `key` correctly, and therefore is erroring when trying to access the output object using it.\n output[key] = [item];\n } else {\n // It is more performant to add the items to an existing array instead\n // of creating a new array via spreading every time we add an item to\n // it (e.g., `[...current, item]`).\n // @ts-expect-error [ts2339] -- `items` is still `never`.\n items.push(item);\n }\n }\n }\n\n // Set the prototype as if we initialized our object as a normal object (e.g.\n // `{}`). Without this none of the built-in object methods like `toString`\n // would work on this object and it would act differently than expected.\n Object.setPrototypeOf(output, Object.prototype);\n\n // @ts-expect-error [ts2322] -- This is fine! We use a broader type for output while we build it because it more accurately represents the shape of the object *while it is being built*. TypeScript can't tell that we finished building the object so can't ensure that output matches the expected output at this point.\n return output;\n}\n"],"mappings":"wCAoLA,SAAgB,EAAY,GAAG,EAAuC,CACpE,OAAO,EAAM,EAA2B,EAAK,CAG/C,SAAS,EAGP,EAAS,EAAkC,CAC3C,IAAMA,EAEF,OAAO,OAAO,KAAK,CAEvB,IAAK,IAAM,KAAQ,EAAM,CACvB,IAAM,EAAM,IAAO,GACnB,GAAI,IAAQ,IAAA,GAAW,CAGrB,IAAM,EAAQ,EAAO,GAEjB,IAAU,IAAA,GAMZ,EAAO,GAAO,CAAC,EAAK,CAMpB,EAAM,KAAK,EAAK,EAWtB,OAHA,OAAO,eAAe,EAAQ,OAAO,UAAU,CAGxC"}
@@ -1,5 +1,5 @@
1
- import { t as NonEmptyArray } from "./non-empty-array-CFG7wGD-.cjs";
2
- import { t as BoundedPartial } from "./bounded-partial-D6ouPlXl.cjs";
1
+ import { t as NonEmptyArray } from "./non-empty-array-NDjbHRjk.cjs";
2
+ import { t as BoundedPartial } from "./bounded-partial-CtOsGqxa.cjs";
3
3
 
4
4
  //#region src/group-by.d.ts
5
5
 
@@ -1,5 +1,5 @@
1
- import { t as NonEmptyArray } from "./non-empty-array-DXkY7ynY.js";
2
- import { t as BoundedPartial } from "./bounded-partial-DBIIClPU.js";
1
+ import { t as NonEmptyArray } from "./non-empty-array-DHAKSw6t.js";
2
+ import { t as BoundedPartial } from "./bounded-partial-CPc1XU57.js";
3
3
 
4
4
  //#region src/group-by.d.ts
5
5
 
package/dist/group-by.js CHANGED
@@ -1,2 +1,2 @@
1
- import{t as e}from"./curry-BcQ8Up1_.js";function t(...t){return e(n,t)}function n(e,t){let n=Object.create(null);for(let r=0;r<e.length;r++){let i=e[r],a=t(i,r,e);if(a!==void 0){let e=n[a];e===void 0?n[a]=[i]:e.push(i)}}return Object.setPrototypeOf(n,Object.prototype),n}export{t as groupBy};
1
+ import{t as e}from"./curry-NmniqyJ0.js";function t(...t){return e(n,t)}function n(e,t){let n=Object.create(null);for(let r=0;r<e.length;r++){let i=e[r],a=t(i,r,e);if(a!==void 0){let e=n[a];e===void 0?n[a]=[i]:e.push(i)}}return Object.setPrototypeOf(n,Object.prototype),n}export{t as groupBy};
2
2
  //# sourceMappingURL=group-by.js.map
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./curry-NmniqyJ0.js";function t(...t){return e(n,t)}function n(e,t){return e.length>=t}export{t};
2
+ //# sourceMappingURL=has-at-least-Coy9sM-B.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"has-at-least-DyIhWZJH.js","names":[],"sources":["../src/has-at-least.ts"],"sourcesContent":["import type { IsNumericLiteral } from 'type-fest';\nimport type { ArrayRequiredPrefix } from './internal/types/array-required-prefix';\nimport type { IterableContainer } from './internal/types/iterable-container';\nimport { curry } from './curry';\n\n/**\n * Checks if the given array has at least the defined number of elements. When\n * the minimum used is a literal (e.g. `3`) the output is refined accordingly so\n * that those indices are defined when accessing the array even when using\n * typescript's 'noUncheckedIndexAccess'.\n *\n * @param data - The input array.\n * @param minimum - The minimum number of elements the array must have.\n * @returns True if the array's length is *at least* `minimum`. When `minimum`\n * is a literal value, the output is narrowed to ensure the first items are\n * guaranteed.\n * @signature\n * P.hasAtLeast(data, minimum)\n * @example\n * P.hasAtLeast([], 4); // => false\n *\n * const data: number[] = [1,2,3,4];\n * P.hasAtLeast(data, 1); // => true\n * data[0]; // 1, with type `number`\n * @dataFirst\n * @category Array\n */\nexport function hasAtLeast<T extends IterableContainer, N extends number>(\n data: IterableContainer | T,\n minimum: IsNumericLiteral<N> extends true ? N : never,\n): data is ArrayRequiredPrefix<T, N>;\nexport function hasAtLeast(data: IterableContainer, minimum: number): boolean;\n\n/**\n * Checks if the given array has at least the defined number of elements. When\n * the minimum used is a literal (e.g. `3`) the output is refined accordingly so\n * that those indices are defined when accessing the array even when using\n * typescript's 'noUncheckedIndexAccess'.\n *\n * @param minimum - The minimum number of elements the array must have.\n * @returns True if the array's length is *at least* `minimum`. When `minimum`\n * is a literal value, the output is narrowed to ensure the first items are\n * guaranteed.\n * @signature\n * P.hasAtLeast(minimum)(data)\n * @example\n * P.pipe([], P.hasAtLeast(4)); // => false\n *\n * const data = [[1,2], [3], [4,5]];\n * P.pipe(\n * data,\n * P.filter(P.hasAtLeast(2)),\n * P.map(([, second]) => second),\n * ); // => [2,5], with type `number[]`\n * @dataLast\n * @category Array\n */\nexport function hasAtLeast<N extends number>(\n minimum: IsNumericLiteral<N> extends true ? N : never,\n): <T extends IterableContainer>(\n data: IterableContainer | T,\n) => data is ArrayRequiredPrefix<T, N>;\nexport function hasAtLeast(\n minimum: number,\n): (data: IterableContainer) => boolean;\n\nexport function hasAtLeast(...args: ReadonlyArray<unknown>): unknown {\n return curry(hasAtLeastImplementation, args);\n}\n\nfunction hasAtLeastImplementation(\n data: IterableContainer,\n minimum: number,\n): boolean {\n return data.length >= minimum;\n}\n"],"mappings":"wCAkEA,SAAgB,EAAW,GAAG,EAAuC,CACnE,OAAO,EAAM,EAA0B,EAAK,CAG9C,SAAS,EACP,EACA,EACS,CACT,OAAO,EAAK,QAAU"}
1
+ {"version":3,"file":"has-at-least-Coy9sM-B.js","names":[],"sources":["../src/has-at-least.ts"],"sourcesContent":["import type { IsNumericLiteral } from 'type-fest';\nimport type { ArrayRequiredPrefix } from './internal/types/array-required-prefix';\nimport type { IterableContainer } from './internal/types/iterable-container';\nimport { curry } from './curry';\n\n/**\n * Checks if the given array has at least the defined number of elements. When\n * the minimum used is a literal (e.g. `3`) the output is refined accordingly so\n * that those indices are defined when accessing the array even when using\n * typescript's 'noUncheckedIndexAccess'.\n *\n * @param data - The input array.\n * @param minimum - The minimum number of elements the array must have.\n * @returns True if the array's length is *at least* `minimum`. When `minimum`\n * is a literal value, the output is narrowed to ensure the first items are\n * guaranteed.\n * @signature\n * P.hasAtLeast(data, minimum)\n * @example\n * P.hasAtLeast([], 4); // => false\n *\n * const data: number[] = [1,2,3,4];\n * P.hasAtLeast(data, 1); // => true\n * data[0]; // 1, with type `number`\n * @dataFirst\n * @category Array\n */\nexport function hasAtLeast<T extends IterableContainer, N extends number>(\n data: IterableContainer | T,\n minimum: IsNumericLiteral<N> extends true ? N : never,\n): data is ArrayRequiredPrefix<T, N>;\nexport function hasAtLeast(data: IterableContainer, minimum: number): boolean;\n\n/**\n * Checks if the given array has at least the defined number of elements. When\n * the minimum used is a literal (e.g. `3`) the output is refined accordingly so\n * that those indices are defined when accessing the array even when using\n * typescript's 'noUncheckedIndexAccess'.\n *\n * @param minimum - The minimum number of elements the array must have.\n * @returns True if the array's length is *at least* `minimum`. When `minimum`\n * is a literal value, the output is narrowed to ensure the first items are\n * guaranteed.\n * @signature\n * P.hasAtLeast(minimum)(data)\n * @example\n * P.pipe([], P.hasAtLeast(4)); // => false\n *\n * const data = [[1,2], [3], [4,5]];\n * P.pipe(\n * data,\n * P.filter(P.hasAtLeast(2)),\n * P.map(([, second]) => second),\n * ); // => [2,5], with type `number[]`\n * @dataLast\n * @category Array\n */\nexport function hasAtLeast<N extends number>(\n minimum: IsNumericLiteral<N> extends true ? N : never,\n): <T extends IterableContainer>(\n data: IterableContainer | T,\n) => data is ArrayRequiredPrefix<T, N>;\nexport function hasAtLeast(\n minimum: number,\n): (data: IterableContainer) => boolean;\n\nexport function hasAtLeast(...args: ReadonlyArray<unknown>): unknown {\n return curry(hasAtLeastImplementation, args);\n}\n\nfunction hasAtLeastImplementation(\n data: IterableContainer,\n minimum: number,\n): boolean {\n return data.length >= minimum;\n}\n"],"mappings":"wCAkEA,SAAgB,EAAW,GAAG,EAAuC,CACnE,OAAO,EAAM,EAA0B,EAAK,CAG9C,SAAS,EACP,EACA,EACS,CACT,OAAO,EAAK,QAAU"}
@@ -1,5 +1,5 @@
1
- import { t as IterableContainer } from "./iterable-container-OFsaw8WL.cjs";
2
- import { t as ArrayRequiredPrefix } from "./array-required-prefix-DxzEAAwi.cjs";
1
+ import { t as IterableContainer } from "./iterable-container-1TN3AJ3s.cjs";
2
+ import { t as ArrayRequiredPrefix } from "./array-required-prefix-BFDM7eSS.cjs";
3
3
  import { IsNumericLiteral } from "type-fest";
4
4
 
5
5
  //#region src/has-at-least.d.ts
@@ -1,5 +1,5 @@
1
- import { t as IterableContainer } from "./iterable-container-BdjPuIjL.js";
2
- import { t as ArrayRequiredPrefix } from "./array-required-prefix-CefHtaKs.js";
1
+ import { t as IterableContainer } from "./iterable-container-Dv5vSKht.js";
2
+ import { t as ArrayRequiredPrefix } from "./array-required-prefix-DwpaLy0D.js";
3
3
  import { IsNumericLiteral } from "type-fest";
4
4
 
5
5
  //#region src/has-at-least.d.ts
@@ -1 +1 @@
1
- import{t as e}from"./has-at-least-DyIhWZJH.js";export{e as hasAtLeast};
1
+ import{t as e}from"./has-at-least-Coy9sM-B.js";export{e as hasAtLeast};
@@ -1,2 +1,2 @@
1
- import{t as e}from"./curry-BcQ8Up1_.js";import{isDeepEqual as t}from"./is-deep-equal.js";function n(...t){return e(r,t)}function r(e,n){for(let[r,i]of Object.entries(n))if(!Object.hasOwn(e,r)||!t(i,e[r]))return!1;return!0}export{n as hasSubObject};
1
+ import{t as e}from"./curry-NmniqyJ0.js";import{isDeepEqual as t}from"./is-deep-equal.js";function n(...t){return e(r,t)}function r(e,n){for(let[r,i]of Object.entries(n))if(!Object.hasOwn(e,r)||!t(i,e[r]))return!1;return!0}export{n as hasSubObject};
2
2
  //# sourceMappingURL=has-sub-object.js.map
@@ -1,2 +1,2 @@
1
- import{t as e}from"./has-at-least-DyIhWZJH.js";import{t}from"./swap-in-place-COm7qHj4.js";function n(e,t){for(let n=Math.floor(e.length/2)-1;n>=0;n--)i(e,n,t)}function r(t,n,r){if(!e(t,1))return;let[a]=t;if(!(n(r,a)>=0))return t[0]=r,i(t,0,n),a}function i(e,n,r){let i=n;for(;i*2+1<e.length;){let n=i*2+1,a=r(e[i],e[n])<0?n:i,o=n+1;if(o<e.length&&r(e[a],e[o])<0&&(a=o),a===i)return;t(e,i,a),i=a}}export{n,r as t};
2
- //# sourceMappingURL=heap-bARaRULU.js.map
1
+ import{t as e}from"./has-at-least-Coy9sM-B.js";import{t}from"./swap-in-place-C_jXKHuD.js";function n(e,t){for(let n=Math.floor(e.length/2)-1;n>=0;n--)i(e,n,t)}function r(t,n,r){if(!e(t,1))return;let[a]=t;if(!(n(r,a)>=0))return t[0]=r,i(t,0,n),a}function i(e,n,r){let i=n;for(;i*2+1<e.length;){let n=i*2+1,a=r(e[i],e[n])<0?n:i,o=n+1;if(o<e.length&&r(e[a],e[o])<0&&(a=o),a===i)return;t(e,i,a),i=a}}export{n,r as t};
2
+ //# sourceMappingURL=heap-BhpfhYWj.js.map