modern-ts 0.8.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 (261) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +223 -0
  3. package/README.zh-CN.md +223 -0
  4. package/dist/chunks/Errors-BWEYu-AB.cjs +2 -0
  5. package/dist/chunks/Errors-BWEYu-AB.cjs.map +1 -0
  6. package/dist/chunks/Errors-DwUAvFIF.mjs +63 -0
  7. package/dist/chunks/Errors-DwUAvFIF.mjs.map +1 -0
  8. package/dist/chunks/Math-CGEH1ClN.mjs +68 -0
  9. package/dist/chunks/Math-CGEH1ClN.mjs.map +1 -0
  10. package/dist/chunks/Math-CWZVxSF-.cjs +2 -0
  11. package/dist/chunks/Math-CWZVxSF-.cjs.map +1 -0
  12. package/dist/chunks/base-B9k8Lqvf.mjs +56 -0
  13. package/dist/chunks/base-B9k8Lqvf.mjs.map +1 -0
  14. package/dist/chunks/base-BTXL1y_I.cjs +2 -0
  15. package/dist/chunks/base-BTXL1y_I.cjs.map +1 -0
  16. package/dist/chunks/base-BpECeKwU.mjs +19 -0
  17. package/dist/chunks/base-BpECeKwU.mjs.map +1 -0
  18. package/dist/chunks/base-BvHqpP_s.cjs +2 -0
  19. package/dist/chunks/base-BvHqpP_s.cjs.map +1 -0
  20. package/dist/chunks/base-K-RHLZ-S.mjs +46 -0
  21. package/dist/chunks/base-K-RHLZ-S.mjs.map +1 -0
  22. package/dist/chunks/base-r6kn0B0D.cjs +2 -0
  23. package/dist/chunks/base-r6kn0B0D.cjs.map +1 -0
  24. package/dist/chunks/combine-async-DcG-3p8i.cjs +2 -0
  25. package/dist/chunks/combine-async-DcG-3p8i.cjs.map +1 -0
  26. package/dist/chunks/combine-async-Dcg4ya1R.mjs +236 -0
  27. package/dist/chunks/combine-async-Dcg4ya1R.mjs.map +1 -0
  28. package/dist/chunks/delay-CG3cD7bk.cjs +2 -0
  29. package/dist/chunks/delay-CG3cD7bk.cjs.map +1 -0
  30. package/dist/chunks/delay-CKIXpP71.mjs +32 -0
  31. package/dist/chunks/delay-CKIXpP71.mjs.map +1 -0
  32. package/dist/chunks/helper-BVabbpmX.mjs +165 -0
  33. package/dist/chunks/helper-BVabbpmX.mjs.map +1 -0
  34. package/dist/chunks/helper-tsqZMRHW.cjs +3 -0
  35. package/dist/chunks/helper-tsqZMRHW.cjs.map +1 -0
  36. package/dist/chunks/local-8JVtLN0O.mjs +10 -0
  37. package/dist/chunks/local-8JVtLN0O.mjs.map +1 -0
  38. package/dist/chunks/local-Da4yU-nE.cjs +2 -0
  39. package/dist/chunks/local-Da4yU-nE.cjs.map +1 -0
  40. package/dist/chunks/types-B7X_LBjM.cjs +2 -0
  41. package/dist/chunks/types-B7X_LBjM.cjs.map +1 -0
  42. package/dist/chunks/types-DE2SnSbz.mjs +5 -0
  43. package/dist/chunks/types-DE2SnSbz.mjs.map +1 -0
  44. package/dist/index.cjs +2 -0
  45. package/dist/index.cjs.map +1 -0
  46. package/dist/index.mjs +759 -0
  47. package/dist/index.mjs.map +1 -0
  48. package/dist/subpath/Arr.cjs +2 -0
  49. package/dist/subpath/Arr.cjs.map +1 -0
  50. package/dist/subpath/Arr.mjs +539 -0
  51. package/dist/subpath/Arr.mjs.map +1 -0
  52. package/dist/subpath/Concurrent.cjs +15 -0
  53. package/dist/subpath/Concurrent.cjs.map +1 -0
  54. package/dist/subpath/Concurrent.mjs +4044 -0
  55. package/dist/subpath/Concurrent.mjs.map +1 -0
  56. package/dist/subpath/FetchQ.cjs +2 -0
  57. package/dist/subpath/FetchQ.cjs.map +1 -0
  58. package/dist/subpath/FetchQ.mjs +519 -0
  59. package/dist/subpath/FetchQ.mjs.map +1 -0
  60. package/dist/subpath/Fit.cjs +2 -0
  61. package/dist/subpath/Fit.cjs.map +1 -0
  62. package/dist/subpath/Fit.mjs +914 -0
  63. package/dist/subpath/Fit.mjs.map +1 -0
  64. package/dist/subpath/Lazy.cjs +2 -0
  65. package/dist/subpath/Lazy.cjs.map +1 -0
  66. package/dist/subpath/Lazy.mjs +72 -0
  67. package/dist/subpath/Lazy.mjs.map +1 -0
  68. package/dist/subpath/Maps.cjs +2 -0
  69. package/dist/subpath/Maps.cjs.map +1 -0
  70. package/dist/subpath/Maps.mjs +123 -0
  71. package/dist/subpath/Maps.mjs.map +1 -0
  72. package/dist/subpath/Maybe.cjs +2 -0
  73. package/dist/subpath/Maybe.cjs.map +1 -0
  74. package/dist/subpath/Maybe.mjs +329 -0
  75. package/dist/subpath/Maybe.mjs.map +1 -0
  76. package/dist/subpath/Reactive.cjs +2 -0
  77. package/dist/subpath/Reactive.cjs.map +1 -0
  78. package/dist/subpath/Reactive.mjs +1204 -0
  79. package/dist/subpath/Reactive.mjs.map +1 -0
  80. package/dist/subpath/Reader.cjs +2 -0
  81. package/dist/subpath/Reader.cjs.map +1 -0
  82. package/dist/subpath/Reader.mjs +75 -0
  83. package/dist/subpath/Reader.mjs.map +1 -0
  84. package/dist/subpath/ReaderT.cjs +2 -0
  85. package/dist/subpath/ReaderT.cjs.map +1 -0
  86. package/dist/subpath/ReaderT.mjs +148 -0
  87. package/dist/subpath/ReaderT.mjs.map +1 -0
  88. package/dist/subpath/Resource.cjs +2 -0
  89. package/dist/subpath/Resource.cjs.map +1 -0
  90. package/dist/subpath/Resource.mjs +150 -0
  91. package/dist/subpath/Resource.mjs.map +1 -0
  92. package/dist/subpath/Result.cjs +2 -0
  93. package/dist/subpath/Result.cjs.map +1 -0
  94. package/dist/subpath/Result.mjs +337 -0
  95. package/dist/subpath/Result.mjs.map +1 -0
  96. package/dist/subpath/Sets.cjs +2 -0
  97. package/dist/subpath/Sets.cjs.map +1 -0
  98. package/dist/subpath/Sets.mjs +92 -0
  99. package/dist/subpath/Sets.mjs.map +1 -0
  100. package/dist/subpath/Str.cjs +2 -0
  101. package/dist/subpath/Str.cjs.map +1 -0
  102. package/dist/subpath/Str.mjs +114 -0
  103. package/dist/subpath/Str.mjs.map +1 -0
  104. package/dist/subpath/TxScope.cjs +2 -0
  105. package/dist/subpath/TxScope.cjs.map +1 -0
  106. package/dist/subpath/TxScope.mjs +138 -0
  107. package/dist/subpath/TxScope.mjs.map +1 -0
  108. package/dist/subpath/TypeTool.cjs +2 -0
  109. package/dist/subpath/TypeTool.cjs.map +1 -0
  110. package/dist/subpath/TypeTool.mjs +9 -0
  111. package/dist/subpath/TypeTool.mjs.map +1 -0
  112. package/dist/subpath/Utils.cjs +2 -0
  113. package/dist/subpath/Utils.cjs.map +1 -0
  114. package/dist/subpath/Utils.mjs +835 -0
  115. package/dist/subpath/Utils.mjs.map +1 -0
  116. package/dist/subpath/VirtualTime.cjs +2 -0
  117. package/dist/subpath/VirtualTime.cjs.map +1 -0
  118. package/dist/subpath/VirtualTime.mjs +1186 -0
  119. package/dist/subpath/VirtualTime.mjs.map +1 -0
  120. package/dist/types/Arr.d.ts +2 -0
  121. package/dist/types/Concurrent/Lock/condition_variable.d.ts +138 -0
  122. package/dist/types/Concurrent/Lock/mutex.d.ts +185 -0
  123. package/dist/types/Concurrent/Lock/rwlock.d.ts +253 -0
  124. package/dist/types/Concurrent/Lock/semaphore.d.ts +208 -0
  125. package/dist/types/Concurrent/Valve/__export__.d.ts +5 -0
  126. package/dist/types/Concurrent/Valve/circuit-breaker.d.ts +146 -0
  127. package/dist/types/Concurrent/Valve/leaky-bucket.d.ts +115 -0
  128. package/dist/types/Concurrent/Valve/sliding-window.d.ts +91 -0
  129. package/dist/types/Concurrent/Valve/token-bucket.d.ts +68 -0
  130. package/dist/types/Concurrent/__export__.d.ts +15 -0
  131. package/dist/types/Concurrent/barrier.d.ts +255 -0
  132. package/dist/types/Concurrent/channel.d.ts +239 -0
  133. package/dist/types/Concurrent/delay.d.ts +42 -0
  134. package/dist/types/Concurrent/ext/map.d.ts +82 -0
  135. package/dist/types/Concurrent/ext/other.d.ts +113 -0
  136. package/dist/types/Concurrent/ext/race.d.ts +31 -0
  137. package/dist/types/Concurrent/ext/some.d.ts +64 -0
  138. package/dist/types/Concurrent/limiter.d.ts +131 -0
  139. package/dist/types/Concurrent/scheduler.d.ts +171 -0
  140. package/dist/types/Concurrent/task-scope.d.ts +282 -0
  141. package/dist/types/Concurrent.d.ts +2 -0
  142. package/dist/types/Errors.d.ts +66 -0
  143. package/dist/types/FetchQ.d.ts +2 -0
  144. package/dist/types/Fit/__export__.d.ts +5 -0
  145. package/dist/types/Fit/base.d.ts +325 -0
  146. package/dist/types/Fit/parser.d.ts +110 -0
  147. package/dist/types/Fit/standard-schema.d.ts +127 -0
  148. package/dist/types/Fit/sugar.d.ts +274 -0
  149. package/dist/types/Fit/tool.d.ts +585 -0
  150. package/dist/types/Fit.d.ts +2 -0
  151. package/dist/types/Lazy.d.ts +2 -0
  152. package/dist/types/Maps.d.ts +2 -0
  153. package/dist/types/Maybe/__export__.d.ts +6 -0
  154. package/dist/types/Maybe/base.d.ts +62 -0
  155. package/dist/types/Maybe/consumers-async.d.ts +58 -0
  156. package/dist/types/Maybe/consumers.d.ts +63 -0
  157. package/dist/types/Maybe/operators-async.d.ts +145 -0
  158. package/dist/types/Maybe/operators.d.ts +177 -0
  159. package/dist/types/Maybe/types.d.ts +12 -0
  160. package/dist/types/Maybe.d.ts +2 -0
  161. package/dist/types/MockClock/Timeline.d.ts +392 -0
  162. package/dist/types/MockClock/TimerHandle.d.ts +159 -0
  163. package/dist/types/MockClock/TimerHeap.d.ts +21 -0
  164. package/dist/types/MockClock/VirtualTimeManager.d.ts +23 -0
  165. package/dist/types/MockClock/__export__.d.ts +104 -0
  166. package/dist/types/MockClock/hooks/__export__.d.ts +9 -0
  167. package/dist/types/MockClock/hooks/hookAbortSignal.d.ts +3 -0
  168. package/dist/types/MockClock/hooks/hookDate.d.ts +3 -0
  169. package/dist/types/MockClock/hooks/hookIntl.d.ts +3 -0
  170. package/dist/types/MockClock/hooks/hookMessageChannel.d.ts +3 -0
  171. package/dist/types/MockClock/hooks/hookMicrotasks.d.ts +3 -0
  172. package/dist/types/MockClock/hooks/hookOs.d.ts +3 -0
  173. package/dist/types/MockClock/hooks/hookPerformance.d.ts +3 -0
  174. package/dist/types/MockClock/hooks/hookProcess.d.ts +3 -0
  175. package/dist/types/MockClock/hooks/hookTimers.d.ts +3 -0
  176. package/dist/types/MockClock/types.d.ts +103 -0
  177. package/dist/types/Other/FetchQ.d.ts +320 -0
  178. package/dist/types/Other/deque.d.ts +59 -0
  179. package/dist/types/Other/disjointSet.d.ts +53 -0
  180. package/dist/types/Other/heap.d.ts +41 -0
  181. package/dist/types/Other/lazy.d.ts +127 -0
  182. package/dist/types/Other/queue.d.ts +42 -0
  183. package/dist/types/Other/secret.d.ts +111 -0
  184. package/dist/types/Other/stack.d.ts +40 -0
  185. package/dist/types/Reactive/__export__.d.ts +4 -0
  186. package/dist/types/Reactive/event_emitter.d.ts +195 -0
  187. package/dist/types/Reactive/flow-combination.d.ts +74 -0
  188. package/dist/types/Reactive/flow.d.ts +180 -0
  189. package/dist/types/Reactive/pace.d.ts +80 -0
  190. package/dist/types/Reactive.d.ts +2 -0
  191. package/dist/types/Reader/__export-readerT__.d.ts +4 -0
  192. package/dist/types/Reader/__export-reader__.d.ts +4 -0
  193. package/dist/types/Reader/local.d.ts +39 -0
  194. package/dist/types/Reader/reader-async.d.ts +84 -0
  195. package/dist/types/Reader/reader.d.ts +96 -0
  196. package/dist/types/Reader/readerT-async.d.ts +186 -0
  197. package/dist/types/Reader/readerT.d.ts +178 -0
  198. package/dist/types/Reader/types.d.ts +37 -0
  199. package/dist/types/Reader.d.ts +2 -0
  200. package/dist/types/ReaderT.d.ts +2 -0
  201. package/dist/types/Resource/TxScope-async.d.ts +86 -0
  202. package/dist/types/Resource/TxScope.d.ts +85 -0
  203. package/dist/types/Resource/__export-TxScope__.d.ts +2 -0
  204. package/dist/types/Resource/__export-resource__.d.ts +2 -0
  205. package/dist/types/Resource/resource-async.d.ts +79 -0
  206. package/dist/types/Resource/resource.d.ts +78 -0
  207. package/dist/types/Resource/types.d.ts +79 -0
  208. package/dist/types/Resource.d.ts +2 -0
  209. package/dist/types/Result/Consumers/branch-async.d.ts +77 -0
  210. package/dist/types/Result/Consumers/branch.d.ts +70 -0
  211. package/dist/types/Result/Consumers/inspect.d.ts +66 -0
  212. package/dist/types/Result/Operators/Async/combine-async.d.ts +69 -0
  213. package/dist/types/Result/Operators/Async/partition-async.d.ts +29 -0
  214. package/dist/types/Result/Operators/Async/reduce-async.d.ts +15 -0
  215. package/dist/types/Result/Operators/Async/transform-async.d.ts +90 -0
  216. package/dist/types/Result/Operators/combine.d.ts +60 -0
  217. package/dist/types/Result/Operators/flatten.d.ts +26 -0
  218. package/dist/types/Result/Operators/partition.d.ts +25 -0
  219. package/dist/types/Result/Operators/reduce.d.ts +12 -0
  220. package/dist/types/Result/Operators/transform.d.ts +70 -0
  221. package/dist/types/Result/__export__.d.ts +14 -0
  222. package/dist/types/Result/base.d.ts +115 -0
  223. package/dist/types/Result/types.d.ts +34 -0
  224. package/dist/types/Result.d.ts +2 -0
  225. package/dist/types/Sets.d.ts +2 -0
  226. package/dist/types/Str.d.ts +2 -0
  227. package/dist/types/TxScope.d.ts +2 -0
  228. package/dist/types/TypeTool.d.ts +2 -0
  229. package/dist/types/Utils/Array/__export__.d.ts +10 -0
  230. package/dist/types/Utils/Array/filtering.d.ts +89 -0
  231. package/dist/types/Utils/Array/flatten.d.ts +45 -0
  232. package/dist/types/Utils/Array/grouping.d.ts +44 -0
  233. package/dist/types/Utils/Array/iteration.d.ts +86 -0
  234. package/dist/types/Utils/Array/operators.d.ts +62 -0
  235. package/dist/types/Utils/Array/randomization.d.ts +76 -0
  236. package/dist/types/Utils/Array/set.d.ts +108 -0
  237. package/dist/types/Utils/Array/slice.d.ts +189 -0
  238. package/dist/types/Utils/Array/sorting.d.ts +55 -0
  239. package/dist/types/Utils/Array/zip.d.ts +93 -0
  240. package/dist/types/Utils/Functions/__export__.d.ts +5 -0
  241. package/dist/types/Utils/Functions/base.d.ts +157 -0
  242. package/dist/types/Utils/Functions/curry.d.ts +73 -0
  243. package/dist/types/Utils/Functions/debounce.d.ts +240 -0
  244. package/dist/types/Utils/Functions/defer.d.ts +43 -0
  245. package/dist/types/Utils/Functions/pipe.d.ts +205 -0
  246. package/dist/types/Utils/Map.d.ts +284 -0
  247. package/dist/types/Utils/Math.d.ts +225 -0
  248. package/dist/types/Utils/Object/__export__.d.ts +2 -0
  249. package/dist/types/Utils/Object/base.d.ts +131 -0
  250. package/dist/types/Utils/Object/clone.d.ts +81 -0
  251. package/dist/types/Utils/Predicates.d.ts +361 -0
  252. package/dist/types/Utils/Set.d.ts +105 -0
  253. package/dist/types/Utils/String.d.ts +217 -0
  254. package/dist/types/Utils/__export__.d.ts +9 -0
  255. package/dist/types/Utils/type-tool.d.ts +168 -0
  256. package/dist/types/Utils.d.ts +2 -0
  257. package/dist/types/VirtualTime.d.ts +2 -0
  258. package/dist/types/helper.d.ts +71 -0
  259. package/dist/types/index.d.ts +21 -0
  260. package/dist/types/unknown-error.d.ts +98 -0
  261. package/package.json +179 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Maybe.mjs","sources":["../../src/Maybe/consumers.ts","../../src/Maybe/consumers-async.ts","../../src/Maybe/operators.ts","../../src/Maybe/operators-async.ts"],"sourcesContent":["// ========================================\r\n// ./src/Maybe/consumers.ts\r\n// ========================================\r\n\r\nimport {isNone, isSome} from './base';\r\nimport type {Maybe} from './types';\r\n\r\n// ========================================\r\n// 分支控制流\r\n// ========================================\r\n\r\n/**\r\n * Pattern matching for Maybe type\r\n * @param val - Maybe value to match\r\n * @param onSome - Callback for Some case\r\n * @param onNone - Callback for None case\r\n * @returns Result of the matched case\r\n */\r\nexport const match = <T, R>(\r\n val: Maybe<T>,\r\n onSome: (value: T) => R,\r\n onNone: () => R,\r\n): R => (isSome(val) ? onSome(val) : onNone());\r\n\r\n/**\r\n * Execute callback only if Maybe is Some\r\n * @param val - Maybe value to check\r\n * @param onSome - Callback for Some case\r\n * @returns Callback result or undefined\r\n */\r\nexport function ifSome<T, R1>(\r\n val: Maybe<T>,\r\n onSome: (value: T) => R1,\r\n): R1 | void;\r\n\r\n/**\r\n * Execute callback for Some, fallback for None\r\n * @param val - Maybe value to check\r\n * @param onSome - Callback for Some case\r\n * @param onElse - Fallback callback\r\n * @returns Result of either callback\r\n */\r\nexport function ifSome<T, R1, R2>(\r\n val: Maybe<T>,\r\n onSome: (value: T) => R1,\r\n onElse: () => R2,\r\n): R1 | R2;\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function ifSome<T, R1, R2>(\r\n val: Maybe<T>,\r\n onSome: (value: T) => R1,\r\n onElse?: () => R2,\r\n): R1 | R2 | void {\r\n return isSome(val) ? onSome(val) : onElse?.();\r\n}\r\n\r\n/**\r\n * Execute callback only if Maybe is None\r\n * @param val - Maybe value to check\r\n * @param onNone - Callback for None case\r\n * @returns Callback result or undefined\r\n */\r\nexport function ifNone<T, R1>(val: Maybe<T>, onNone: () => R1): R1 | void;\r\n\r\n/**\r\n * Execute callback for None, fallback for Some\r\n * @param val - Maybe value to check\r\n * @param onNone - Callback for None case\r\n * @param onElse - Fallback callback\r\n * @returns Result of either callback\r\n */\r\nexport function ifNone<T, R1, R2>(\r\n val: Maybe<T>,\r\n onNone: () => R1,\r\n onElse: (value: T) => R2,\r\n): R1 | R2;\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function ifNone<T, R1, R2>(\r\n val: Maybe<T>,\r\n onNone: () => R1,\r\n onElse?: (value: T) => R2,\r\n): R1 | R2 | void {\r\n return isNone(val) ? onNone() : onElse?.(val);\r\n}\r\n\r\n// ========================================\r\n// 副作用\r\n// ========================================\r\n\r\n/**\r\n * Peek at Some value without consuming\r\n * @param val - Maybe value to inspect\r\n * @param fn - Side effect callback\r\n * @returns Original Maybe value\r\n */\r\nexport const peek = <T>(val: Maybe<T>, fn: (v: T) => void): Maybe<T> => {\r\n if (isSome(val)) fn(val);\r\n return val;\r\n};\r\n\r\n/**\r\n * Peek at None case without consuming\r\n * @param val - Maybe value to inspect\r\n * @param fn - Side effect callback\r\n * @returns Original Maybe value\r\n */\r\nexport const peekNone = <T>(val: Maybe<T>, fn: () => void): Maybe<T> => {\r\n if (isNone(val)) fn();\r\n return val;\r\n};\r\n\r\n/**\r\n * Peek at both cases with separate callbacks\r\n * @param val - Maybe value to inspect\r\n * @param callbacks - Object with Some and None handlers\r\n * @returns Original Maybe value\r\n */\r\nexport function peekBoth<T>(\r\n val: Maybe<T>,\r\n {\r\n fnSome = () => {},\r\n fnNone = () => {},\r\n }: {\r\n fnSome?: (v: T) => void;\r\n fnNone?: () => void;\r\n },\r\n): Maybe<T> {\r\n if (isSome(val)) {\r\n fnSome(val);\r\n } else {\r\n fnNone();\r\n }\r\n\r\n return val;\r\n}\r\n","// ========================================\n// ./src/Maybe/consumers-async.ts\n// ========================================\n\nimport {isNone, isSome} from './base';\nimport type {AnyMaybe, Maybe} from './types';\nimport type {MaybePromise} from '../Utils/type-tool';\nimport {dynamicAwait} from '../helper';\n\n// ========================================\n// 分支控制流\n// ========================================\n\n/**\n * Asynchronously pattern matches on a Maybe value, executing the appropriate callback\n * @param val - The Maybe value or Promise of Maybe to match on\n * @param onSome - Callback executed when value is Some\n * @param onNone - Callback executed when value is None\n * @param signal - Optional AbortSignal for cancellation\n * @returns Promise resolving to the result of the executed callback\n */\nexport async function matchAsync<T, R>(\n val: AnyMaybe<T>,\n onSome: (value: T, signal?: AbortSignal) => MaybePromise<R>,\n onNone: (signal?: AbortSignal) => MaybePromise<R>,\n signal?: AbortSignal,\n): Promise<R> {\n signal?.throwIfAborted();\n const unwrapped = await val;\n\n if (isSome(unwrapped)) {\n const res = await dynamicAwait(onSome(unwrapped, signal));\n signal?.throwIfAborted();\n return res;\n } else {\n const res = await dynamicAwait(onNone(signal));\n signal?.throwIfAborted();\n return res;\n }\n}\n\n/**\n * Executes callback only if Maybe value is Some (single callback version)\n * @returns Promise resolving to callback result or undefined\n */\nexport async function ifSomeAsync<T, R1>(\n val: AnyMaybe<T>,\n onSome: (value: T) => MaybePromise<R1>,\n): Promise<R1 | void>;\n\n/**\n * Executes appropriate callback based on Maybe value (two callback version)\n * @returns Promise resolving to result of either callback\n */\nexport async function ifSomeAsync<T, R1, R2>(\n val: AnyMaybe<T>,\n onSome: (value: T) => MaybePromise<R1>,\n onElse: () => MaybePromise<R2>,\n): Promise<R1 | R2>;\n\n/**\n * Conditionally executes callback based on Maybe value\n * @param val - The Maybe value or Promise of Maybe to check\n * @param onSome - Callback executed for Some values\n * @param onElse - Optional callback executed for None values\n * @returns Promise resolving to callback result or undefined\n */\nexport async function ifSomeAsync<T, R1, R2 = void>(\n val: AnyMaybe<T>,\n onSome: (value: T) => MaybePromise<R1>,\n onElse?: () => MaybePromise<R2>,\n): Promise<R1 | R2 | void> {\n const unwrapped = await val;\n\n if (isSome(unwrapped)) {\n return await dynamicAwait(onSome(unwrapped));\n } else {\n if (onElse) {\n return await dynamicAwait(onElse());\n }\n return;\n }\n}\n\n/**\n * Executes callback only if Maybe value is None (single callback version)\n * @returns Promise resolving to callback result or undefined\n */\nexport async function ifNoneAsync<T, R1>(\n val: AnyMaybe<T>,\n onNone: () => MaybePromise<R1>,\n): Promise<R1 | void>;\n\n/**\n * Executes appropriate callback based on Maybe value (two callback version)\n * @returns Promise resolving to result of either callback\n */\nexport async function ifNoneAsync<T, R1, R2>(\n val: AnyMaybe<T>,\n onNone: () => MaybePromise<R1>,\n onElse: (value: T) => MaybePromise<R2>,\n): Promise<R1 | R2>;\n\n/**\n * Conditionally executes callback based on Maybe value\n * @param val - The Maybe value or Promise of Maybe to check\n * @param onNone - Callback executed for None values\n * @param onElse - Optional callback executed for Some values\n * @returns Promise resolving to callback result or undefined\n */\nexport async function ifNoneAsync<T, R1, R2 = void>(\n val: AnyMaybe<T>,\n onNone: () => MaybePromise<R1>,\n onElse?: (value: T) => MaybePromise<R2>,\n): Promise<R1 | R2 | void> {\n const unwrapped = await val;\n\n if (isNone(unwrapped)) {\n return await dynamicAwait(onNone());\n } else {\n if (onElse) {\n return await dynamicAwait(onElse(unwrapped));\n }\n return;\n }\n}\n\n// ========================================\n// 副作用\n// ========================================\n\n/**\n * Executes a side effect for Some values without modifying the Maybe\n * @param val - The Maybe value or Promise of Maybe to inspect\n * @param fn - Side effect function for Some values\n * @param signal - Optional AbortSignal for cancellation\n * @returns Promise resolving to the original Maybe value\n */\nexport async function peekAsync<T>(\n val: AnyMaybe<T>,\n fn: (v: T, signal?: AbortSignal) => MaybePromise<void>,\n signal?: AbortSignal,\n): Promise<Maybe<T>> {\n signal?.throwIfAborted();\n const unwrapped = await val;\n signal?.throwIfAborted();\n\n if (isSome(unwrapped)) {\n await dynamicAwait(fn(unwrapped, signal));\n signal?.throwIfAborted();\n }\n return unwrapped;\n}\n\n/**\n * Executes a side effect for None values without modifying the Maybe\n * @param val - The Maybe value or Promise of Maybe to inspect\n * @param fn - Side effect function for None values\n * @param signal - Optional AbortSignal for cancellation\n * @returns Promise resolving to the original Maybe value\n */\nexport async function peekNoneAsync<T>(\n val: AnyMaybe<T>,\n fn: (signal?: AbortSignal) => MaybePromise<void>,\n signal?: AbortSignal,\n): Promise<Maybe<T>> {\n signal?.throwIfAborted();\n const unwrapped = await val;\n signal?.throwIfAborted();\n\n if (isNone(unwrapped)) {\n await dynamicAwait(fn(signal));\n signal?.throwIfAborted();\n }\n return unwrapped;\n}\n\n/**\n * Executes side effects for both Some and None cases without modifying the Maybe\n * @param val - The Maybe value or Promise of Maybe to inspect\n * @param handlers - Object containing optional Some and None handlers\n * @param signal - Optional AbortSignal for cancellation\n * @returns Promise resolving to the original Maybe value\n */\nexport async function peekBothAsync<T>(\n val: AnyMaybe<T>,\n {\n fnSome = () => {},\n fnNone = () => {},\n }: {\n fnSome?: (v: T, signal?: AbortSignal) => MaybePromise<void>;\n fnNone?: (signal?: AbortSignal) => MaybePromise<void>;\n },\n signal?: AbortSignal,\n): Promise<Maybe<T>> {\n signal?.throwIfAborted();\n const unwrapped = await val;\n signal?.throwIfAborted();\n\n if (isSome(unwrapped)) {\n await dynamicAwait(fnSome(unwrapped, signal));\n } else {\n await dynamicAwait(fnNone(signal));\n }\n signal?.throwIfAborted();\n\n return unwrapped;\n}\n","// ========================================\r\n// ./src/Maybe/operators.ts\r\n// ========================================\r\nimport {isSome, None, Some} from './base';\r\nimport type {Maybe} from './types';\r\n\r\n// ========================================\r\n// 基础转换\r\n// ========================================\r\n\r\n/**\r\n * Transforms the contained value if Some, returns None otherwise.\r\n * @typeparam T - Original value type\r\n * @typeparam R - Result type\r\n * @param val - Maybe value\r\n * @param fn - Transformation function\r\n * @returns Maybe<R>\r\n */\r\nexport const map = <T, R>(val: Maybe<T>, fn: (value: T) => R): Maybe<R> =>\r\n isSome(val) ? Some(fn(val)) : None();\r\n\r\n/**\r\n * Chains computations that may fail. If Some, applies fn, otherwise returns None.\r\n * @typeparam T - Original value type\r\n * @typeparam R - Result type\r\n * @param val - Maybe value\r\n * @param fn - Function returning Maybe<R>\r\n * @returns Maybe<R>\r\n */\r\nexport const andThen = <T, R>(\r\n val: Maybe<T>,\r\n fn: (value: T) => Maybe<R>,\r\n): Maybe<R> => (isSome(val) ? fn(val) : val);\r\n\r\n/**\r\n * Applies a Maybe-wrapped function to a Maybe value.\r\n * @typeparam T - Input type\r\n * @typeparam R - Result type\r\n * @param fn_val - Maybe<(v: T) => R>\r\n * @param val - Maybe<T>\r\n * @returns Maybe<R>\r\n */\r\nexport const ap = <T, R>(\r\n fn_val: Maybe<(v: T) => R>,\r\n val: Maybe<T>,\r\n): Maybe<R> => (isSome(fn_val) && isSome(val) ? Some(fn_val(val)) : None());\r\n\r\n/**\r\n * Returns Some if value satisfies predicate, None otherwise.\r\n * @typeparam T - Value type\r\n * @param val - Maybe value\r\n * @param predicate - Filter condition\r\n * @returns Maybe<T>\r\n */\r\nexport const filter = <T>(\r\n val: Maybe<T>,\r\n predicate: (v: T) => boolean,\r\n): Maybe<T> => (isSome(val) && predicate(val) ? val : None());\r\n\r\n/**\r\n * Maps value if predicate passes, returns None otherwise.\r\n * @typeparam T - Original type\r\n * @typeparam R - Result type\r\n * @param val - Maybe value\r\n * @param predicate - Condition to check\r\n * @param fn - Transformation function\r\n * @returns Maybe<R>\r\n */\r\nexport const mapIf = <T, R>(\r\n val: Maybe<T>,\r\n predicate: (v: T) => boolean,\r\n fn: (v: T) => R,\r\n): Maybe<R> => (isSome(val) && predicate(val) ? Some(fn(val)) : None());\r\n\r\n// ========================================\r\n// 逻辑分支与聚合\r\n// ========================================\r\n\r\n/**\r\n * Returns other if val is Some, None otherwise.\r\n * @typeparam T - First type\r\n * @typeparam U - Second type\r\n * @param val - Maybe<T>\r\n * @param other - Maybe<U>\r\n * @returns Maybe<U>\r\n */\r\nexport const and = <T, U>(val: Maybe<T>, other: Maybe<U>): Maybe<U> =>\r\n isSome(val) ? other : None();\r\n\r\n/**\r\n * Returns first Some value, otherwise other.\r\n * @typeparam T - Value type\r\n * @param val - First Maybe\r\n * @param other - Fallback Maybe\r\n * @returns Maybe<T>\r\n */\r\nexport const or = <T>(val: Maybe<T>, other: Maybe<T>): Maybe<T> =>\r\n isSome(val) ? val : other;\r\n\r\n/**\r\n * Returns val if Some, otherwise calls fn for fallback.\r\n * @typeparam T - Value type\r\n * @param val - Maybe value\r\n * @param fn - Fallback supplier\r\n * @returns Maybe<T>\r\n */\r\nexport const orElse = <T>(val: Maybe<T>, fn: () => Maybe<T>): Maybe<T> =>\r\n isSome(val) ? val : fn();\r\n\r\n/**\r\n * Extracts value or returns default.\r\n * @typeparam T - Input type\r\n * @typeparam R - Output type\r\n * @param val - Maybe value\r\n * @param initial - Default value\r\n * @param onSome - Handler for Some case\r\n * @returns R\r\n */\r\nexport const fold = <T, R>(\r\n val: Maybe<T>,\r\n initial: R,\r\n onSome: (v: T) => R,\r\n): R => (isSome(val) ? onSome(val) : initial);\r\n\r\n/**\r\n * Checks if Maybe contains specific value.\r\n * @typeparam T - Value type\r\n * @param val - Maybe value\r\n * @param x - Value to compare\r\n * @returns boolean\r\n */\r\nexport const contains = <T>(val: Maybe<T>, x: T): boolean =>\r\n isSome(val) && val === x;\r\n\r\n// ========================================\r\n// 多元组合\r\n// ========================================\r\n\r\n/**\r\n * Combines two Maybes into tuple if both are Some.\r\n * @typeparam T - First type\r\n * @typeparam U - Second type\r\n * @param a - Maybe<T>\r\n * @param b - Maybe<U>\r\n * @returns Maybe<[T, U]>\r\n */\r\nexport const zip = <T, U>(a: Maybe<T>, b: Maybe<U>): Maybe<[T, U]> =>\r\n isSome(a) && isSome(b) ? Some([a, b] as [T, U]) : None();\r\n\r\n/**\r\n * Applies function to two Maybes if both are Some.\r\n * @typeparam T - First type\r\n * @typeparam U - Second type\r\n * @typeparam R - Result type\r\n * @param ma - Maybe<T>\r\n * @param mb - Maybe<U>\r\n * @param fn - Combining function\r\n * @returns Maybe<R>\r\n */\r\nexport const zipWith = <T, U, R>(\r\n ma: Maybe<T>,\r\n mb: Maybe<U>,\r\n fn: (a: T, b: U) => R,\r\n): Maybe<R> => (isSome(ma) && isSome(mb) ? Some(fn(ma, mb)) : None());\r\n\r\n// ========================================\r\n// 集合处理\r\n// ========================================\r\n\r\n/**\r\n * Returns array of all values if all are Some, None otherwise.\r\n * @typeparam T - Element type\r\n * @param vals - Array of Maybes\r\n * @returns Maybe<T[]>\r\n */\r\nexport const all = <T>(vals: readonly Maybe<T>[]): Maybe<T[]> =>\r\n vals.every(isSome) ? Some(vals as T[]) : None();\r\n\r\n/**\r\n * Maps array to Maybes, returns Some of results if all succeed.\r\n * @typeparam T - Input type\r\n * @typeparam U - Output type\r\n * @param items - Input array\r\n * @param fn - Mapping function\r\n * @returns Maybe<U[]>\r\n */\r\nexport const mapAll = <T, U>(\r\n items: readonly T[],\r\n fn: (it: T, i: number) => Maybe<U>,\r\n): Maybe<U[]> => {\r\n const results: U[] = [];\r\n for (let i = 0; i < items.length; i++) {\r\n const res = fn(items[i], i);\r\n if (!isSome(res)) return None();\r\n results.push(res);\r\n }\r\n return Some(results);\r\n};\r\n\r\n/**\r\n * Partitions array into Some values and None count.\r\n * @typeparam T - Element type\r\n * @param vals - Array of Maybes\r\n * @returns [T[], number] - [Some values, None count]\r\n */\r\nexport const partition = <T>(vals: readonly Maybe<T>[]): [T[], number] => {\r\n const somes: T[] = [];\r\n let none_count = 0;\r\n for (const v of vals) {\r\n if (isSome(v)) somes.push(v);\r\n else none_count++;\r\n }\r\n return [somes, none_count];\r\n};\r\n\r\n/**\r\n * Collects all Some values from array.\r\n * @typeparam T - Element type\r\n * @param vals - Array of Maybes\r\n * @returns T[] - Only Some values\r\n */\r\nexport const collectSomes = <T>(vals: readonly Maybe<T>[]): T[] => {\r\n const result: T[] = [];\r\n for (const v of vals) if (isSome(v)) result.push(v);\r\n return result;\r\n};\r\n\r\n/**\r\n * Returns first Some value in array, None if none found.\r\n * @typeparam T - Element type\r\n * @param vals - Array of Maybes\r\n * @returns Maybe<T>\r\n */\r\nexport const firstSome = <T>(vals: readonly Maybe<T>[]): Maybe<T> =>\r\n vals.find(isSome) ?? None();\r\n\r\n// ========================================\r\n// 高级规约\r\n// ========================================\r\n\r\n/**\r\n * Reduces array of Maybes. Returns None if any is None.\r\n * @typeparam T - Element type\r\n * @typeparam R - Result type\r\n * @param vals - Array of Maybes\r\n * @param initial - Initial value\r\n * @param reducer - Reduction function\r\n * @returns Maybe<R>\r\n */\r\nexport function reduce<T, R>(\r\n vals: readonly Maybe<T>[],\r\n initial: R,\r\n reducer: (acc: R, v: T) => R,\r\n): Maybe<R> {\r\n let acc = initial;\r\n for (const v of vals) {\r\n if (!isSome(v)) return None();\r\n acc = reducer(acc, v);\r\n }\r\n return Some(acc);\r\n}\r\n\r\n/**\r\n * Performs scan reduction. Returns None if any is None.\r\n * @typeparam T - Element type\r\n * @typeparam R - Result type\r\n * @param vals - Array of Maybes\r\n * @param initial - Initial value\r\n * @param scanner - Scanning function\r\n * @returns Maybe<R[]>\r\n */\r\nexport function scan<T, R>(\r\n vals: readonly Maybe<T>[],\r\n initial: R,\r\n scanner: (acc: R, v: T) => R,\r\n): Maybe<R[]> {\r\n const scanned: R[] = [initial];\r\n let acc = initial;\r\n for (const v of vals) {\r\n if (!isSome(v)) return None();\r\n acc = scanner(acc, v);\r\n scanned.push(acc);\r\n }\r\n return Some(scanned);\r\n}\r\n\r\n/**\r\n * Folds with separate handlers for Some/None.\r\n * @typeparam T - Element type\r\n * @typeparam R - Result type\r\n * @param vals - Array of Maybes\r\n * @param initial - Initial value\r\n * @param onSome - Handler for Some values\r\n * @param onNone - Handler for None values\r\n * @returns R\r\n */\r\nexport const folds = <T, R>(\r\n vals: readonly Maybe<T>[],\r\n initial: R,\r\n onSome: (acc: R, v: T) => R,\r\n onNone: (acc: R) => R,\r\n): R => {\r\n let acc = initial;\r\n for (const v of vals) acc = isSome(v) ? onSome(acc, v) : onNone(acc);\r\n return acc;\r\n};\r\n","// ========================================\r\n// ./src/Maybe/operators-async.ts\r\n// ========================================\r\nimport {isSome, None, Some} from './base';\r\nimport type {AnyMaybe, AsyncMaybe} from './types';\r\n\r\n// ========================================\r\n// 核心转换操作\r\n// ========================================\r\n\r\n/**\r\n * Applies async function from Maybe to async value.\r\n * @typeparam T - Input type\r\n * @typeparam R - Result type\r\n * @param fn_val - Maybe function\r\n * @param val - Maybe value\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<R>\r\n */\r\nexport const apAsync = async <T, R>(\r\n fn_val: AnyMaybe<(v: T) => R | Promise<R>>,\r\n val: AnyMaybe<T>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<R> => {\r\n signal?.throwIfAborted();\r\n const [f, v] = await Promise.all([\r\n Promise.resolve(fn_val),\r\n Promise.resolve(val),\r\n ]);\r\n signal?.throwIfAborted();\r\n return isSome(f) && isSome(v) ? Some(await f(v)) : None();\r\n};\r\n\r\n/**\r\n * Transforms async Maybe value with async function.\r\n * @typeparam T - Input type\r\n * @typeparam R - Result type\r\n * @param val - Maybe value\r\n * @param fn - Async transformation function\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<R>\r\n */\r\nexport const mapAsync = async <T, R>(\r\n val: AnyMaybe<T>,\r\n fn: (v: T) => R | Promise<R>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<R> => {\r\n signal?.throwIfAborted();\r\n const v = await val;\r\n signal?.throwIfAborted();\r\n return isSome(v) ? Some(await fn(v)) : None();\r\n};\r\n\r\n/**\r\n * Maps value only if predicate passes (async).\r\n * @typeparam T - Input type\r\n * @typeparam R - Result type\r\n * @param val - Maybe value\r\n * @param predicate - Async condition check\r\n * @param fn - Async transformation function\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<R>\r\n */\r\nexport const mapIfAsync = async <T, R>(\r\n val: AnyMaybe<T>,\r\n predicate: (v: T) => boolean | Promise<boolean>,\r\n fn: (v: T) => R | Promise<R>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<R> => {\r\n signal?.throwIfAborted();\r\n const v = await val;\r\n signal?.throwIfAborted();\r\n if (!isSome(v)) return None();\r\n\r\n const shouldMap = await predicate(v);\r\n signal?.throwIfAborted();\r\n return shouldMap ? Some(await fn(v)) : None();\r\n};\r\n\r\n/**\r\n * Chains async computations that may fail.\r\n * @typeparam T - Input type\r\n * @typeparam R - Result type\r\n * @param val - Maybe value\r\n * @param fn - Async function returning Maybe\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<R>\r\n */\r\nexport const andThenAsync = async <T, R>(\r\n val: AnyMaybe<T>,\r\n fn: (v: T) => AnyMaybe<R>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<R> => {\r\n signal?.throwIfAborted();\r\n const v = await val;\r\n signal?.throwIfAborted();\r\n return isSome(v) ? fn(v) : None();\r\n};\r\n\r\n/**\r\n * Filters async Maybe value with async predicate.\r\n * @typeparam T - Value type\r\n * @param val - Maybe value\r\n * @param predicate - Async filter condition\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<T>\r\n */\r\nexport const filterAsync = async <T>(\r\n val: AnyMaybe<T>,\r\n predicate: (v: T) => boolean | Promise<boolean>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<T> => {\r\n signal?.throwIfAborted();\r\n const v = await val;\r\n signal?.throwIfAborted();\r\n if (!isSome(v)) return None();\r\n\r\n const shouldKeep = await predicate(v);\r\n signal?.throwIfAborted();\r\n return shouldKeep ? v : None();\r\n};\r\n\r\n// ========================================\r\n// 组合操作\r\n// ========================================\r\n\r\n/**\r\n * Zips two async Maybes into tuple if both are Some.\r\n * @typeparam T - First type\r\n * @typeparam U - Second type\r\n * @param a - First Maybe\r\n * @param b - Second Maybe\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<[T, U]>\r\n */\r\nexport const zipAsync = async <T, U>(\r\n a: AnyMaybe<T>,\r\n b: AnyMaybe<U>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<[T, U]> => {\r\n signal?.throwIfAborted();\r\n const [ra, rb] = await Promise.all([Promise.resolve(a), Promise.resolve(b)]);\r\n signal?.throwIfAborted();\r\n return isSome(ra) && isSome(rb) ? Some([ra, rb]) : None();\r\n};\r\n\r\n// ========================================\r\n// 逻辑分支与错误处理\r\n// ========================================\r\n\r\n/**\r\n * Extracts value from async Maybe or returns default.\r\n * @typeparam T - Input type\r\n * @typeparam R - Result type\r\n * @param val - Maybe value\r\n * @param initial - Default value or Promise\r\n * @param onSome - Async handler for Some case\r\n * @param signal - Optional AbortSignal\r\n * @returns Promise<R>\r\n */\r\nexport const foldAsync = async <T, R>(\r\n val: AnyMaybe<T>,\r\n initial: R | Promise<R>,\r\n onSome: (v: T) => R | Promise<R>,\r\n signal?: AbortSignal,\r\n): Promise<R> => {\r\n signal?.throwIfAborted();\r\n const v = await val;\r\n signal?.throwIfAborted();\r\n return isSome(v) ? onSome(v) : initial;\r\n};\r\n\r\n/**\r\n * Returns value if Some, otherwise async fallback.\r\n * @typeparam T - Value type\r\n * @param val - Maybe value\r\n * @param fn - Async fallback supplier\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<T>\r\n */\r\nexport const orElseAsync = async <T>(\r\n val: AnyMaybe<T>,\r\n fn: () => AnyMaybe<T>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<T> => {\r\n signal?.throwIfAborted();\r\n const v = await val;\r\n signal?.throwIfAborted();\r\n return isSome(v) ? v : fn();\r\n};\r\n\r\n// ========================================\r\n// 集合操作\r\n// ========================================\r\n\r\n/**\r\n * Maps array with async function, fails if any returns None.\r\n * @typeparam T - Input type\r\n * @typeparam R - Output type\r\n * @param items - Input array\r\n * @param fn - Async mapping function\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<R[]>\r\n */\r\nexport const mapAllAsync = async <T, R>(\r\n items: readonly T[],\r\n fn: (it: T, i: number) => AnyMaybe<R>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<R[]> => {\r\n signal?.throwIfAborted();\r\n const results = await Promise.all(\r\n items.map(async (it, i) => {\r\n signal?.throwIfAborted();\r\n return await fn(it, i);\r\n }),\r\n );\r\n signal?.throwIfAborted();\r\n\r\n const final: R[] = [];\r\n for (const r of results) {\r\n if (!isSome(r)) return None();\r\n final.push(r);\r\n }\r\n return Some(final);\r\n};\r\n\r\n/**\r\n * Returns all async values if all are Some, None otherwise.\r\n * @typeparam T - Element type\r\n * @param vals - Array of async Maybes\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<T[]>\r\n */\r\nexport const allAsync = async <T>(\r\n vals: readonly AnyMaybe<T>[],\r\n signal?: AbortSignal,\r\n): AsyncMaybe<T[]> => {\r\n signal?.throwIfAborted();\r\n const resolved = await Promise.all(\r\n vals.map((v) => {\r\n signal?.throwIfAborted();\r\n return Promise.resolve(v);\r\n }),\r\n );\r\n signal?.throwIfAborted();\r\n return resolved.every(isSome) ? Some(resolved as T[]) : None();\r\n};\r\n\r\n/**\r\n * Returns first Some value from async array, None if none found.\r\n * @typeparam T - Element type\r\n * @param vals - Array of async Maybes\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<T>\r\n */\r\nexport const firstSomeAsync = async <T>(\r\n vals: readonly AnyMaybe<T>[],\r\n signal?: AbortSignal,\r\n): AsyncMaybe<T> => {\r\n signal?.throwIfAborted();\r\n const resolved = await Promise.all(\r\n vals.map((v) => {\r\n signal?.throwIfAborted();\r\n return Promise.resolve(v);\r\n }),\r\n );\r\n signal?.throwIfAborted();\r\n\r\n for (const v of resolved) {\r\n if (isSome(v)) return Some(v);\r\n }\r\n return None();\r\n};\r\n\r\n// ========================================\r\n// 规约与聚合\r\n// ========================================\r\n\r\n/**\r\n * Reduces array of async Maybes with async reducer.\r\n * @typeparam T - Element type\r\n * @typeparam R - Result type\r\n * @param vals - Array of async Maybes\r\n * @param initial - Initial value\r\n * @param reducer - Async reduction function\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<R>\r\n */\r\nexport async function reduceAsync<T, R>(\r\n vals: readonly AnyMaybe<T>[],\r\n initial: R,\r\n reducer: (acc: R, v: T) => R | Promise<R>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<R> {\r\n signal?.throwIfAborted();\r\n let acc = initial;\r\n const resolved_vals = await Promise.all(\r\n vals.map((v) => {\r\n signal?.throwIfAborted();\r\n return Promise.resolve(v);\r\n }),\r\n );\r\n signal?.throwIfAborted();\r\n\r\n for (const v of resolved_vals) {\r\n if (!isSome(v)) return None();\r\n acc = await reducer(acc, v);\r\n signal?.throwIfAborted();\r\n }\r\n return Some(acc);\r\n}\r\n\r\n/**\r\n * Performs async scan reduction on array of async Maybes.\r\n * @typeparam T - Element type\r\n * @typeparam R - Result type\r\n * @param vals - Array of async Maybes\r\n * @param initial - Initial value\r\n * @param scanner - Async scanning function\r\n * @param signal - Optional AbortSignal\r\n * @returns AsyncMaybe<R[]>\r\n */\r\nexport async function scanAsync<T, R>(\r\n vals: readonly AnyMaybe<T>[],\r\n initial: R,\r\n scanner: (acc: R, v: T) => R | Promise<R>,\r\n signal?: AbortSignal,\r\n): AsyncMaybe<R[]> {\r\n signal?.throwIfAborted();\r\n const resolved = await Promise.all(\r\n vals.map((v) => {\r\n signal?.throwIfAborted();\r\n return Promise.resolve(v);\r\n }),\r\n );\r\n signal?.throwIfAborted();\r\n\r\n const scanned: R[] = [initial];\r\n let acc = initial;\r\n\r\n for (const v of resolved) {\r\n if (!isSome(v)) return None();\r\n acc = await scanner(acc, v);\r\n signal?.throwIfAborted();\r\n scanned.push(acc);\r\n }\r\n return Some(scanned);\r\n}\r\n\r\n// ========================================\r\n// 集合筛选与统计\r\n// ========================================\r\n\r\n/**\r\n * Collects all Some values from async array.\r\n * @typeparam T - Element type\r\n * @param vals - Array of async Maybes\r\n * @param signal - Optional AbortSignal\r\n * @returns Promise<T[]> - Only Some values\r\n */\r\nexport const collectSomesAsync = async <T>(\r\n vals: readonly AnyMaybe<T>[],\r\n signal?: AbortSignal,\r\n): Promise<T[]> => {\r\n signal?.throwIfAborted();\r\n const resolved = await Promise.all(\r\n vals.map((v) => {\r\n signal?.throwIfAborted();\r\n return Promise.resolve(v);\r\n }),\r\n );\r\n signal?.throwIfAborted();\r\n return resolved.filter(isSome) as T[];\r\n};\r\n\r\n/**\r\n * Partitions async array into Some values and None count.\r\n * @typeparam T - Element type\r\n * @param vals - Array of async Maybes\r\n * @param signal - Optional AbortSignal\r\n * @returns Promise<[T[], number]> - [Some values, None count]\r\n */\r\nexport const partitionAsync = async <T>(\r\n vals: readonly AnyMaybe<T>[],\r\n signal?: AbortSignal,\r\n): Promise<[T[], number]> => {\r\n signal?.throwIfAborted();\r\n const resolved = await Promise.all(\r\n vals.map((v) => {\r\n signal?.throwIfAborted();\r\n return Promise.resolve(v);\r\n }),\r\n );\r\n signal?.throwIfAborted();\r\n\r\n const somes: T[] = [];\r\n let none_count = 0;\r\n\r\n for (const v of resolved) {\r\n if (isSome(v)) somes.push(v);\r\n else none_count++;\r\n }\r\n\r\n return [somes, none_count];\r\n};\r\n"],"names":["match","val","onSome","onNone","isSome","ifSome","onElse","ifNone","isNone","peek","fn","peekNone","peekBoth","fnSome","fnNone","matchAsync","signal","unwrapped","res","dynamicAwait","ifSomeAsync","ifNoneAsync","peekAsync","peekNoneAsync","peekBothAsync","map","Some","None","andThen","ap","fn_val","filter","predicate","mapIf","and","other","or","orElse","fold","initial","contains","x","zip","a","b","zipWith","ma","mb","all","vals","mapAll","items","results","i","partition","somes","none_count","v","collectSomes","result","firstSome","reduce","reducer","acc","scan","scanner","scanned","folds","apAsync","f","mapAsync","mapIfAsync","shouldMap","andThenAsync","filterAsync","shouldKeep","zipAsync","ra","rb","foldAsync","orElseAsync","mapAllAsync","it","final","r","allAsync","resolved","firstSomeAsync","reduceAsync","resolved_vals","scanAsync","collectSomesAsync","partitionAsync"],"mappings":";;AAkBO,MAAMA,IAAQ,CACnBC,GACAC,GACAC,MACOC,EAAOH,CAAG,IAAIC,EAAOD,CAAG,IAAIE,EAAA;AA6B9B,SAASE,EACdJ,GACAC,GACAI,GACgB;AAChB,SAAOF,EAAOH,CAAG,IAAIC,EAAOD,CAAG,IAAIK,IAAA;AACrC;AA0BO,SAASC,EACdN,GACAE,GACAG,GACgB;AAChB,SAAOE,EAAOP,CAAG,IAAIE,EAAA,IAAWG,IAASL,CAAG;AAC9C;AAYO,MAAMQ,IAAO,CAAIR,GAAeS,OACjCN,EAAOH,CAAG,KAAGS,EAAGT,CAAG,GAChBA,IASIU,IAAW,CAAIV,GAAeS,OACrCF,EAAOP,CAAG,KAAGS,EAAA,GACVT;AASF,SAASW,EACdX,GACA;AAAA,EACE,QAAAY,IAAS,MAAM;AAAA,EAAC;AAAA,EAChB,QAAAC,IAAS,MAAM;AAAA,EAAC;AAClB,GAIU;AACV,SAAIV,EAAOH,CAAG,IACZY,EAAOZ,CAAG,IAEVa,EAAA,GAGKb;AACT;ACvHA,eAAsBc,EACpBd,GACAC,GACAC,GACAa,GACY;AACZ,EAAAA,GAAQ,eAAA;AACR,QAAMC,IAAY,MAAMhB;AAExB,MAAIG,EAAOa,CAAS,GAAG;AACrB,UAAMC,IAAM,MAAMC,EAAajB,EAAOe,GAAWD,CAAM,CAAC;AACxD,WAAAA,GAAQ,eAAA,GACDE;AAAA,EACT,OAAO;AACL,UAAMA,IAAM,MAAMC,EAAahB,EAAOa,CAAM,CAAC;AAC7C,WAAAA,GAAQ,eAAA,GACDE;AAAA,EACT;AACF;AA4BA,eAAsBE,EACpBnB,GACAC,GACAI,GACyB;AACzB,QAAMW,IAAY,MAAMhB;AAExB,SAAIG,EAAOa,CAAS,IACX,MAAME,EAAajB,EAAOe,CAAS,CAAC,IAEvCX,IACK,MAAMa,EAAab,GAAQ,IAEpC;AAEJ;AA4BA,eAAsBe,EACpBpB,GACAE,GACAG,GACyB;AACzB,QAAMW,IAAY,MAAMhB;AAExB,SAAIO,EAAOS,CAAS,IACX,MAAME,EAAahB,GAAQ,IAE9BG,IACK,MAAMa,EAAab,EAAOW,CAAS,CAAC,IAE7C;AAEJ;AAaA,eAAsBK,EACpBrB,GACAS,GACAM,GACmB;AACnB,EAAAA,GAAQ,eAAA;AACR,QAAMC,IAAY,MAAMhB;AACxB,SAAAe,GAAQ,eAAA,GAEJZ,EAAOa,CAAS,MAClB,MAAME,EAAaT,EAAGO,GAAWD,CAAM,CAAC,GACxCA,GAAQ,eAAA,IAEHC;AACT;AASA,eAAsBM,EACpBtB,GACAS,GACAM,GACmB;AACnB,EAAAA,GAAQ,eAAA;AACR,QAAMC,IAAY,MAAMhB;AACxB,SAAAe,GAAQ,eAAA,GAEJR,EAAOS,CAAS,MAClB,MAAME,EAAaT,EAAGM,CAAM,CAAC,GAC7BA,GAAQ,eAAA,IAEHC;AACT;AASA,eAAsBO,EACpBvB,GACA;AAAA,EACE,QAAAY,IAAS,MAAM;AAAA,EAAC;AAAA,EAChB,QAAAC,IAAS,MAAM;AAAA,EAAC;AAClB,GAIAE,GACmB;AACnB,EAAAA,GAAQ,eAAA;AACR,QAAMC,IAAY,MAAMhB;AACxB,SAAAe,GAAQ,eAAA,GAEJZ,EAAOa,CAAS,IAClB,MAAME,EAAaN,EAAOI,GAAWD,CAAM,CAAC,IAE5C,MAAMG,EAAaL,EAAOE,CAAM,CAAC,GAEnCA,GAAQ,eAAA,GAEDC;AACT;AC7LO,MAAMQ,IAAM,CAAOxB,GAAeS,MACvCN,EAAOH,CAAG,IAAIyB,EAAKhB,EAAGT,CAAG,CAAC,IAAI0B,EAAA,GAUnBC,IAAU,CACrB3B,GACAS,MACcN,EAAOH,CAAG,IAAIS,EAAGT,CAAG,IAAIA,GAU3B4B,IAAK,CAChBC,GACA7B,MACcG,EAAO0B,CAAM,KAAK1B,EAAOH,CAAG,IAAIyB,EAAKI,EAAO7B,CAAG,CAAC,IAAI0B,EAAA,GASvDI,IAAS,CACpB9B,GACA+B,MACc5B,EAAOH,CAAG,KAAK+B,EAAU/B,CAAG,IAAIA,IAAM0B,EAAA,GAWzCM,IAAQ,CACnBhC,GACA+B,GACAtB,MACcN,EAAOH,CAAG,KAAK+B,EAAU/B,CAAG,IAAIyB,EAAKhB,EAAGT,CAAG,CAAC,IAAI0B,EAAA,GAcnDO,IAAM,CAAOjC,GAAekC,MACvC/B,EAAOH,CAAG,IAAIkC,IAAQR,EAAA,GASXS,IAAK,CAAInC,GAAekC,MACnC/B,EAAOH,CAAG,IAAIA,IAAMkC,GASTE,IAAS,CAAIpC,GAAeS,MACvCN,EAAOH,CAAG,IAAIA,IAAMS,EAAA,GAWT4B,IAAO,CAClBrC,GACAsC,GACArC,MACOE,EAAOH,CAAG,IAAIC,EAAOD,CAAG,IAAIsC,GASxBC,IAAW,CAAIvC,GAAewC,MACzCrC,EAAOH,CAAG,KAAKA,MAAQwC,GAcZC,IAAM,CAAOC,GAAaC,MACrCxC,EAAOuC,CAAC,KAAKvC,EAAOwC,CAAC,IAAIlB,EAAK,CAACiB,GAAGC,CAAC,CAAW,IAAIjB,EAAA,GAYvCkB,IAAU,CACrBC,GACAC,GACArC,MACcN,EAAO0C,CAAE,KAAK1C,EAAO2C,CAAE,IAAIrB,EAAKhB,EAAGoC,GAAIC,CAAE,CAAC,IAAIpB,EAAA,GAYjDqB,IAAM,CAAIC,MACrBA,EAAK,MAAM7C,CAAM,IAAIsB,EAAKuB,CAAW,IAAItB,EAAA,GAU9BuB,IAAS,CACpBC,GACAzC,MACe;AACf,QAAM0C,IAAe,CAAA;AACrB,WAASC,IAAI,GAAGA,IAAIF,EAAM,QAAQE,KAAK;AACrC,UAAMnC,IAAMR,EAAGyC,EAAME,CAAC,GAAGA,CAAC;AAC1B,QAAI,CAACjD,EAAOc,CAAG,UAAUS,EAAA;AACzB,IAAAyB,EAAQ,KAAKlC,CAAG;AAAA,EAClB;AACA,SAAOQ,EAAK0B,CAAO;AACrB,GAQaE,IAAY,CAAIL,MAA6C;AACxE,QAAMM,IAAa,CAAA;AACnB,MAAIC,IAAa;AACjB,aAAWC,KAAKR;AACd,IAAI7C,EAAOqD,CAAC,IAAGF,EAAM,KAAKE,CAAC,IACtBD;AAEP,SAAO,CAACD,GAAOC,CAAU;AAC3B,GAQaE,IAAe,CAAIT,MAAmC;AACjE,QAAMU,IAAc,CAAA;AACpB,aAAWF,KAAKR,EAAM,CAAI7C,EAAOqD,CAAC,KAAGE,EAAO,KAAKF,CAAC;AAClD,SAAOE;AACT,GAQaC,IAAY,CAAIX,MAC3BA,EAAK,KAAK7C,CAAM,KAAKuB,EAAA;AAehB,SAASkC,EACdZ,GACAV,GACAuB,GACU;AACV,MAAIC,IAAMxB;AACV,aAAWkB,KAAKR,GAAM;AACpB,QAAI,CAAC7C,EAAOqD,CAAC,UAAU9B,EAAA;AACvB,IAAAoC,IAAMD,EAAQC,GAAKN,CAAC;AAAA,EACtB;AACA,SAAO/B,EAAKqC,CAAG;AACjB;AAWO,SAASC,EACdf,GACAV,GACA0B,GACY;AACZ,QAAMC,IAAe,CAAC3B,CAAO;AAC7B,MAAIwB,IAAMxB;AACV,aAAWkB,KAAKR,GAAM;AACpB,QAAI,CAAC7C,EAAOqD,CAAC,UAAU9B,EAAA;AACvB,IAAAoC,IAAME,EAAQF,GAAKN,CAAC,GACpBS,EAAQ,KAAKH,CAAG;AAAA,EAClB;AACA,SAAOrC,EAAKwC,CAAO;AACrB;AAYO,MAAMC,IAAQ,CACnBlB,GACAV,GACArC,GACAC,MACM;AACN,MAAI4D,IAAMxB;AACV,aAAWkB,KAAKR,EAAM,CAAAc,IAAM3D,EAAOqD,CAAC,IAAIvD,EAAO6D,GAAKN,CAAC,IAAItD,EAAO4D,CAAG;AACnE,SAAOA;AACT,GC9RaK,IAAU,OACrBtC,GACA7B,GACAe,MACkB;AAClB,EAAAA,GAAQ,eAAA;AACR,QAAM,CAACqD,GAAGZ,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC/B,QAAQ,QAAQ3B,CAAM;AAAA,IACtB,QAAQ,QAAQ7B,CAAG;AAAA,EAAA,CACpB;AACD,SAAAe,GAAQ,eAAA,GACDZ,EAAOiE,CAAC,KAAKjE,EAAOqD,CAAC,IAAI/B,EAAK,MAAM2C,EAAEZ,CAAC,CAAC,IAAI9B,EAAA;AACrD,GAWa2C,IAAW,OACtBrE,GACAS,GACAM,MACkB;AAClB,EAAAA,GAAQ,eAAA;AACR,QAAMyC,IAAI,MAAMxD;AAChB,SAAAe,GAAQ,eAAA,GACDZ,EAAOqD,CAAC,IAAI/B,EAAK,MAAMhB,EAAG+C,CAAC,CAAC,IAAI9B,EAAA;AACzC,GAYa4C,IAAa,OACxBtE,GACA+B,GACAtB,GACAM,MACkB;AAClB,EAAAA,GAAQ,eAAA;AACR,QAAMyC,IAAI,MAAMxD;AAEhB,MADAe,GAAQ,eAAA,GACJ,CAACZ,EAAOqD,CAAC,UAAU9B,EAAA;AAEvB,QAAM6C,IAAY,MAAMxC,EAAUyB,CAAC;AACnC,SAAAzC,GAAQ,eAAA,GACDwD,IAAY9C,EAAK,MAAMhB,EAAG+C,CAAC,CAAC,IAAI9B,EAAA;AACzC,GAWa8C,KAAe,OAC1BxE,GACAS,GACAM,MACkB;AAClB,EAAAA,GAAQ,eAAA;AACR,QAAMyC,IAAI,MAAMxD;AAChB,SAAAe,GAAQ,eAAA,GACDZ,EAAOqD,CAAC,IAAI/C,EAAG+C,CAAC,IAAI9B,EAAA;AAC7B,GAUa+C,KAAc,OACzBzE,GACA+B,GACAhB,MACkB;AAClB,EAAAA,GAAQ,eAAA;AACR,QAAMyC,IAAI,MAAMxD;AAEhB,MADAe,GAAQ,eAAA,GACJ,CAACZ,EAAOqD,CAAC,UAAU9B,EAAA;AAEvB,QAAMgD,IAAa,MAAM3C,EAAUyB,CAAC;AACpC,SAAAzC,GAAQ,eAAA,GACD2D,IAAalB,IAAI9B,EAAA;AAC1B,GAeaiD,KAAW,OACtBjC,GACAC,GACA5B,MACuB;AACvB,EAAAA,GAAQ,eAAA;AACR,QAAM,CAAC6D,GAAIC,CAAE,IAAI,MAAM,QAAQ,IAAI,CAAC,QAAQ,QAAQnC,CAAC,GAAG,QAAQ,QAAQC,CAAC,CAAC,CAAC;AAC3E,SAAA5B,GAAQ,eAAA,GACDZ,EAAOyE,CAAE,KAAKzE,EAAO0E,CAAE,IAAIpD,EAAK,CAACmD,GAAIC,CAAE,CAAC,IAAInD,EAAA;AACrD,GAgBaoD,KAAY,OACvB9E,GACAsC,GACArC,GACAc,MACe;AACf,EAAAA,GAAQ,eAAA;AACR,QAAMyC,IAAI,MAAMxD;AAChB,SAAAe,GAAQ,eAAA,GACDZ,EAAOqD,CAAC,IAAIvD,EAAOuD,CAAC,IAAIlB;AACjC,GAUayC,KAAc,OACzB/E,GACAS,GACAM,MACkB;AAClB,EAAAA,GAAQ,eAAA;AACR,QAAMyC,IAAI,MAAMxD;AAChB,SAAAe,GAAQ,eAAA,GACDZ,EAAOqD,CAAC,IAAIA,IAAI/C,EAAA;AACzB,GAeauE,KAAc,OACzB9B,GACAzC,GACAM,MACoB;AACpB,EAAAA,GAAQ,eAAA;AACR,QAAMoC,IAAU,MAAM,QAAQ;AAAA,IAC5BD,EAAM,IAAI,OAAO+B,GAAI7B,OACnBrC,GAAQ,eAAA,GACD,MAAMN,EAAGwE,GAAI7B,CAAC,EACtB;AAAA,EAAA;AAEH,EAAArC,GAAQ,eAAA;AAER,QAAMmE,IAAa,CAAA;AACnB,aAAWC,KAAKhC,GAAS;AACvB,QAAI,CAAChD,EAAOgF,CAAC,UAAUzD,EAAA;AACvB,IAAAwD,EAAM,KAAKC,CAAC;AAAA,EACd;AACA,SAAO1D,EAAKyD,CAAK;AACnB,GASaE,KAAW,OACtBpC,GACAjC,MACoB;AACpB,EAAAA,GAAQ,eAAA;AACR,QAAMsE,IAAW,MAAM,QAAQ;AAAA,IAC7BrC,EAAK,IAAI,CAACQ,OACRzC,GAAQ,eAAA,GACD,QAAQ,QAAQyC,CAAC,EACzB;AAAA,EAAA;AAEH,SAAAzC,GAAQ,eAAA,GACDsE,EAAS,MAAMlF,CAAM,IAAIsB,EAAK4D,CAAe,IAAI3D,EAAA;AAC1D,GASa4D,KAAiB,OAC5BtC,GACAjC,MACkB;AAClB,EAAAA,GAAQ,eAAA;AACR,QAAMsE,IAAW,MAAM,QAAQ;AAAA,IAC7BrC,EAAK,IAAI,CAACQ,OACRzC,GAAQ,eAAA,GACD,QAAQ,QAAQyC,CAAC,EACzB;AAAA,EAAA;AAEH,EAAAzC,GAAQ,eAAA;AAER,aAAWyC,KAAK6B;AACd,QAAIlF,EAAOqD,CAAC,EAAG,QAAO/B,EAAK+B,CAAC;AAE9B,SAAO9B,EAAA;AACT;AAgBA,eAAsB6D,GACpBvC,GACAV,GACAuB,GACA9C,GACe;AACf,EAAAA,GAAQ,eAAA;AACR,MAAI+C,IAAMxB;AACV,QAAMkD,IAAgB,MAAM,QAAQ;AAAA,IAClCxC,EAAK,IAAI,CAACQ,OACRzC,GAAQ,eAAA,GACD,QAAQ,QAAQyC,CAAC,EACzB;AAAA,EAAA;AAEH,EAAAzC,GAAQ,eAAA;AAER,aAAWyC,KAAKgC,GAAe;AAC7B,QAAI,CAACrF,EAAOqD,CAAC,UAAU9B,EAAA;AACvB,IAAAoC,IAAM,MAAMD,EAAQC,GAAKN,CAAC,GAC1BzC,GAAQ,eAAA;AAAA,EACV;AACA,SAAOU,EAAKqC,CAAG;AACjB;AAYA,eAAsB2B,GACpBzC,GACAV,GACA0B,GACAjD,GACiB;AACjB,EAAAA,GAAQ,eAAA;AACR,QAAMsE,IAAW,MAAM,QAAQ;AAAA,IAC7BrC,EAAK,IAAI,CAACQ,OACRzC,GAAQ,eAAA,GACD,QAAQ,QAAQyC,CAAC,EACzB;AAAA,EAAA;AAEH,EAAAzC,GAAQ,eAAA;AAER,QAAMkD,IAAe,CAAC3B,CAAO;AAC7B,MAAIwB,IAAMxB;AAEV,aAAWkB,KAAK6B,GAAU;AACxB,QAAI,CAAClF,EAAOqD,CAAC,UAAU9B,EAAA;AACvB,IAAAoC,IAAM,MAAME,EAAQF,GAAKN,CAAC,GAC1BzC,GAAQ,eAAA,GACRkD,EAAQ,KAAKH,CAAG;AAAA,EAClB;AACA,SAAOrC,EAAKwC,CAAO;AACrB;AAaO,MAAMyB,KAAoB,OAC/B1C,GACAjC,MACiB;AACjB,EAAAA,GAAQ,eAAA;AACR,QAAMsE,IAAW,MAAM,QAAQ;AAAA,IAC7BrC,EAAK,IAAI,CAACQ,OACRzC,GAAQ,eAAA,GACD,QAAQ,QAAQyC,CAAC,EACzB;AAAA,EAAA;AAEH,SAAAzC,GAAQ,eAAA,GACDsE,EAAS,OAAOlF,CAAM;AAC/B,GASawF,KAAiB,OAC5B3C,GACAjC,MAC2B;AAC3B,EAAAA,GAAQ,eAAA;AACR,QAAMsE,IAAW,MAAM,QAAQ;AAAA,IAC7BrC,EAAK,IAAI,CAACQ,OACRzC,GAAQ,eAAA,GACD,QAAQ,QAAQyC,CAAC,EACzB;AAAA,EAAA;AAEH,EAAAzC,GAAQ,eAAA;AAER,QAAMuC,IAAa,CAAA;AACnB,MAAIC,IAAa;AAEjB,aAAWC,KAAK6B;AACd,IAAIlF,EAAOqD,CAAC,IAAGF,EAAM,KAAKE,CAAC,IACtBD;AAGP,SAAO,CAACD,GAAOC,CAAU;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("../chunks/Errors-BWEYu-AB.cjs"),w=require("../chunks/base-r6kn0B0D.cjs"),_=require("../chunks/helper-tsqZMRHW.cjs"),P=require("../chunks/delay-CG3cD7bk.cjs"),L=require("../chunks/base-BTXL1y_I.cjs"),x=Symbol("Flow Continue"),k=a=>a,F={unsubscribe:w.noop,[Symbol.dispose]:w.noop},D=64,j=.65;function A(a,t){return a<D?!1:a/Math.max(1,t)>j}function C(a,t){let e=0;for(let r=t;r<a.length;r++)a[e]=a[r],e++;return a.length=e,0}function B(a,t){let e=0;for(let r=t;r<a.length;r++){const n=a[r];a[e]=n,n.queue_index=e,e++}return a.length=e,0}class S{observers=new Set;teardowns=new Array;has_error=!1;is_completed=!1;thrown_error;pending_items=new Array;queue_head=0;broadcast(t){this.closed||this.observers.forEach(e=>e.next?.(t))}broadcastError(t){this.thrown_error=t,this.has_error=!0,this.observers.forEach(e=>e.error?.(t)),this.disposeInternal()}broadcastComplete(){this.is_completed=!0,this.observers.forEach(t=>t.complete?.()),this.disposeInternal()}disposeInternal(){for(const t of this.teardowns)t();this.teardowns.length=0,this.observers.clear()}shouldCompact(){return A(this.queue_head,this.pending_items.length)}compactQueue(){this.queue_head=B(this.pending_items,this.queue_head)}removePendingItem(t){this.pending_items[t.queue_index]=null,t.queue_index===this.queue_head&&this.queue_head++}get closed(){return this.has_error||this.is_completed}addTeardown(t){this.closed?t():this.teardowns.push(t)}subscribe(t){const e=typeof t=="function"?{next:t}:t;if(this.has_error)return e.error?.(this.thrown_error),F;if(this.is_completed)return e.complete?.(),F;this.observers.add(e);const r=this,n=()=>{r.observers.delete(e)};return{unsubscribe:n,[Symbol.dispose]:n}}next(t){this.broadcast(t)}error(t){if(!this.closed){for(let e=this.queue_head;e<this.pending_items.length;e++){const r=this.pending_items[e];r.on_error?Promise.resolve(r.on_error(t)).then(r.resolve,r.reject):r.reject(t)}this.pending_items.length=0,this.queue_head=0,this.broadcastError(t)}}complete(){if(!this.closed){for(let t=this.queue_head;t<this.pending_items.length;t++){const e=this.pending_items[t];e.on_complete?Promise.resolve(e.on_complete()).then(e.resolve,e.reject):e.reject(new E.FlowCompletionError)}this.pending_items.length=0,this.queue_head=0,this.broadcastComplete()}}createPendingItem(){const t={resolve:w.noop,reject:w.noop,queue_index:this.pending_items.length};return this.pending_items.push(t),t}async consume(t,e){const{on_complete:r,on_error:n,signal:o}=e??{};if(this.closed)throw new E.UseAfterFreeError("Subject is closed");if(o?.aborted)throw _.ensureDOMException(o.reason);return new Promise((s,i)=>{let l=0,c=!1;const u=this.createPendingItem();u.resolve=s,u.reject=i,r&&(u.on_complete=r),n&&(u.on_error=n);const h=()=>{o?.removeEventListener("abort",f),this.observers.delete(m),this.removePendingItem(u),this.shouldCompact()&&this.compactQueue()},f=()=>{h(),i(_.ensureDOMException(o.reason))};o?.addEventListener("abort",f);const m={next:g=>{(async()=>{try{const p=await t(g,l++,o);if(c||o?.aborted)return;p!==x&&(c=!0,h(),s(p))}catch(p){h(),i(p)}})()}};this.observers.add(m)})}async switchConsume(t,e){const{on_complete:r,on_error:n,signal:o}=e??{};if(this.closed)throw new E.UseAfterFreeError("Subject is closed");if(o?.aborted)throw _.ensureDOMException(o.reason);return new Promise((s,i)=>{let l=0,c=null,u=!1;const h=this.createPendingItem();h.resolve=s,h.reject=i,r&&(h.on_complete=r),n&&(h.on_error=n);const f=()=>{c?.abort(),m(),i(_.ensureDOMException(o.reason))},m=()=>{o?.removeEventListener("abort",f),this.observers.delete(g),this.removePendingItem(h),this.shouldCompact()&&this.compactQueue()};o?.addEventListener("abort",f);const g={next:p=>{(async()=>{c?.abort();const y=new AbortController;c=y;const T=y.signal;if(o){const b=()=>y.abort();o.addEventListener("abort",b,{once:!0})}try{const b=await t(p,l++,T);if(u||y.signal.aborted)return;b!==x&&(u=!0,m(),s(b))}catch(b){if(b instanceof DOMException&&b.name==="AbortError")return;u=!0,m(),i(b)}})()}};this.observers.add(g)})}[Symbol.asyncIterator](){const t=new Array;let e=null,r=null,n=!1;const o=this.subscribe({next:s=>{e?(e({value:s,done:!1}),e=null):t.push(s)},error:s=>{r=s,e&&(e({value:void 0,done:!0}),e=null)},complete:()=>{n=!0,e&&(e({value:void 0,done:!0}),e=null)}});return{next:async()=>{if(r)throw r;return t.length>0?{value:t.shift(),done:!1}:n?{value:void 0,done:!0}:new Promise(s=>{e=s})},return:()=>(o.unsubscribe(),Promise.resolve({value:void 0,done:!0}))}}}class q extends S{pending_queue=new Array;queue_read_index=0;is_consuming=!1;switchConsume(){throw new TypeError("SerialFlow does not support switchConsume. Use consume() instead.")}async consume(t,e){const{on_complete:r,on_error:n,signal:o}=e??{};if(this.closed)throw new E.UseAfterFreeError("SerialFlow is closed");if(o?.aborted)throw _.ensureDOMException(o.reason);return new Promise((s,i)=>{let l=0;const c=this.createPendingItem();c.resolve=s,c.reject=i,r&&(c.on_complete=r),n&&(c.on_error=n);const u=()=>{o?.removeEventListener("abort",h),this.observers.delete(m),this.removePendingItem(c)},h=()=>{u(),i(_.ensureDOMException(o.reason))};o?.addEventListener("abort",h);const f=async()=>{if(!this.is_consuming){for(this.is_consuming=!0;this.queue_read_index<this.pending_queue.length&&!this.is_completed&&!o?.aborted;){const g=this.pending_queue[this.queue_read_index];this.queue_read_index++;try{const p=await t(g,l++,o);if(o?.aborted)break;if(p!==x){u(),A(this.queue_read_index,this.pending_queue.length)&&(this.queue_read_index=C(this.pending_queue,this.queue_read_index)),s(p);return}}catch(p){if(o?.aborted)return;u(),A(this.queue_read_index,this.pending_queue.length)&&(this.queue_read_index=C(this.pending_queue,this.queue_read_index)),i(p);return}}this.is_consuming=!1}},m={next:g=>{this.pending_queue.push(g),f()}};this.observers.add(m)})}}class U extends S{_value;constructor(t){super(),this._value=t}get value(){return this._value}subscribe(t){const e=typeof t=="function"?{next:t}:t;if(this.has_error)return e.error?.(this.thrown_error),F;if(this.is_completed)return e.complete?.(),F;e.next?.(this._value),this.observers.add(e);const r=this,n=()=>{r.observers.delete(e)};return{unsubscribe:n,[Symbol.dispose]:n}}next(t){this._value=t,super.next(t)}}class I extends S{producer;constructor(t){super(),this.producer=t}subscribe(t){if(this.closed)return super.subscribe(t);const e=super.subscribe(t);try{const r=this.producer(this);r&&this.addTeardown(r)}catch(r){this.error(r)}return e}}function d(a){return new I(a)}function V(a){return new O(a)}function J(...a){return d(t=>{for(const e of a){if(t.closed)return;t.next(e)}t.complete()})}function Q(a){if(a instanceof Promise)return d(t=>{a.then(e=>{t.closed||(t.next(e),t.complete())},e=>{t.closed||t.error(e)})});if(typeof a[Symbol.asyncIterator]=="function")return d(t=>{let e=!1;return(async()=>{try{for await(const r of a){if(e||t.closed)return;t.next(r)}t.complete()}catch(r){t.error(r)}})(),()=>{e=!0}});if(typeof a[Symbol.iterator]=="function")return d(t=>{for(const e of a){if(t.closed)return;t.next(e)}t.complete()});if("length"in a)return d(t=>{const e=a;for(let r=0;r<e.length;r++){if(t.closed)return;t.next(e[r])}t.complete()});throw new TypeError("Cannot convert the provided source to a Flow")}class O extends q{producer;constructor(t){super(),this.producer=t}subscribe(t){if(this.closed)return super.subscribe(t);const e=super.subscribe(t);try{const r=this.producer(this);r&&this.addTeardown(r)}catch(r){this.error(r)}return e}}function W(...a){return d(t=>{let e=0;const r=[];return a.forEach(n=>{const o=n.subscribe({next:s=>t.next(s),error:s=>t.error(s),complete:()=>{e++,e===a.length&&t.complete()}});r.push(o)}),()=>r.forEach(n=>n.unsubscribe())})}function z(...a){return d(t=>{let e=0,r=null;const n=()=>{if(e>=a.length){t.complete();return}r=a[e++].subscribe({next:s=>t.next(s),error:s=>t.error(s),complete:()=>{n()}})};return n(),()=>r?.unsubscribe()})}function H(...a){return d(t=>{const e=[];let r=!1;const n=()=>{r=!0,e.forEach(o=>o.unsubscribe())};return a.forEach(o=>{const s=o.subscribe({next:i=>{r||(n(),t.next(i),t.complete())},error:i=>{r||(n(),t.error(i))},complete:()=>{r||(n(),t.complete())}});e.push(s)}),n})}function N(...a){return d(t=>{const e=[],r=new Array(a.length),n=new Array(a.length).fill(!1);let o=0,s=0;return a.forEach((i,l)=>{r[l]=void 0;const c=i.subscribe({next:u=>{r[l]=u,n[l]||(n[l]=!0,o++),o===a.length&&t.next([...r])},error:u=>t.error(u),complete:()=>{s++,s===a.length&&t.complete()}});e.push(c)}),()=>e.forEach(i=>i.unsubscribe())})}function $(a,...t){return d(e=>{const r=new Array(t.length),n=new Array(t.length).fill(!1);let o=0;const s=[];t.forEach((l,c)=>{r[c]=void 0;const u=l.subscribe({next:h=>{r[c]=h,n[c]||(n[c]=!0,o++)},error:h=>e.error(h),complete:w.noop});s.push(u)});const i=a.subscribe({next:l=>{o===t.length&&e.next([l,...r])},error:l=>e.error(l),complete:()=>e.complete()});return s.push(i),()=>s.forEach(l=>l.unsubscribe())})}function G(...a){return d(t=>{const e=new Array(a.length),r=new Array(a.length).fill(!1);let n=0;const o=[];return a.forEach((s,i)=>{const l=s.subscribe({next:c=>{e[i]=c,r[i]=!0},error:c=>t.error(c),complete:()=>{if(n++,!r[i]){t.complete();return}n===a.length&&(t.next([...e]),t.complete())}});o.push(l)}),()=>o.forEach(s=>s.unsubscribe())})}function K(...a){return d(t=>{const e=a.map(()=>[]),r=a.map(()=>!1);let n=0,o=0;const s=[],i=()=>{for(;n===a.length;){const l=e.map(u=>u.shift());t.next(l);let c=0;for(let u=0;u<e.length;u++)e[u].length>0?c++:r[u]&&o++;if(n=c,o>0){t.complete();return}}};return a.forEach((l,c)=>{if(t.closed)return;const u=l.subscribe({next:h=>{const f=e[c].length===0;e[c].push(h),f&&n++,i()},error:h=>t.error(h),complete:()=>{r[c]=!0,e[c].length===0&&(o++,t.complete())}});s.push(u)}),()=>s.forEach(l=>l.unsubscribe())})}const Y=a=>({value:a}),Z=a=>({delay:a}),M=(a,t=1e3,e=3e4)=>Math.min(t*2**a,e),R=(a,t=1e3,e=3e4,r="full")=>{const n=M(a,t,e),o=Math.random();switch(r){case"full":return o*n;case"equal":return n/2+o*(n/2);case"decorrelated":return Math.min(t+o*n,e)}};async function X(a,t,e){e?.throwIfAborted();let r=0;for(let n=0;;n++){let o;try{o=L.Ok(await a()),e?.throwIfAborted()}catch(i){o=L.Err(i)}const s=await t(o,n,r);if(e?.throwIfAborted(),"value"in s)return s.value;{const i=s.delay;i>0&&await P.delay(i,e),r=i}}}async function ee(a,t){const{maxRetries:e=5,baseDelayMs:r=1e3,maxBackoffMs:n=3e4,signal:o}=t??{};o?.throwIfAborted();let s;for(let i=0;i<=e;i++)try{const l=await a();return o?.throwIfAborted(),l}catch(l){if(s=l,i<e){const c=R(i,r,n,"equal");await P.delay(c,o)}}throw s}const v=Symbol("Original callback");class te{events;emitting_depth=0;pending_removals_set=null;pending_removals_list=null;pending_additions=null;constructor(){this.events=new Map}emitRemoveListener(t,e){this.emit("removeListener",t,e)}on(t,e){const r=e;if(this.emit("newListener",t,e),this.emitting_depth>0)return this.pending_additions??=[],this.pending_additions.push({event:t,callback:r,prepend:!1}),this;const n=this.events.get(t);return n?typeof n=="object"?n.normal.push(r):this.events.set(t,{prepend:[],normal:[n,r]}):this.events.set(t,r),this}off(t,e){const r=this.events.get(t);if(!r)return this;const n=e;if(typeof r=="function")return(r===n||r[v]===e)&&(this.emitting_depth>0?(this.pending_removals_set??=new Set,this.pending_removals_list??=[],this.pending_removals_set.has(r)||(this.pending_removals_set.add(r),this.pending_removals_list.push({event:t,callback:r}))):(this.events.delete(t),this.emitRemoveListener(t,e))),this;if(this.emitting_depth>0){const i=this.findWrappedFn(r,e);return i&&!this.isPendingRemoval(i,t)&&(this.pending_removals_set??=new Set,this.pending_removals_list??=[],this.pending_removals_set.add(i),this.pending_removals_list.push({event:t,callback:i})),this}if(!this.removeFromList(r,e))return this;if(r.prepend.length+r.normal.length===1){const i=r.prepend[0]??r.normal[0];this.events.set(t,i)}return this.emitRemoveListener(t,e),this}findWrappedFn(t,e){const r=e,n=t.normal,o=t.prepend;for(let s=0,i=n.length;s<i;s++){const l=n[s];if(l===r||l[v]===e)return l}for(let s=0,i=o.length;s<i;s++){const l=o[s];if(l===r||l[v]===e)return l}return null}removeFromList(t,e){const r=e,n=t.normal,o=t.prepend;for(let s=n.length-1;s>=0;s--){const i=n[s];if(i===r||i[v]===e)return n.splice(s,1),!0}for(let s=o.length-1;s>=0;s--){const i=o[s];if(i===r||i[v]===e)return o.splice(s,1),!0}return!1}emit(t,...e){const n=this.events.get(t);if(!n){if(t==="error")throw e[0];return!1}if(typeof n=="object"){const o=n.prepend,s=n.normal;this.emitting_depth++;let i=!1;try{for(let l=o.length-1;l>=0;l--){const c=o[l];try{c(...e)}catch(u){i=!0,this.handleEmitError(t,u)}}for(let l=0,c=s.length;l<c;l++){const u=s[l];try{u(...e)}catch(h){i=!0,this.handleEmitError(t,h)}}}finally{this.emitting_depth--,this.emitting_depth===0&&(this.pending_removals_list||this.pending_additions)&&this.flushPendingOperations()}return!i}try{n(...e)}catch(o){return this.handleEmitError(t,o),!1}return!0}handleEmitError(t,e){if(t==="error")throw e;const r=this.events.get("error");if(!r)throw e;if(typeof r=="function"){if(!this.isPendingRemoval(r,"error"))r(e);else throw e;return}const n=r.prepend,o=r.normal;let s=!1;for(let i=0,l=n.length;i<l;i++){const c=n[i];this.isPendingRemoval(c,"error")||(c(e),s=!0)}for(let i=0,l=o.length;i<l;i++){const c=o[i];this.isPendingRemoval(c,"error")||(c(e),s=!0)}if(!s)throw e}isPendingRemoval(t,e){return this.pending_removals_set?.has(t)??!1}flushPendingOperations(){const t=this.pending_removals_list;this.pending_removals_list=null,this.pending_removals_set=null;const e=this.pending_additions;if(this.pending_additions=null,t)for(let r=0,n=t.length;r<n;r++){const{event:o,callback:s}=t[r],i=this.events.get(o);if(i){if(typeof i=="function")i===s&&this.events.delete(o);else{let l=i.normal.indexOf(s);if(l!==-1?i.normal.splice(l,1):(l=i.prepend.indexOf(s),l!==-1&&i.prepend.splice(l,1)),i.prepend.length+i.normal.length===1){const u=i.prepend[0]??i.normal[0];this.events.set(o,u)}}this.emitRemoveListener(o,s)}}if(e)for(let r=0,n=e.length;r<n;r++){const{event:o,callback:s,prepend:i}=e[r],l=this.events.get(o);l?typeof l=="object"?i?l.prepend.push(s):l.normal.push(s):this.events.set(o,i?{prepend:[s],normal:[l]}:{prepend:[],normal:[l,s]}):this.events.set(o,s)}}once(t,e){const r=(...n)=>{this.off(t,r),e(...n)};return r[v]=e,this.on(t,r)}prependListener(t,e){const r=e;if(this.emit("newListener",t,e),this.emitting_depth>0)return this.pending_additions??=[],this.pending_additions.push({event:t,callback:r,prepend:!0}),this;const n=this.events.get(t);return n?typeof n=="object"?n.prepend.push(r):this.events.set(t,{prepend:[r],normal:[n]}):this.events.set(t,r),this}prependOnceListener(t,e){const r=(...n)=>{this.off(t,r),e(...n)};return r[v]=e,this.prependListener(t,r)}listenerCount(t){const e=this.events.get(t);return e?typeof e=="function"?1:e.prepend.length+e.normal.length:0}listeners(t){const e=this.events.get(t);return e?typeof e=="function"?[e]:[...e.prepend,...e.normal]:[]}eventNames(){return Array.from(this.events.keys())}removeAllListeners(t){if(this.emitting_depth>0){if(t){const e=this.events.get(t);if(e)if(this.pending_removals_set??=new Set,this.pending_removals_list??=[],typeof e=="function")this.pending_removals_set.add(e),this.pending_removals_list.push({event:t,callback:e});else{for(let r=0,n=e.prepend.length;r<n;r++){const o=e.prepend[r];this.pending_removals_set.add(o),this.pending_removals_list.push({event:t,callback:o})}for(let r=0,n=e.normal.length;r<n;r++){const o=e.normal[r];this.pending_removals_set.add(o),this.pending_removals_list.push({event:t,callback:o})}}}else{this.pending_removals_set??=new Set,this.pending_removals_list??=[];for(const[e,r]of this.events)if(typeof r=="function")this.pending_removals_set.add(r),this.pending_removals_list.push({event:e,callback:r});else{for(let n=0,o=r.prepend.length;n<o;n++){const s=r.prepend[n];this.pending_removals_set.add(s),this.pending_removals_list.push({event:e,callback:s})}for(let n=0,o=r.normal.length;n<o;n++){const s=r.normal[n];this.pending_removals_set.add(s),this.pending_removals_list.push({event:e,callback:s})}}}return this}if(t){const e=this.events.get(t);if(this.events.delete(t),e){const r=this.events.get("removeListener"),n=[];r&&(typeof r=="function"?n.push(r):n.push(...r.prepend,...r.normal));const o=(s,i)=>{for(let l=0,c=n.length;l<c;l++)try{n[l](s,i)}catch(u){console.error("Error in removeListener handler:",u)}};if(typeof e=="function")o(t,e);else{for(const s of e.prepend)o(t,s);for(const s of e.normal)o(t,s)}}}else{const e=[];for(const[i,l]of this.events)if(typeof l=="function")e.push({event:i,callback:l});else{for(let c=0,u=l.prepend.length;c<u;c++)e.push({event:i,callback:l.prepend[c]});for(let c=0,u=l.normal.length;c<u;c++)e.push({event:i,callback:l.normal[c]})}const r=[],n=[];for(let i=0,l=e.length;i<l;i++){const c=e[i];c.event==="removeListener"?n.push(c):r.push(c)}const o=(i,l)=>{for(let c=0,u=n.length;c<u;c++)try{n[c].callback(i,l)}catch(h){console.error("Error in removeListener handler:",h)}},s=i=>{const{event:l,callback:c}=i,u=this.events.get(l);if(u)if(typeof u=="function")u===c&&this.events.delete(l);else{let h=u.normal.indexOf(c);h!==-1?u.normal.splice(h,1):(h=u.prepend.indexOf(c),h!==-1&&u.prepend.splice(h,1)),u.prepend.length+u.normal.length===0&&this.events.delete(l)}o(l,c)};for(let i=0,l=r.length;i<l;i++)s(r[i]);for(let i=0,l=n.length;i<l;i++)s(n[i]);this.events.clear()}return this}async emitAsync(t,...e){const n=this.events.get(t);if(!n){if(t==="error")throw e[0];return!1}const o=typeof n=="object"?[...n.prepend,...n.normal]:[n],s=new Array;let i=!1;if(await Promise.all(o.map(async l=>{try{await l(...e)}catch(c){if(i=!0,t!=="error"){const u=await this.handleAsyncError(t,c);u!==null&&s.push(u)}else s.push(c)}})),s.length===1)throw s[0];if(s.length>1)throw new AggregateError(s);return!i}async handleAsyncError(t,e){const r=this.events.get("error");if(!r)return e;const n=typeof r=="object"?[...r.prepend,...r.normal]:[r];try{return await Promise.all(n.map(o=>{const s=o(e);return _.isPromiseLike(s)?s:Promise.resolve()})),null}catch(o){return o}}waitFor(t,e){return new Promise((r,n)=>{if(e?.signal?.aborted){n(_.ensureDOMException(e.signal.reason));return}let o;const s=()=>{o!==void 0&&clearTimeout(o),this.off(t,i),e?.signal?.removeEventListener("abort",l)},i=(...c)=>{e?.filter&&!e.filter(...c)||(s(),r(c))},l=()=>{s(),n(_.ensureDOMException(e.signal.reason))};e?.timeout!==void 0&&(o=setTimeout(()=>{s(),n(new Error(`Timeout waiting for event "${String(t)}"`))},e.timeout)),e?.signal?.addEventListener("abort",l,{once:!0}),this.on(t,i)})}onceAsync(t,e){return this.waitFor(t,e)}}exports.BehaviorFlow=U;exports.ColdFlow=I;exports.Continue=Z;exports.EventEmitter=te;exports.Flow=S;exports.FlowContinue=x;exports.FlowStop=k;exports.SerialColdFlow=O;exports.SerialFlow=q;exports.Stop=Y;exports.combineLatestFlow=N;exports.concatFlow=z;exports.expBackoff=M;exports.expJitter=R;exports.forkJoinFlow=G;exports.from=Q;exports.fromProducer=d;exports.fromSerialProducer=V;exports.mergeFlow=W;exports.of=J;exports.pacer=X;exports.raceFlow=H;exports.retry=ee;exports.withLatestFromFlow=$;exports.zipFlow=K;
2
+ //# sourceMappingURL=Reactive.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reactive.cjs","sources":["../../src/Reactive/flow.ts","../../src/Reactive/flow-combination.ts","../../src/Reactive/pace.ts","../../src/Reactive/event_emitter.ts"],"sourcesContent":["// ========================================\n// ./src/Reactive/flow.ts\n// ========================================\n\nimport type {MaybePromise} from 'src/Utils/type-tool';\nimport {FlowCompletionError, UseAfterFreeError} from 'src/Errors';\nimport {noop} from 'src/Utils/Functions/base';\nimport {ensureDOMException} from 'src/unknown-error';\n\n/**\n * Symbol indicating the flow should continue processing.\n * When a controller returns this symbol, the flow keeps waiting for the next value.\n */\nexport const FlowContinue = Symbol('Flow Continue');\n\n/**\n * Stops the flow with the given return value.\n * When a controller returns this, the flow completes and resolves with the value.\n * @template T - The type of the return value.\n * @param value - The value to return.\n * @returns The same value passed in.\n */\nexport const FlowStop = <T>(value: T): T => value;\n\ntype FlowController<T, R> = (\n value: T,\n iteration: number,\n signal: AbortSignal | undefined,\n) => MaybePromise<R | typeof FlowContinue>;\n\ntype SwitchFlowController<T, R> = (\n value: T,\n iteration: number,\n signal: AbortSignal,\n) => MaybePromise<R | typeof FlowContinue>;\n\n/**\n * Options for consuming a Flow.\n * @template R - The return type of the consume operation.\n */\ninterface ConsumeOptions<R> {\n /** Callback invoked when the flow completes normally. */\n on_complete?: () => MaybePromise<R>;\n /** Callback invoked when the flow errors. */\n on_error?: (err: unknown) => MaybePromise<R>;\n /** Optional AbortSignal to cancel the consume operation. */\n signal?: AbortSignal;\n}\n\n// -- 内部类型定义 --\n\ninterface PendingItem<R = unknown> {\n resolve: (value: R) => void;\n reject: (err: unknown) => void;\n on_complete?: () => MaybePromise<R>;\n on_error?: (err: unknown) => MaybePromise<R>;\n queue_index: number;\n}\n\nexport interface Observer<T> {\n next?: (value: T) => void;\n error?: (err: unknown) => void;\n complete?: () => void;\n}\n\nexport type Unsubscribable = Readonly<{\n unsubscribe: () => void;\n [Symbol.dispose](): void;\n}>;\n\n// -- 常量定义 --\n\nconst EMPTY_SUBSCRIPTION: Unsubscribable = {\n unsubscribe: noop,\n [Symbol.dispose]: noop,\n};\n\nconst MIN_QUEUE_SIZE_FOR_COMPACTION = 64;\nconst WASTE_RATIO_THRESHOLD = 0.65;\n\n// ============================================\n// Helper Functions\n// ============================================\n\n// 判断是否需要压缩数组(当浪费空间超过阈值时触发)\nfunction shouldCompactArray(readIndex: number, length: number): boolean {\n if (readIndex < MIN_QUEUE_SIZE_FOR_COMPACTION) return false;\n const waste_ratio = readIndex / Math.max(1, length);\n return waste_ratio > WASTE_RATIO_THRESHOLD;\n}\n\n// 压缩普通数组,移除已读取的元素\nfunction compactArray<T>(queue: T[], readIndex: number): number {\n let write = 0;\n for (let i = readIndex; i < queue.length; i++) {\n queue[write] = queue[i];\n write++;\n }\n queue.length = write;\n return 0;\n}\n\n// 压缩可空数组,同时更新元素的 queue_index\nfunction compactNullableArray<T extends {queue_index: number}>(\n queue: (T | null)[],\n readIndex: number,\n): number {\n let write = 0;\n for (let i = readIndex; i < queue.length; i++) {\n const item = queue[i]!;\n queue[write] = item;\n item.queue_index = write;\n write++;\n }\n queue.length = write;\n return 0;\n}\n\n// ============================================\n// Flow Class\n// ============================================\n\n/**\n * A reactive stream that emits values to subscribers.\n * Supports both push-based (observer pattern) and pull-based (async iterator) consumption.\n * @template T - The type of values emitted by this flow.\n */\nexport class Flow<T> {\n protected observers = new Set<Observer<T>>();\n protected teardowns = new Array<() => void>();\n\n protected has_error = false;\n protected is_completed = false;\n protected thrown_error: unknown;\n\n // pending_items 用于追踪所有正在等待的 consume 调用\n protected pending_items = new Array<PendingItem | null>();\n protected queue_head = 0;\n\n // -- 广播方法 --\n\n protected broadcast(value: T): void {\n if (this.closed) return;\n this.observers.forEach((obs) => obs.next?.(value));\n }\n\n protected broadcastError(err: unknown): void {\n this.thrown_error = err;\n this.has_error = true;\n this.observers.forEach((obs) => obs.error?.(err));\n this.disposeInternal();\n }\n\n protected broadcastComplete(): void {\n this.is_completed = true;\n this.observers.forEach((obs) => obs.complete?.());\n this.disposeInternal();\n }\n\n // -- 生命周期管理 --\n\n protected disposeInternal(): void {\n for (const fn of this.teardowns) fn();\n this.teardowns.length = 0;\n this.observers.clear();\n }\n\n // -- 队列管理 --\n\n protected shouldCompact(): boolean {\n return shouldCompactArray(this.queue_head, this.pending_items.length);\n }\n\n protected compactQueue(): void {\n this.queue_head = compactNullableArray(this.pending_items, this.queue_head);\n }\n\n // 从队列中移除一个 pending item,标记为 null 以便后续压缩\n protected removePendingItem(item: PendingItem): void {\n this.pending_items[item.queue_index] = null;\n if (item.queue_index === this.queue_head) {\n this.queue_head++;\n }\n }\n\n // -- 公开 API --\n\n /** Returns true if the flow has errored or completed. */\n get closed(): boolean {\n return this.has_error || this.is_completed;\n }\n\n /**\n * Registers a teardown function to be called when the flow completes or errors.\n * If the flow is already closed, the teardown is called immediately.\n */\n addTeardown(teardown: () => void): void {\n if (this.closed) {\n teardown();\n } else {\n this.teardowns.push(teardown);\n }\n }\n\n /**\n * Subscribes to the flow with an observer or callback.\n * @param observerOrNext - An Observer object or a callback function for next values.\n * @returns An Unsubscribable that can be used to unsubscribe.\n */\n subscribe(observerOrNext: Observer<T> | ((v: T) => void)): Unsubscribable {\n const observer =\n typeof observerOrNext === 'function'\n ? {next: observerOrNext}\n : observerOrNext;\n\n // 已关闭时立即通知并返回空订阅\n if (this.has_error) {\n observer.error?.(this.thrown_error);\n return EMPTY_SUBSCRIPTION;\n }\n if (this.is_completed) {\n observer.complete?.();\n return EMPTY_SUBSCRIPTION;\n }\n\n this.observers.add(observer);\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const unsubscribe = () => {\n self.observers.delete(observer);\n };\n return {unsubscribe, [Symbol.dispose]: unsubscribe};\n }\n\n /** Emits a value to all subscribers. */\n next(value: T): void {\n this.broadcast(value);\n }\n\n /** Signals an error to all subscribers and completes the flow. */\n error(err: unknown): void {\n if (this.closed) return;\n\n // 处理所有等待中的 consume 调用\n for (let i = this.queue_head; i < this.pending_items.length; i++) {\n const item = this.pending_items[i]!;\n if (item.on_error) {\n void Promise.resolve(item.on_error(err)).then(\n item.resolve,\n item.reject,\n );\n } else {\n item.reject(err);\n }\n }\n this.pending_items.length = 0;\n this.queue_head = 0;\n\n this.broadcastError(err);\n }\n\n /** Signals completion to all subscribers. */\n complete(): void {\n if (this.closed) return;\n\n // 处理所有等待中的 consume 调用\n for (let i = this.queue_head; i < this.pending_items.length; i++) {\n const item = this.pending_items[i]!;\n if (item.on_complete) {\n void Promise.resolve(item.on_complete()).then(\n item.resolve,\n item.reject,\n );\n } else {\n item.reject(new FlowCompletionError());\n }\n }\n this.pending_items.length = 0;\n this.queue_head = 0;\n\n this.broadcastComplete();\n }\n\n // -- Consume 相关 --\n\n protected createPendingItem<R>(): PendingItem<R> {\n const item: PendingItem<R> = {\n resolve: noop,\n reject: noop,\n queue_index: this.pending_items.length,\n };\n this.pending_items.push(item as PendingItem);\n return item;\n }\n\n /**\n * Consumes values from the flow until the controller returns a value.\n * Each emitted value is passed to the controller, which can return:\n * - FlowContinue: keep waiting for more values\n * - Any other value: resolve the promise with that value\n * @template R - The return type of the consume operation.\n * @param controller - Function called for each emitted value.\n * @param options - Optional callbacks for completion/error and abort signal.\n * @returns Promise that resolves when the controller returns a value.\n */\n async consume<R>(\n controller: FlowController<T, R>,\n options?: ConsumeOptions<R>,\n ): Promise<R> {\n const {on_complete, on_error, signal} = options ?? {};\n if (this.closed) throw new UseAfterFreeError('Subject is closed');\n if (signal?.aborted) throw ensureDOMException(signal.reason);\n\n return new Promise<R>((resolve, reject) => {\n let iteration = 0;\n let settled = false;\n\n const pending_item = this.createPendingItem<R>();\n pending_item.resolve = resolve;\n pending_item.reject = reject;\n if (on_complete) pending_item.on_complete = on_complete;\n if (on_error) pending_item.on_error = on_error;\n\n const cleanup = () => {\n signal?.removeEventListener('abort', abort_handler);\n this.observers.delete(internalObserver);\n this.removePendingItem(pending_item as PendingItem);\n if (this.shouldCompact()) this.compactQueue();\n };\n\n const abort_handler = () => {\n cleanup();\n reject(ensureDOMException(signal!.reason));\n };\n\n signal?.addEventListener('abort', abort_handler);\n const internalObserver: Observer<T> = {\n next: (value: T) => {\n void (async () => {\n try {\n const result = await controller(value, iteration++, signal);\n if (settled || signal?.aborted) return;\n if (result !== FlowContinue) {\n settled = true;\n cleanup();\n resolve(result);\n }\n } catch (e) {\n cleanup();\n reject(e as Error);\n }\n })();\n },\n };\n this.observers.add(internalObserver);\n });\n }\n\n /**\n * Similar to consume, but cancels the previous controller call when a new value arrives.\n * Useful for scenarios like search-as-you-type where only the latest input matters.\n * @template R - The return type of the consume operation.\n * @param controller - Function called for each emitted value with an AbortSignal.\n * @param options - Optional callbacks for completion/error and abort signal.\n * @returns Promise that resolves when the controller returns a value.\n */\n async switchConsume<R>(\n controller: SwitchFlowController<T, R>,\n options?: ConsumeOptions<R>,\n ): Promise<R> {\n const {on_complete, on_error, signal: external_signal} = options ?? {};\n if (this.closed) throw new UseAfterFreeError('Subject is closed');\n if (external_signal?.aborted)\n throw ensureDOMException(external_signal.reason);\n\n return new Promise<R>((resolve, reject) => {\n let iteration = 0;\n let current_abort: AbortController | null = null;\n let settled = false;\n\n const pending_item = this.createPendingItem<R>();\n pending_item.resolve = resolve;\n pending_item.reject = reject;\n if (on_complete) pending_item.on_complete = on_complete;\n if (on_error) pending_item.on_error = on_error;\n\n const abort_handler = () => {\n current_abort?.abort();\n cleanup();\n reject(ensureDOMException(external_signal!.reason));\n };\n\n const cleanup = () => {\n external_signal?.removeEventListener('abort', abort_handler);\n this.observers.delete(internalObserver);\n this.removePendingItem(pending_item as PendingItem);\n if (this.shouldCompact()) this.compactQueue();\n };\n\n external_signal?.addEventListener('abort', abort_handler);\n\n const internalObserver: Observer<T> = {\n next: (value: T) => {\n void (async () => {\n // 取消上一次的执行,实现 switch 语义\n current_abort?.abort();\n const abort = new AbortController();\n current_abort = abort;\n\n // 合并外部 signal 和内部 abort\n const combined_signal = abort.signal;\n if (external_signal) {\n const external_abort_handler = () => abort.abort();\n external_signal.addEventListener(\n 'abort',\n external_abort_handler,\n {once: true},\n );\n }\n\n try {\n const result = await controller(\n value,\n iteration++,\n combined_signal,\n );\n // 检查是否已被新调用取代或已取消\n if (settled || abort.signal.aborted) return;\n if (result !== FlowContinue) {\n settled = true;\n cleanup();\n resolve(result);\n }\n } catch (e) {\n // 忽略内部主动 abort 引发的错误\n if (e instanceof DOMException && e.name === 'AbortError') return;\n settled = true;\n\n cleanup();\n reject(e as Error);\n }\n })();\n },\n };\n\n this.observers.add(internalObserver);\n });\n }\n\n /** Returns an async iterator for the flow, enabling for-await-of syntax. */\n [Symbol.asyncIterator](): AsyncIterator<T> {\n const buffer = new Array<T>();\n let resolveNext: ((value: IteratorResult<T>) => void) | null = null;\n let error: unknown = null;\n let done = false;\n\n const subscription = this.subscribe({\n next: (value) => {\n if (resolveNext) {\n resolveNext({value, done: false});\n resolveNext = null;\n } else {\n buffer.push(value);\n }\n },\n error: (err) => {\n error = err;\n if (resolveNext) {\n resolveNext({value: undefined, done: true});\n resolveNext = null;\n }\n },\n complete: () => {\n done = true;\n if (resolveNext) {\n resolveNext({value: undefined, done: true});\n resolveNext = null;\n }\n },\n });\n\n return {\n next: async (): Promise<IteratorResult<T>> => {\n if (error) throw error as Error;\n if (buffer.length > 0) return {value: buffer.shift()!, done: false};\n if (done) return {value: undefined, done: true};\n return new Promise((resolve) => {\n resolveNext = resolve;\n });\n },\n return: (): Promise<IteratorResult<T>> => {\n subscription.unsubscribe();\n return Promise.resolve({value: undefined, done: true});\n },\n };\n }\n}\n\n// ============================================\n// SerialFlow Class\n// ============================================\n\n/**\n * A Flow variant that processes values sequentially.\n * Unlike the base Flow, SerialFlow ensures each value is fully processed\n * before the next one is handled, preventing concurrent controller executions.\n * @template T - The type of values emitted by this flow.\n */\nexport class SerialFlow<T> extends Flow<T> {\n protected pending_queue = new Array<T>();\n protected queue_read_index = 0;\n protected is_consuming = false;\n\n override switchConsume(): never {\n throw new TypeError(\n 'SerialFlow does not support switchConsume. Use consume() instead.',\n );\n }\n\n /**\n * Consumes values sequentially, ensuring each value is fully processed before the next.\n * Values emitted during processing are queued and processed in order.\n */\n async consume<R>(\n controller: FlowController<T, R>,\n options?: ConsumeOptions<R>,\n ): Promise<R> {\n const {on_complete, on_error, signal} = options ?? {};\n if (this.closed) throw new UseAfterFreeError('SerialFlow is closed');\n if (signal?.aborted) throw ensureDOMException(signal.reason);\n\n return new Promise<R>((resolve, reject) => {\n let iteration = 0;\n\n const pending_item = this.createPendingItem<R>();\n pending_item.resolve = resolve;\n pending_item.reject = reject;\n if (on_complete) pending_item.on_complete = on_complete;\n if (on_error) pending_item.on_error = on_error;\n\n const cleanup = () => {\n signal?.removeEventListener('abort', abort_handler);\n this.observers.delete(internalObserver);\n this.removePendingItem(pending_item as PendingItem);\n };\n\n const abort_handler = () => {\n cleanup();\n reject(ensureDOMException(signal!.reason));\n };\n\n signal?.addEventListener('abort', abort_handler);\n\n // 串行处理循环:逐个处理队列中的值\n const runLoop = async () => {\n if (this.is_consuming) return;\n this.is_consuming = true;\n\n while (\n this.queue_read_index < this.pending_queue.length &&\n !this.is_completed &&\n !signal?.aborted\n ) {\n const value = this.pending_queue[this.queue_read_index];\n this.queue_read_index++;\n\n try {\n const result = await controller(value, iteration++, signal);\n if (signal?.aborted) break;\n if (result !== FlowContinue) {\n cleanup();\n if (\n shouldCompactArray(\n this.queue_read_index,\n this.pending_queue.length,\n )\n )\n this.queue_read_index = compactArray(\n this.pending_queue,\n this.queue_read_index,\n );\n resolve(result);\n return;\n }\n } catch (e) {\n if (signal?.aborted) return; // 外部中止,静默退出\n cleanup();\n if (\n shouldCompactArray(\n this.queue_read_index,\n this.pending_queue.length,\n )\n )\n this.queue_read_index = compactArray(\n this.pending_queue,\n this.queue_read_index,\n );\n\n reject(e as Error);\n return;\n }\n }\n\n this.is_consuming = false;\n };\n\n const internalObserver: Observer<T> = {\n next: (value: T) => {\n this.pending_queue.push(value);\n void runLoop();\n },\n };\n\n this.observers.add(internalObserver);\n });\n }\n}\n\n// ============================================\n// BehaviorFlow Class\n// ============================================\n\n/**\n * A Flow that always has a current value and emits it to new subscribers immediately.\n * Similar to RxJS's BehaviorSubject.\n * @template T - The type of the current value.\n */\nexport class BehaviorFlow<T> extends Flow<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n /** Returns the current value. */\n get value(): T {\n return this._value;\n }\n\n /**\n * Subscribes to the flow and immediately receives the current value.\n * @param observerOrNext - An Observer object or a callback function.\n * @returns An Unsubscribable that can be used to unsubscribe.\n */\n override subscribe(\n observerOrNext: Observer<T> | ((v: T) => void),\n ): Unsubscribable {\n const observer =\n typeof observerOrNext === 'function'\n ? {next: observerOrNext}\n : observerOrNext;\n\n if (this.has_error) {\n observer.error?.(this.thrown_error);\n return EMPTY_SUBSCRIPTION;\n }\n if (this.is_completed) {\n observer.complete?.();\n return EMPTY_SUBSCRIPTION;\n }\n\n // 立即发射当前值给新订阅者\n observer.next?.(this._value);\n\n this.observers.add(observer);\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const unsubscribe = () => {\n self.observers.delete(observer);\n };\n return {unsubscribe, [Symbol.dispose]: unsubscribe};\n }\n\n /** Updates the current value and emits it to all subscribers. */\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n}\n\n// ============================================\n// ColdFlow Implementation\n// ============================================\n\n/** Function type that produces values into a Flow. */\nexport type FlowProducer<T> = (flow: Flow<T>) => (() => void) | void;\n\n/**\n * A Flow that starts producing values only when subscribed (cold stream).\n * Each subscription triggers the producer function.\n * @template T - The type of values emitted by this flow.\n */\nexport class ColdFlow<T> extends Flow<T> {\n private producer: FlowProducer<T>;\n\n constructor(producer: FlowProducer<T>) {\n super();\n this.producer = producer;\n }\n\n /**\n * Subscribes to the flow and starts the producer.\n * The producer is called once per subscription.\n */\n override subscribe(\n observerOrNext: Observer<T> | ((v: T) => void),\n ): Unsubscribable {\n if (this.closed) return super.subscribe(observerOrNext);\n\n const sub = super.subscribe(observerOrNext);\n\n try {\n const teardown = this.producer(this);\n if (teardown) {\n this.addTeardown(teardown);\n }\n } catch (err) {\n this.error(err);\n }\n\n return sub;\n }\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/** Creates a Flow from a producer function. */\nexport function fromProducer<T>(producer: FlowProducer<T>): Flow<T> {\n return new ColdFlow(producer);\n}\n\n/** Creates a SerialFlow from a producer function. */\nexport function fromSerialProducer<T>(\n producer: FlowProducer<T>,\n): SerialFlow<T> {\n return new SerialColdFlow(producer);\n}\n\n/** Creates a Flow that emits the given values and completes. */\nexport function of<T>(...values: T[]): Flow<T> {\n return fromProducer((dest) => {\n for (const value of values) {\n if (dest.closed) return;\n dest.next(value);\n }\n dest.complete();\n });\n}\n\n// -- from 函数重载 --\n\nexport function from<T>(source: Iterable<T>): Flow<T>;\nexport function from<T>(source: AsyncIterable<T>): Flow<T>;\nexport function from<T>(source: Promise<T>): Flow<T>;\nexport function from<T>(source: ArrayLike<T>): Flow<T>;\n\n/**\n * Creates a Flow from various source types.\n * @param source - An Iterable, AsyncIterable, Promise, or ArrayLike.\n * @returns A Flow that emits the source's values.\n */\nexport function from<T>(\n source: Iterable<T> | AsyncIterable<T> | Promise<T> | ArrayLike<T>,\n): Flow<T> {\n // Promise: 发射单个值后完成\n if (source instanceof Promise) {\n return fromProducer((dest) => {\n source.then(\n (value) => {\n if (!dest.closed) {\n dest.next(value);\n dest.complete();\n }\n },\n (err) => {\n if (!dest.closed) dest.error(err);\n },\n );\n });\n }\n\n // AsyncIterable: 异步迭代发射值\n if (\n typeof (source as AsyncIterable<T>)[Symbol.asyncIterator] === 'function'\n ) {\n return fromProducer((dest) => {\n let cancelled = false;\n void (async () => {\n try {\n for await (const value of source as AsyncIterable<T>) {\n if (cancelled || dest.closed) return;\n dest.next(value);\n }\n dest.complete();\n } catch (err) {\n dest.error(err);\n }\n })();\n return () => {\n cancelled = true;\n };\n });\n }\n\n // Iterable: 同步迭代发射值\n if (typeof (source as Iterable<T>)[Symbol.iterator] === 'function') {\n return fromProducer((dest) => {\n for (const value of source as Iterable<T>) {\n if (dest.closed) return;\n dest.next(value);\n }\n dest.complete();\n });\n }\n\n // ArrayLike: 按索引访问发射值\n if ('length' in source) {\n return fromProducer((dest) => {\n const arr = source;\n for (let i = 0; i < arr.length; i++) {\n if (dest.closed) return;\n dest.next(arr[i]);\n }\n dest.complete();\n });\n }\n\n throw new TypeError('Cannot convert the provided source to a Flow');\n}\n\n// ============================================\n// SerialColdFlow Class\n// ============================================\n\n/**\n * A SerialFlow that starts producing values only when subscribed.\n * Combines cold stream behavior with sequential processing.\n * @template T - The type of values emitted by this flow.\n */\nexport class SerialColdFlow<T> extends SerialFlow<T> {\n private producer: FlowProducer<T>;\n\n constructor(producer: FlowProducer<T>) {\n super();\n this.producer = producer;\n }\n\n override subscribe(\n observerOrNext: Observer<T> | ((v: T) => void),\n ): Unsubscribable {\n if (this.closed) return super.subscribe(observerOrNext);\n\n const sub = super.subscribe(observerOrNext);\n\n try {\n const teardown = this.producer(this);\n if (teardown) {\n this.addTeardown(teardown);\n }\n } catch (err) {\n this.error(err);\n }\n\n return sub;\n }\n}\n","// ============================================\n// ./src/Reactive/flow-combination.ts\n// ============================================\n\nimport {noop} from 'src/Utils/Functions/base';\nimport {Flow, fromProducer, type Observer, type Unsubscribable} from './flow';\n\ntype FlowInputValue<T> = T extends FlowInput<infer R> ? R : never;\ntype FlowInputTuple<T extends readonly FlowInput<unknown>[]> = {\n [K in keyof T]: FlowInputValue<T[K]>;\n};\ntype PrependTuple<T, R extends readonly unknown[]> = [T, ...R];\n\ninterface FlowInput<T> {\n subscribe(observer: Observer<T>): Unsubscribable;\n}\n\n/**\n * Merges multiple Flow sources into a single Flow that emits values\n * from all sources concurrently. Completes when all sources complete.\n * @template T The value type emitted by the sources\n * @param sources Flow sources to merge\n * @returns A Flow emitting values from all sources as they arrive\n */\nexport function mergeFlow<T>(\n ...sources: [FlowInput<T>, ...FlowInput<T>[]]\n): Flow<T> {\n return fromProducer((dest) => {\n // -- 追踪完成状态 --\n let completedCount = 0;\n const subscriptions: Unsubscribable[] = [];\n\n sources.forEach((source) => {\n const sub = source.subscribe({\n next: (v) => dest.next(v),\n error: (err) => dest.error(err),\n complete: () => {\n completedCount++;\n // 所有源都完成后,才完成目标流\n if (completedCount === sources.length) {\n dest.complete();\n }\n },\n });\n subscriptions.push(sub);\n });\n\n // 取消订阅时,清理所有子订阅\n return () => subscriptions.forEach((sub) => sub.unsubscribe());\n });\n}\n\n/**\n * Concatenates multiple Flow sources sequentially, subscribing to each\n * source only after the previous one completes.\n * @template T The value type emitted by the sources\n * @param sources Flow sources to concatenate\n * @returns A Flow emitting values from each source in order\n */\nexport function concatFlow<T>(\n ...sources: [FlowInput<T>, ...FlowInput<T>[]]\n): Flow<T> {\n return fromProducer((dest) => {\n let index = 0;\n let currentSub: Unsubscribable | null = null;\n\n // 顺序订阅下一个源\n const subscribeNext = () => {\n // 所有源都已处理完毕\n if (index >= sources.length) {\n dest.complete();\n return;\n }\n\n const source = sources[index++];\n currentSub = source.subscribe({\n next: (v) => dest.next(v),\n error: (err) => dest.error(err),\n // 当前源完成后,继续订阅下一个\n complete: () => {\n subscribeNext();\n },\n });\n };\n\n subscribeNext();\n\n return () => currentSub?.unsubscribe();\n });\n}\n\n/**\n * Races multiple Flow sources, emitting the first value, error, or completion\n * from any source and immediately unsubscribing from all others.\n * @template T The value type emitted by the sources\n * @param sources Flow sources to race\n * @returns A Flow mirroring the first source to emit\n */\nexport function raceFlow<T>(\n ...sources: [FlowInput<T>, ...FlowInput<T>[]]\n): Flow<T> {\n return fromProducer((dest) => {\n const subscriptions: Unsubscribable[] = [];\n let finished = false;\n\n // 取消所有订阅并标记完成\n const unsubscribeAll = () => {\n finished = true;\n subscriptions.forEach((sub) => sub.unsubscribe());\n };\n\n sources.forEach((source) => {\n const sub = source.subscribe({\n // 第一个发射的值胜出\n next: (v) => {\n if (finished) return;\n unsubscribeAll();\n dest.next(v);\n dest.complete();\n },\n // 第一个错误胜出\n error: (err) => {\n if (finished) return;\n unsubscribeAll();\n dest.error(err);\n },\n // 第一个完成胜出\n complete: () => {\n if (finished) return;\n unsubscribeAll();\n dest.complete();\n },\n });\n subscriptions.push(sub);\n });\n\n return unsubscribeAll;\n });\n}\n\n/**\n * Combines multiple Flow sources to emit tuples of the latest values\n * from all sources whenever any source emits. Waits for all sources\n * to emit at least once before emitting.\n * @template T A tuple type of Flow sources\n * @param sources Flow sources to combine\n * @returns A Flow emitting tuples of the latest values from all sources\n */\nexport function combineLatestFlow<\n T extends readonly [FlowInput<unknown>, ...FlowInput<unknown>[]],\n>(...sources: T): Flow<FlowInputTuple<T>> {\n return fromProducer((dest) => {\n const subscriptions: Unsubscribable[] = [];\n // 存储每个源的最新值\n const values = new Array<FlowInputValue<T[number]>>(sources.length);\n // 标记每个源是否已发射过值\n const hasValue = new Array<boolean>(sources.length).fill(false);\n let hasValueCount = 0;\n let completedCount = 0;\n\n sources.forEach((source, i) => {\n values[i] = undefined as FlowInputValue<T[number]>;\n\n const sub = source.subscribe({\n next: (v) => {\n values[i] = v as FlowInputValue<T[number]>;\n // 首次收到该源的值\n if (!hasValue[i]) {\n hasValue[i] = true;\n hasValueCount++;\n }\n\n // 所有源都至少发射过一次值后,才发射组合值\n if (hasValueCount === sources.length) {\n dest.next([...values] as FlowInputTuple<T>);\n }\n },\n error: (err) => dest.error(err),\n complete: () => {\n completedCount++;\n if (completedCount === sources.length) {\n dest.complete();\n }\n },\n });\n subscriptions.push(sub);\n });\n\n return () => subscriptions.forEach((s) => s.unsubscribe());\n });\n}\n\n/**\n * Combines a source Flow with other Flows, emitting a tuple of the source value\n * and the latest values from other sources whenever the source emits.\n * Waits for all other sources to emit at least once.\n * @template T The value type emitted by the main source\n * @template R A tuple type of other Flow sources\n * @param source The main Flow that triggers emissions\n * @param others Other Flow sources to combine with\n * @returns A Flow emitting tuples with the source value prepended to other values\n */\nexport function withLatestFromFlow<\n T,\n R extends readonly [FlowInput<unknown>, ...FlowInput<unknown>[]],\n>(\n source: FlowInput<T>,\n ...others: R\n): Flow<PrependTuple<T, FlowInputTuple<R>>> {\n return fromProducer((dest) => {\n // 存储其他源的最新值\n const otherValues = new Array<FlowInputValue<R[number]>>(others.length);\n const hasOthersValue = new Array<boolean>(others.length).fill(false);\n let hasOthersValueCount = 0;\n const subs: Unsubscribable[] = [];\n\n // 先订阅其他源,持续收集它们的最新值\n others.forEach((other, i) => {\n otherValues[i] = undefined as FlowInputValue<R[number]>;\n const sub = other.subscribe({\n next: (v) => {\n otherValues[i] = v as FlowInputValue<R[number]>;\n if (!hasOthersValue[i]) {\n hasOthersValue[i] = true;\n hasOthersValueCount++;\n }\n },\n error: (err) => dest.error(err),\n // 其他源完成不影响主源的行为\n complete: noop,\n });\n subs.push(sub);\n });\n\n // 订阅主源,每次发射时组合其他源的最新值\n const mainSub = source.subscribe({\n next: (v) => {\n // 确保所有其他源都已发射过值\n if (hasOthersValueCount === others.length) {\n dest.next([v, ...otherValues] as unknown as PrependTuple<\n T,\n FlowInputTuple<R>\n >);\n }\n },\n error: (err) => dest.error(err),\n complete: () => dest.complete(),\n });\n subs.push(mainSub);\n\n return () => subs.forEach((s) => s.unsubscribe());\n });\n}\n\n/**\n * Waits for all Flow sources to complete, then emits a tuple of their last values.\n * Emits once when all sources complete. Completes without emitting if any\n * source completes without emitting.\n * @template T A tuple type of Flow sources\n * @param sources Flow sources to join\n * @returns A Flow emitting a single tuple of last values when all sources complete\n */\nexport function forkJoinFlow<\n T extends readonly [FlowInput<unknown>, ...FlowInput<unknown>[]],\n>(...sources: T): Flow<FlowInputTuple<T>> {\n return fromProducer((dest) => {\n // 存储每个源的最后值\n const lastValues = new Array<FlowInputValue<T[number]>>(sources.length);\n const hasEmitted = new Array<boolean>(sources.length).fill(false);\n let completedCount = 0;\n const subs: Unsubscribable[] = [];\n\n sources.forEach((source, i) => {\n const sub = source.subscribe({\n // 只记录最后收到的值,不立即发射\n next: (v) => {\n lastValues[i] = v as FlowInputValue<T[number]>;\n hasEmitted[i] = true;\n },\n error: (err) => dest.error(err),\n complete: () => {\n completedCount++;\n // 如果有源完成但从未发射值,则不发射任何值直接完成\n if (!hasEmitted[i]) {\n dest.complete();\n return;\n }\n\n // 所有源都完成后,发射所有最后值的元组\n if (completedCount === sources.length) {\n dest.next([...lastValues] as FlowInputTuple<T>);\n dest.complete();\n }\n },\n });\n subs.push(sub);\n });\n\n return () => subs.forEach((s) => s.unsubscribe());\n });\n}\n\n/**\n * Zips multiple Flow sources by index, emitting tuples containing the nth\n * value from each source. Completes when any source completes and its\n * buffer is empty.\n * @template T A tuple type of Flow sources\n * @param sources Flow sources to zip\n * @returns A Flow emitting tuples of values at the same index from each source\n */\nexport function zipFlow<\n T extends readonly [FlowInput<unknown>, ...FlowInput<unknown>[]],\n>(\n ...sources: T\n): Flow<{[K in keyof T]: T[K] extends FlowInput<infer R> ? R : never}> {\n return fromProducer((dest) => {\n // 每个源的值缓冲区\n const buffers: unknown[][] = sources.map(() => []);\n // 标记每个源是否已完成\n const doneFlags: boolean[] = sources.map(() => false);\n // 已准备好(缓冲区非空)的源数量\n let readyCount = 0;\n // 已耗尽(完成且缓冲区空)的源数量\n let deadSourceCount = 0;\n const subs: Unsubscribable[] = [];\n\n // 尝试消费缓冲区中的值\n const tryConsume = () => {\n // 当所有源都有值时,按索引配对发射\n while (readyCount === sources.length) {\n const tuple = buffers.map((buf) => buf.shift()!);\n dest.next(\n tuple as {\n [K in keyof T]: T[K] extends FlowInput<infer R> ? R : never;\n },\n );\n\n // 重新计算就绪数量\n let newReadyCount = 0;\n for (let i = 0; i < buffers.length; i++) {\n if (buffers[i].length > 0) newReadyCount++;\n else if (doneFlags[i]) {\n // 缓冲区空且源已完成,该源已耗尽\n deadSourceCount++;\n }\n }\n readyCount = newReadyCount;\n\n // 有源耗尽时,整个 zip 完成\n if (deadSourceCount > 0) {\n dest.complete();\n return;\n }\n }\n };\n\n sources.forEach((source, i) => {\n if (dest.closed) return;\n\n const sub = source.subscribe({\n next: (v) => {\n const wasEmpty = buffers[i].length === 0;\n buffers[i].push(v);\n // 缓冲区从空变非空,增加就绪计数\n if (wasEmpty) readyCount++;\n tryConsume();\n },\n error: (err) => dest.error(err),\n complete: () => {\n doneFlags[i] = true;\n // 源完成且缓冲区空,标记为耗尽\n if (buffers[i].length === 0) {\n deadSourceCount++;\n dest.complete();\n }\n },\n });\n subs.push(sub);\n });\n\n return () => subs.forEach((s) => s.unsubscribe());\n });\n}\n","// ========================================\r\n// ./src/Utils/Functions/pace.ts\r\n// ========================================\r\nimport {delay} from 'src/Concurrent/delay';\r\nimport {Err, Ok} from 'src/Result/base';\r\nimport type {Result} from 'src/Result/types';\r\nimport type {MaybePromise} from '../Utils/type-tool';\r\n\r\n// 定义下一次动作的类型:停止并返回值,或者继续等待\r\ntype NextAction<R> = {readonly value: R} | {readonly delay: number};\r\n\r\n/**\r\n * @template R1 - The input result type from the executed function\r\n * @template R2 - The output result type after pacing logic\r\n */\r\ntype PaceFunction<R1, R2> = (\r\n output: Result<R1, unknown>,\r\n iteration: number,\r\n interval: number,\r\n) => MaybePromise<NextAction<R2>>;\r\n\r\n/**\r\n * Signals the pacer to stop and return a value.\r\n * @template T - The type of value to return\r\n */\r\nexport const Stop = <T>(value: T) => ({value});\r\n\r\n/**\r\n * Signals the pacer to continue waiting with the specified delay.\r\n */\r\nexport const Continue = (delay: number) => ({delay});\r\n\r\n/**\r\n * Calculates exponential backoff delay.\r\n * @param attempt - Current attempt number (0-indexed)\r\n * @param base - Base delay in milliseconds (default: 1000)\r\n * @param max - Maximum delay cap in milliseconds (default: 30000)\r\n */\r\nexport const expBackoff = (attempt: number, base = 1000, max = 30000): number =>\r\n Math.min(base * 2 ** attempt, max);\r\n\r\n/**\r\n * Exponential backoff with jitter strategies to prevent thundering herd.\r\n * @param attempt - Current attempt number (0-indexed)\r\n * @param base - Base delay in milliseconds (default: 1000)\r\n * @param max - Maximum delay cap in milliseconds (default: 30000)\r\n * @param jitter - Jitter strategy: 'full' | 'equal' | 'decorrelated' (default: 'full')\r\n */\r\nexport const expJitter = (\r\n attempt: number,\r\n base = 1000,\r\n max = 30000,\r\n jitter: 'full' | 'equal' | 'decorrelated' = 'full',\r\n): number => {\r\n const delay = expBackoff(attempt, base, max);\r\n const rand = Math.random();\r\n switch (jitter) {\r\n case 'full':\r\n return rand * delay;\r\n case 'equal':\r\n return delay / 2 + rand * (delay / 2);\r\n case 'decorrelated':\r\n return Math.min(base + rand * delay, max);\r\n }\r\n};\r\n\r\n/**\r\n * Executes a function repeatedly with custom pacing logic.\r\n *\r\n * The pace function controls when to stop and what to return based on\r\n * each iteration's result. Useful for implementing retry logic, polling,\r\n * or any iterative async operation with custom backoff strategies.\r\n *\r\n * @template R1 - The return type of the executed function\r\n * @template R2 - The final output type after pacing logic completes\r\n * @param fn - The function to execute on each iteration\r\n * @param pace - Controls iteration flow; return `Stop(value)` to complete or `Continue(ms)` to retry\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns The value passed to `Stop()` when pacing completes\r\n */\r\nexport async function pacer<R1, R2>(\r\n fn: () => MaybePromise<R1>,\r\n pace: PaceFunction<R1, R2>,\r\n signal?: AbortSignal,\r\n): Promise<R2> {\r\n signal?.throwIfAborted();\r\n let interval = 0;\r\n\r\n for (let iteration = 0; ; iteration++) {\r\n let output: Result<R1, unknown>;\r\n try {\r\n output = Ok(await fn());\r\n signal?.throwIfAborted();\r\n } catch (error) {\r\n output = Err(error);\r\n }\r\n\r\n const action = await pace(output, iteration, interval);\r\n signal?.throwIfAborted();\r\n\r\n // 决定停止,返回最终值\r\n if ('value' in action) return action.value;\r\n else {\r\n const ms = action.delay;\r\n // 只有延迟时间大于 0 才真正等待\r\n if (ms > 0) await delay(ms, signal);\r\n interval = ms;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Options for retry operations with exponential backoff.\r\n */\r\ninterface PaceRetryOptions {\r\n /** Maximum number of retry attempts (default: 5) */\r\n readonly maxRetries?: number;\r\n /** Base delay in milliseconds for exponential backoff (default: 1000) */\r\n readonly baseDelayMs?: number;\r\n /** Maximum delay cap in milliseconds (default: 30000) */\r\n readonly maxBackoffMs?: number;\r\n\r\n /** Optional AbortSignal for cancellation */\r\n signal?: AbortSignal;\r\n}\r\n\r\n/**\r\n * Retries an async task with exponential backoff and jitter.\r\n *\r\n * @template T - The return type of the task\r\n * @param task - The async function to retry\r\n * @param options - Retry configuration options\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns The result of the successful task execution\r\n * @throws Last error if all retry attempts fail\r\n */\r\nexport async function retry<T>(\r\n task: () => MaybePromise<T>,\r\n options?: PaceRetryOptions,\r\n): Promise<T> {\r\n const {\r\n maxRetries = 5,\r\n baseDelayMs = 1000,\r\n maxBackoffMs = 30000,\r\n signal,\r\n } = options ?? {};\r\n signal?.throwIfAborted();\r\n\r\n let last_error: unknown;\r\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n try {\r\n const result = await task();\r\n signal?.throwIfAborted();\r\n return result;\r\n } catch (error) {\r\n last_error = error;\r\n if (attempt < maxRetries) {\r\n const wait_ms = expJitter(attempt, baseDelayMs, maxBackoffMs, 'equal');\r\n await delay(wait_ms, signal);\r\n }\r\n }\r\n }\r\n\r\n throw last_error;\r\n}\r\n","// ============================================\r\n// ./src/Reactive/event_emitter.ts\r\n// ============================================\r\n\r\nimport {isPromiseLike} from 'src/helper';\r\nimport {ensureDOMException} from 'src/unknown-error';\r\n\r\ntype Callback<T extends Record<string, unknown[]>, K extends keyof T> = (\r\n ...args: T[K]\r\n) => void;\r\n\r\nconst ORIGINAL_CALLBACK = Symbol('Original callback');\r\n\r\ntype WrappedFn = ((...args: unknown[]) => PromiseLike<void> | void) & {\r\n [ORIGINAL_CALLBACK]?: (...args: unknown[]) => PromiseLike<void> | void;\r\n};\r\n\r\ntype ListenerList = {\r\n prepend: WrappedFn[];\r\n normal: WrappedFn[];\r\n};\r\n\r\ntype Storage = null | WrappedFn | ListenerList;\r\n\r\ntype PendingAddition = {\r\n event: PropertyKey;\r\n callback: WrappedFn;\r\n prepend: boolean;\r\n};\r\n\r\ntype PendingRemoval = {\r\n event: PropertyKey;\r\n callback: WrappedFn;\r\n};\r\n\r\n/**\r\n * A type-safe event emitter that supports synchronous and asynchronous event handling.\r\n *\r\n * Features:\r\n * - Full TypeScript type safety with event map support\r\n * - Special events: `newListener`, `removeListener`, `error`\r\n * - Supports prepend/once/async patterns\r\n * - Deferred listener modification during emit (prevents iteration issues)\r\n * - Optimized storage: single function -> list transition\r\n *\r\n * @template T - Event map where keys are event names and values are argument tuples\r\n *\r\n * @example\r\n * ```ts\r\n * interface MyEvents {\r\n * message: [text: string, from: string];\r\n * data: [payload: unknown];\r\n * error: [err: Error];\r\n * }\r\n *\r\n * const emitter = new EventEmitter<MyEvents>();\r\n * emitter.on('message', (text, from) => console.log(`${from}: ${text}`));\r\n * emitter.emit('message', 'Hello', 'Alice');\r\n * ```\r\n */\r\nexport class EventEmitter<T extends Record<PropertyKey, unknown[]>> {\r\n private events: Map<keyof T, Storage>;\r\n\r\n // 当前嵌套 emit 调用深度,用于延迟处理 on/off 操作\r\n private emitting_depth = 0;\r\n // emit 期间被移除的监听器,待 emit 结束后统一处理\r\n private pending_removals_set: Set<WrappedFn> | null = null;\r\n private pending_removals_list: PendingRemoval[] | null = null;\r\n // emit 期间被添加的监听器,待 emit 结束后统一处理\r\n private pending_additions: PendingAddition[] | null = null;\r\n\r\n /**\r\n * Creates a new EventEmitter instance.\r\n */\r\n constructor() {\r\n this.events = new Map();\r\n }\r\n\r\n private emitRemoveListener<K extends keyof T>(\r\n event: K,\r\n callback: Callback<T, K>,\r\n ): void {\r\n (this.emit as (event: PropertyKey, ...args: unknown[]) => boolean)(\r\n 'removeListener',\r\n event,\r\n callback,\r\n );\r\n }\r\n\r\n // ============================================\r\n // 事件监听管理\r\n // ============================================\r\n\r\n /**\r\n * Registers an event listener that will be invoked each time the event is emitted.\r\n *\r\n * Triggers `newListener` event before adding the listener.\r\n * During an active emit, additions are deferred until the emit completes.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to listen for\r\n * @param callback - The listener function to register\r\n * @returns This EventEmitter instance for chaining\r\n */\r\n on<K extends keyof T>(event: K, callback: Callback<T, K>): this {\r\n const wrapped = callback as WrappedFn;\r\n\r\n (this.emit as (event: PropertyKey, ...args: unknown[]) => boolean)(\r\n 'newListener',\r\n event,\r\n callback,\r\n );\r\n\r\n // emit 期间延迟添加,避免遍历过程中修改数组\r\n if (this.emitting_depth > 0) {\r\n this.pending_additions ??= [];\r\n this.pending_additions.push({event, callback: wrapped, prepend: false});\r\n return this;\r\n }\r\n\r\n const current = this.events.get(event);\r\n\r\n // 优化分支:\r\n // 1. 热路径:已有列表,直接 push\r\n // 2. 冷路径:空,首次添加\r\n // 3. 冷路径:单函数,转换为列表\r\n if (current)\r\n if (typeof current === 'object') current.normal.push(wrapped);\r\n else this.events.set(event, {prepend: [], normal: [current, wrapped]});\r\n else this.events.set(event, wrapped);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a previously registered event listener.\r\n *\r\n * Triggers `removeListener` event after removing the listener.\r\n * During an active emit, removals are deferred until the emit completes.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to remove the listener from\r\n * @param callback - The listener function to remove\r\n * @returns This EventEmitter instance for chaining\r\n */\r\n off<K extends keyof T>(event: K, callback: Callback<T, K>): this {\r\n const current = this.events.get(event);\r\n if (!current) return this;\r\n\r\n const target = callback as WrappedFn;\r\n\r\n // 快速路径:单函数直接匹配\r\n if (typeof current === 'function') {\r\n if (current === target || current[ORIGINAL_CALLBACK] === callback) {\r\n if (this.emitting_depth > 0) {\r\n this.pending_removals_set ??= new Set<WrappedFn>();\r\n this.pending_removals_list ??= [];\r\n if (!this.pending_removals_set.has(current)) {\r\n this.pending_removals_set.add(current);\r\n this.pending_removals_list.push({event, callback: current});\r\n }\r\n } else {\r\n this.events.delete(event);\r\n this.emitRemoveListener(event, callback);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n // emit 期间延迟移除\r\n if (this.emitting_depth > 0) {\r\n const actual_target = this.findWrappedFn(current, callback);\r\n if (actual_target && !this.isPendingRemoval(actual_target, event)) {\r\n this.pending_removals_set ??= new Set<WrappedFn>();\r\n this.pending_removals_list ??= [];\r\n this.pending_removals_set.add(actual_target);\r\n this.pending_removals_list.push({event, callback: actual_target});\r\n }\r\n return this;\r\n }\r\n\r\n const removed = this.removeFromList(current, callback);\r\n if (!removed) return this;\r\n\r\n // 列表只剩一个时降级为单函数存储\r\n const total = current.prepend.length + current.normal.length;\r\n if (total === 1) {\r\n const single = current.prepend[0] ?? current.normal[0];\r\n this.events.set(event, single);\r\n }\r\n\r\n this.emitRemoveListener(event, callback);\r\n return this;\r\n }\r\n\r\n // 在监听器列表中查找匹配的包装函数\r\n // 优先搜索 normal 列表(绝大多数监听器在此)\r\n private findWrappedFn<K extends keyof T>(\r\n list: ListenerList,\r\n callback: Callback<T, K>,\r\n ): WrappedFn | null {\r\n const target = callback as WrappedFn;\r\n const normal = list.normal;\r\n const prepend = list.prepend;\r\n\r\n for (let i = 0, len = normal.length; i < len; i++) {\r\n const cb = normal[i];\r\n if (cb === target || cb[ORIGINAL_CALLBACK] === callback) return cb;\r\n }\r\n for (let i = 0, len = prepend.length; i < len; i++) {\r\n const cb = prepend[i];\r\n if (cb === target || cb[ORIGINAL_CALLBACK] === callback) return cb;\r\n }\r\n return null;\r\n }\r\n\r\n // 从监听器列表中移除指定回调\r\n // 优先搜索 normal 列表,从后向前遍历符合 LIFO 预期\r\n private removeFromList<K extends keyof T>(\r\n list: ListenerList,\r\n callback: Callback<T, K>,\r\n ): boolean {\r\n const target = callback as WrappedFn;\r\n const normal = list.normal;\r\n const prepend = list.prepend;\r\n\r\n for (let i = normal.length - 1; i >= 0; i--) {\r\n const cb = normal[i];\r\n if (cb === target || cb[ORIGINAL_CALLBACK] === callback) {\r\n normal.splice(i, 1);\r\n return true;\r\n }\r\n }\r\n for (let i = prepend.length - 1; i >= 0; i--) {\r\n const cb = prepend[i];\r\n if (cb === target || cb[ORIGINAL_CALLBACK] === callback) {\r\n prepend.splice(i, 1);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Emits an event, invoking all registered listeners with the provided arguments.\r\n *\r\n * Listeners are invoked in order: prepend listeners (reverse order) then normal listeners.\r\n * If no listeners exist and the event is `error`, the error is thrown.\r\n * Listener errors are caught and forwarded to `error` event handlers.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to emit\r\n * @param args - Arguments to pass to the listeners\r\n * @returns `true` if all listeners completed without errors, `false` otherwise\r\n * @throws The error argument if emitting `error` with no listeners\r\n */\r\n emit<K extends keyof T>(event: K, ...args: T[K]): boolean {\r\n const events = this.events;\r\n const current = events.get(event);\r\n\r\n // 空检查\r\n if (!current) {\r\n if (event === 'error') throw args[0];\r\n return false;\r\n }\r\n\r\n // 分支预测优化:高频事件通常是列表(对象),优先判断 object\r\n if (typeof current === 'object') {\r\n const prepend = current.prepend;\r\n const normal = current.normal;\r\n\r\n this.emitting_depth++;\r\n let has_error = false;\r\n\r\n try {\r\n // 反向遍历 prepend(后添加的先执行)\r\n for (let i = prepend.length - 1; i >= 0; i--) {\r\n const cb = prepend[i];\r\n try {\r\n cb(...args);\r\n } catch (error) {\r\n has_error = true;\r\n this.handleEmitError(event, error);\r\n }\r\n }\r\n\r\n // 正向遍历 normal\r\n for (let i = 0, listLen = normal.length; i < listLen; i++) {\r\n const cb = normal[i];\r\n try {\r\n cb(...args);\r\n } catch (error) {\r\n has_error = true;\r\n this.handleEmitError(event, error);\r\n }\r\n }\r\n } finally {\r\n this.emitting_depth--;\r\n\r\n if (\r\n this.emitting_depth === 0 &&\r\n (this.pending_removals_list || this.pending_additions)\r\n )\r\n this.flushPendingOperations();\r\n }\r\n\r\n return !has_error;\r\n }\r\n\r\n // 单函数情况(低频/初始状态)\r\n try {\r\n current(...args);\r\n } catch (error) {\r\n this.handleEmitError(event, error);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n private handleEmitError<K extends keyof T>(event: K, error: unknown): void {\r\n if (event === 'error') throw error;\r\n\r\n const storage = this.events.get('error');\r\n if (!storage) throw error;\r\n\r\n if (typeof storage === 'function') {\r\n if (!this.isPendingRemoval(storage, 'error')) storage(error);\r\n else throw error;\r\n return;\r\n }\r\n\r\n // 保持执行顺序:prepend -> normal\r\n const prepend = storage.prepend;\r\n const normal = storage.normal;\r\n let has_called = false;\r\n\r\n for (let i = 0, len = prepend.length; i < len; i++) {\r\n const cb = prepend[i];\r\n if (this.isPendingRemoval(cb, 'error')) continue;\r\n cb(error);\r\n has_called = true;\r\n }\r\n\r\n for (let i = 0, len = normal.length; i < len; i++) {\r\n const cb = normal[i];\r\n if (this.isPendingRemoval(cb, 'error')) continue;\r\n cb(error);\r\n has_called = true;\r\n }\r\n\r\n if (!has_called) throw error;\r\n }\r\n\r\n // 检查回调是否已在待移除列表中(O(1) 复杂度)\r\n private isPendingRemoval(callback: WrappedFn, _event: keyof T): boolean {\r\n return this.pending_removals_set?.has(callback) ?? false;\r\n }\r\n\r\n // 处理 emit 期间延迟的添加/移除操作\r\n private flushPendingOperations(): void {\r\n const pending_removals = this.pending_removals_list;\r\n this.pending_removals_list = null;\r\n this.pending_removals_set = null;\r\n\r\n const pending_additions = this.pending_additions;\r\n this.pending_additions = null;\r\n\r\n if (pending_removals) {\r\n for (let i = 0, len = pending_removals.length; i < len; i++) {\r\n const {event, callback} = pending_removals[i];\r\n const storage = this.events.get(event);\r\n\r\n if (!storage) continue;\r\n\r\n if (typeof storage === 'function') {\r\n if (storage === callback) this.events.delete(event);\r\n } else {\r\n let idx = storage.normal.indexOf(callback);\r\n if (idx !== -1) {\r\n storage.normal.splice(idx, 1);\r\n } else {\r\n idx = storage.prepend.indexOf(callback);\r\n if (idx !== -1) storage.prepend.splice(idx, 1);\r\n }\r\n\r\n const total = storage.prepend.length + storage.normal.length;\r\n if (total === 1) {\r\n const single = storage.prepend[0] ?? storage.normal[0];\r\n this.events.set(event, single);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\r\n this.emitRemoveListener(event, callback);\r\n }\r\n }\r\n\r\n if (pending_additions) {\r\n for (let i = 0, len = pending_additions.length; i < len; i++) {\r\n const {event, callback, prepend} = pending_additions[i];\r\n const current = this.events.get(event);\r\n\r\n if (!current) {\r\n this.events.set(event, callback);\r\n } else if (typeof current === 'object') {\r\n if (prepend) current.prepend.push(callback);\r\n else current.normal.push(callback);\r\n } else {\r\n this.events.set(\r\n event,\r\n prepend\r\n ? {prepend: [callback], normal: [current]}\r\n : {prepend: [], normal: [current, callback]},\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Registers a one-time listener that removes itself after first invocation.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to listen for\r\n * @param callback - The listener function to register\r\n * @returns This EventEmitter instance for chaining\r\n */\r\n once<K extends keyof T>(event: K, callback: Callback<T, K>): this {\r\n const wrapper = (...args: T[K]) => {\r\n this.off(event, wrapper);\r\n callback(...args);\r\n };\r\n wrapper[ORIGINAL_CALLBACK] = callback as WrappedFn;\r\n return this.on(event, wrapper);\r\n }\r\n\r\n /**\r\n * Registers a listener that will be invoked before other listeners.\r\n *\r\n * Prepend listeners are invoked in reverse order of registration (LIFO).\r\n * Triggers `newListener` event before adding the listener.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to listen for\r\n * @param callback - The listener function to register\r\n * @returns This EventEmitter instance for chaining\r\n */\r\n prependListener<K extends keyof T>(event: K, callback: Callback<T, K>): this {\r\n const wrapped = callback as WrappedFn;\r\n\r\n (this.emit as (event: PropertyKey, ...args: unknown[]) => boolean)(\r\n 'newListener',\r\n event,\r\n callback,\r\n );\r\n\r\n if (this.emitting_depth > 0) {\r\n this.pending_additions ??= [];\r\n this.pending_additions.push({event, callback: wrapped, prepend: true});\r\n return this;\r\n }\r\n\r\n const current = this.events.get(event);\r\n\r\n if (current) {\r\n if (typeof current === 'object') {\r\n current.prepend.push(wrapped);\r\n } else {\r\n this.events.set(event, {prepend: [wrapped], normal: [current]});\r\n }\r\n } else {\r\n this.events.set(event, wrapped);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Registers a one-time prepend listener.\r\n *\r\n * Combines `prependListener` and `once` behavior.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to listen for\r\n * @param callback - The listener function to register\r\n * @returns This EventEmitter instance for chaining\r\n */\r\n prependOnceListener<K extends keyof T>(\r\n event: K,\r\n callback: Callback<T, K>,\r\n ): this {\r\n const wrapper = (...args: T[K]) => {\r\n this.off(event, wrapper);\r\n callback(...args);\r\n };\r\n wrapper[ORIGINAL_CALLBACK] = callback;\r\n return this.prependListener(event, wrapper);\r\n }\r\n\r\n // ============================================\r\n // 监听器查询\r\n // ============================================\r\n\r\n /**\r\n * Returns the number of listeners registered for the specified event.\r\n *\r\n * @param event - The event name to query\r\n * @returns The count of registered listeners\r\n */\r\n listenerCount(event: keyof T): number {\r\n const current = this.events.get(event);\r\n if (!current) return 0;\r\n if (typeof current === 'function') return 1;\r\n return current.prepend.length + current.normal.length;\r\n }\r\n\r\n /**\r\n * Returns a copy of the listeners array for the specified event.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to query\r\n * @returns Array of registered listener functions\r\n */\r\n listeners<K extends keyof T>(event: K): Callback<T, K>[] {\r\n const current = this.events.get(event);\r\n if (!current) return [];\r\n if (typeof current === 'function') return [current];\r\n return [...current.prepend, ...current.normal];\r\n }\r\n\r\n /**\r\n * Returns an array of event names that have registered listeners.\r\n *\r\n * @returns Array of event names with at least one listener\r\n */\r\n eventNames(): (keyof T)[] {\r\n return Array.from(this.events.keys());\r\n }\r\n\r\n /**\r\n * Removes all listeners for a specific event, or all listeners if no event is specified.\r\n *\r\n * Triggers `removeListener` event for each removed listener.\r\n * During an active emit, removals are deferred until the emit completes.\r\n *\r\n * @param event - Optional event name to remove listeners from\r\n * @returns This EventEmitter instance for chaining\r\n */\r\n removeAllListeners(event?: keyof T): this {\r\n // --------------------------------------------\r\n // 场景 A: 正在 emit 过程中 (需要延迟处理)\r\n // --------------------------------------------\r\n if (this.emitting_depth > 0) {\r\n if (event) {\r\n const storage = this.events.get(event);\r\n if (storage) {\r\n this.pending_removals_set ??= new Set<WrappedFn>();\r\n this.pending_removals_list ??= [];\r\n\r\n if (typeof storage === 'function') {\r\n this.pending_removals_set.add(storage);\r\n this.pending_removals_list.push({event, callback: storage});\r\n } else {\r\n // 不去重,同一回调可能在 prepend 和 normal 中各有一份\r\n for (let i = 0, len = storage.prepend.length; i < len; i++) {\r\n const cb = storage.prepend[i];\r\n this.pending_removals_set.add(cb);\r\n this.pending_removals_list.push({event, callback: cb});\r\n }\r\n for (let i = 0, len = storage.normal.length; i < len; i++) {\r\n const cb = storage.normal[i];\r\n this.pending_removals_set.add(cb);\r\n this.pending_removals_list.push({event, callback: cb});\r\n }\r\n }\r\n }\r\n } else {\r\n this.pending_removals_set ??= new Set<WrappedFn>();\r\n this.pending_removals_list ??= [];\r\n\r\n for (const [evt, storage] of this.events) {\r\n if (typeof storage === 'function') {\r\n this.pending_removals_set.add(storage);\r\n this.pending_removals_list.push({event: evt, callback: storage});\r\n } else {\r\n for (let i = 0, len = storage!.prepend.length; i < len; i++) {\r\n const cb = storage!.prepend[i];\r\n this.pending_removals_set.add(cb);\r\n this.pending_removals_list.push({event: evt, callback: cb});\r\n }\r\n for (let i = 0, len = storage!.normal.length; i < len; i++) {\r\n const cb = storage!.normal[i];\r\n this.pending_removals_set.add(cb);\r\n this.pending_removals_list.push({event: evt, callback: cb});\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n // --------------------------------------------\r\n // 场景 B: 非 emit 期间 (立即处理)\r\n // --------------------------------------------\r\n\r\n if (event) {\r\n // 移除特定事件\r\n const storage = this.events.get(event);\r\n this.events.delete(event);\r\n if (storage) {\r\n // 准备触发 removeListener 事件\r\n const rlStorage = this.events.get('removeListener' as keyof T);\r\n const rlListeners: WrappedFn[] = [];\r\n\r\n if (rlStorage) {\r\n if (typeof rlStorage === 'function') {\r\n rlListeners.push(rlStorage);\r\n } else {\r\n rlListeners.push(...rlStorage.prepend, ...rlStorage.normal);\r\n }\r\n }\r\n\r\n const triggerRemove = (\r\n removedEvent: keyof T,\r\n removedCallback: WrappedFn,\r\n ) => {\r\n for (let i = 0, len = rlListeners.length; i < len; i++) {\r\n try {\r\n rlListeners[i](removedEvent, removedCallback);\r\n } catch (e) {\r\n console.error('Error in removeListener handler:', e);\r\n }\r\n }\r\n };\r\n\r\n if (typeof storage === 'function') {\r\n triggerRemove(event, storage);\r\n } else {\r\n for (const cb of storage.prepend) triggerRemove(event, cb);\r\n for (const cb of storage.normal) triggerRemove(event, cb);\r\n }\r\n }\r\n } else {\r\n // 移除所有事件\r\n // 先快照所有监听器\r\n const snapshot: Array<{event: keyof T; callback: WrappedFn}> = [];\r\n for (const [evt, storage] of this.events) {\r\n if (typeof storage === 'function') {\r\n snapshot.push({event: evt, callback: storage});\r\n } else {\r\n for (let i = 0, len = storage!.prepend.length; i < len; i++)\r\n snapshot.push({event: evt, callback: storage!.prepend[i]});\r\n for (let i = 0, len = storage!.normal.length; i < len; i++)\r\n snapshot.push({event: evt, callback: storage!.normal[i]});\r\n }\r\n }\r\n\r\n // 分离 removeListener 监听器和普通监听器\r\n const normal_listeners: typeof snapshot = [];\r\n const remove_listeners: typeof snapshot = [];\r\n\r\n for (let i = 0, len = snapshot.length; i < len; i++) {\r\n const item = snapshot[i];\r\n if (item.event === 'removeListener') {\r\n remove_listeners.push(item);\r\n } else {\r\n normal_listeners.push(item);\r\n }\r\n }\r\n\r\n // 触发 removeListener 事件\r\n const triggerRemoveFromSnapshot = (\r\n removedEvent: keyof T,\r\n removedCallback: WrappedFn,\r\n ) => {\r\n for (let i = 0, len = remove_listeners.length; i < len; i++) {\r\n try {\r\n remove_listeners[i].callback(removedEvent, removedCallback);\r\n } catch (e) {\r\n console.error('Error in removeListener handler:', e);\r\n }\r\n }\r\n };\r\n\r\n // 执行单个监听器移除\r\n const process_removal = (item: {event: keyof T; callback: WrappedFn}) => {\r\n const {event, callback} = item;\r\n const current = this.events.get(event);\r\n if (current) {\r\n if (typeof current === 'function') {\r\n if (current === callback) this.events.delete(event);\r\n } else {\r\n let idx = current.normal.indexOf(callback);\r\n if (idx !== -1) {\r\n current.normal.splice(idx, 1);\r\n } else {\r\n idx = current.prepend.indexOf(callback);\r\n if (idx !== -1) current.prepend.splice(idx, 1);\r\n }\r\n const total = current.prepend.length + current.normal.length;\r\n if (total === 0) this.events.delete(event);\r\n }\r\n }\r\n triggerRemoveFromSnapshot(event, callback);\r\n };\r\n\r\n // 先移除普通监听器,最后移除 removeListener 监听器\r\n for (let i = 0, len = normal_listeners.length; i < len; i++)\r\n process_removal(normal_listeners[i]);\r\n for (let i = 0, len = remove_listeners.length; i < len; i++)\r\n process_removal(remove_listeners[i]);\r\n\r\n this.events.clear();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // ============================================\r\n // 异步方法\r\n // ============================================\r\n\r\n /**\r\n * Asynchronously emits an event, awaiting all listener results.\r\n *\r\n * All listeners are executed in parallel using `Promise.all`.\r\n * Listener errors are collected and thrown as `AggregateError` if multiple,\r\n * or re-thrown directly if only one error occurred.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to emit\r\n * @param args - Arguments to pass to the listeners\r\n * @returns Promise resolving to `true` if all listeners succeeded\r\n * @throws The error argument if emitting `error` with no listeners\r\n * @throws AggregateError if multiple listeners threw errors\r\n */\r\n async emitAsync<K extends keyof T>(\r\n event: K,\r\n ...args: T[K]\r\n ): Promise<boolean> {\r\n const events = this.events;\r\n const current = events.get(event);\r\n\r\n if (!current) {\r\n if (event === 'error') throw args[0];\r\n return false;\r\n }\r\n\r\n const listeners =\r\n typeof current === 'object'\r\n ? [...current.prepend, ...current.normal]\r\n : [current];\r\n\r\n const errors = new Array<unknown>();\r\n let has_error = false;\r\n\r\n // 并行执行所有监听器\r\n await Promise.all(\r\n listeners.map(async (cb) => {\r\n try {\r\n await cb(...args);\r\n } catch (error) {\r\n has_error = true;\r\n if (event !== 'error') {\r\n const handler_result = await this.handleAsyncError(event, error);\r\n if (handler_result !== null) errors.push(handler_result);\r\n } else {\r\n errors.push(error);\r\n }\r\n }\r\n }),\r\n );\r\n\r\n if (errors.length === 1) throw errors[0];\r\n if (errors.length > 1) throw new AggregateError(errors);\r\n\r\n return !has_error;\r\n }\r\n\r\n // 异步错误处理,返回需要抛出的错误,null 表示已成功处理\r\n private async handleAsyncError<K extends keyof T>(\r\n _event: K,\r\n error: unknown,\r\n ): Promise<unknown> {\r\n const storage = this.events.get('error');\r\n if (!storage) return error;\r\n\r\n const listeners =\r\n typeof storage === 'object'\r\n ? [...storage.prepend, ...storage.normal]\r\n : [storage];\r\n\r\n try {\r\n await Promise.all(\r\n listeners.map((cb) => {\r\n const result = cb(error);\r\n return isPromiseLike(result) ? result : Promise.resolve();\r\n }),\r\n );\r\n return null;\r\n } catch (handler_error) {\r\n return handler_error;\r\n }\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the specified event is emitted.\r\n *\r\n * Supports timeout, filter function, and AbortSignal for cancellation.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to wait for\r\n * @param options - Optional configuration\r\n * @param options.timeout - Maximum time to wait in milliseconds\r\n * @param options.filter - Function to filter which emissions to accept\r\n * @param options.signal - AbortSignal for cancellation\r\n * @returns Promise resolving to the event arguments tuple\r\n * @throws Error on timeout\r\n * @throws DOMException when aborted via signal\r\n */\r\n waitFor<K extends keyof T>(\r\n event: K,\r\n options?: {\r\n timeout?: number;\r\n filter?: (...args: T[K]) => boolean;\r\n signal?: AbortSignal;\r\n },\r\n ): Promise<T[K]> {\r\n return new Promise<T[K]>((resolve, reject) => {\r\n // AbortSignal 检查\r\n if (options?.signal?.aborted) {\r\n reject(ensureDOMException(options.signal.reason));\r\n return;\r\n }\r\n\r\n let timeout_id: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const cleanup = () => {\r\n if (timeout_id !== undefined) clearTimeout(timeout_id);\r\n this.off(event, handler);\r\n options?.signal?.removeEventListener('abort', abort_handler);\r\n };\r\n\r\n const handler = (...args: T[K]) => {\r\n if (options?.filter && !options.filter(...args)) return;\r\n cleanup();\r\n resolve(args);\r\n };\r\n\r\n const abort_handler = () => {\r\n cleanup();\r\n reject(ensureDOMException(options!.signal!.reason));\r\n };\r\n\r\n if (options?.timeout !== undefined) {\r\n timeout_id = setTimeout(() => {\r\n cleanup();\r\n reject(new Error(`Timeout waiting for event \"${String(event)}\"`));\r\n }, options.timeout);\r\n }\r\n\r\n options?.signal?.addEventListener('abort', abort_handler, {once: true});\r\n this.on(event, handler);\r\n });\r\n }\r\n\r\n /**\r\n * Alias for `waitFor` without filter support.\r\n *\r\n * @template K - Event name key\r\n * @param event - The event name to wait for\r\n * @param options - Optional configuration\r\n * @param options.timeout - Maximum time to wait in milliseconds\r\n * @param options.signal - AbortSignal for cancellation\r\n * @returns Promise resolving to the event arguments tuple\r\n */\r\n onceAsync<K extends keyof T>(\r\n event: K,\r\n options?: {timeout?: number; signal?: AbortSignal},\r\n ): Promise<T[K]> {\r\n return this.waitFor(event, options);\r\n }\r\n}\r\n"],"names":["FlowContinue","FlowStop","value","EMPTY_SUBSCRIPTION","noop","MIN_QUEUE_SIZE_FOR_COMPACTION","WASTE_RATIO_THRESHOLD","shouldCompactArray","readIndex","length","compactArray","queue","write","i","compactNullableArray","item","Flow","obs","err","fn","teardown","observerOrNext","observer","self","unsubscribe","FlowCompletionError","controller","options","on_complete","on_error","signal","UseAfterFreeError","ensureDOMException","resolve","reject","iteration","settled","pending_item","cleanup","abort_handler","internalObserver","result","e","external_signal","current_abort","abort","combined_signal","external_abort_handler","buffer","resolveNext","error","done","subscription","SerialFlow","runLoop","BehaviorFlow","initialValue","ColdFlow","producer","sub","fromProducer","fromSerialProducer","SerialColdFlow","of","values","dest","from","source","cancelled","arr","mergeFlow","sources","completedCount","subscriptions","v","concatFlow","index","currentSub","subscribeNext","raceFlow","finished","unsubscribeAll","combineLatestFlow","hasValue","hasValueCount","s","withLatestFromFlow","others","otherValues","hasOthersValue","hasOthersValueCount","subs","other","mainSub","forkJoinFlow","lastValues","hasEmitted","zipFlow","buffers","doneFlags","readyCount","deadSourceCount","tryConsume","tuple","buf","newReadyCount","wasEmpty","Stop","Continue","delay","expBackoff","attempt","base","max","expJitter","jitter","rand","pacer","pace","interval","output","Ok","Err","action","ms","retry","task","maxRetries","baseDelayMs","maxBackoffMs","last_error","wait_ms","ORIGINAL_CALLBACK","EventEmitter","event","callback","wrapped","current","target","actual_target","single","list","normal","prepend","len","cb","args","has_error","listLen","storage","has_called","_event","pending_removals","pending_additions","idx","wrapper","evt","rlStorage","rlListeners","triggerRemove","removedEvent","removedCallback","snapshot","normal_listeners","remove_listeners","triggerRemoveFromSnapshot","process_removal","listeners","errors","handler_result","isPromiseLike","handler_error","timeout_id","handler"],"mappings":"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"}