@fncts/io 0.0.49 → 0.0.51

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 (635) hide show
  1. package/Channel/internal/SingleProducerAsyncInput.d.ts +1 -1
  2. package/CountdownLatch.d.ts +5 -5
  3. package/Fiber/FiberRuntime.d.ts +1 -1
  4. package/Hub/api.d.ts +7 -7
  5. package/IO/api/foreachExec.d.ts +18 -0
  6. package/IO/api.d.ts +1 -1
  7. package/Push/Bounds.d.ts +4 -0
  8. package/Push/FlattenStrategy.d.ts +47 -0
  9. package/Push/IndexedBuffer.d.ts +19 -0
  10. package/Push/MergeStrategy.d.ts +19 -0
  11. package/Push/Operator/IOLoopOperator.d.ts +61 -0
  12. package/Push/Operator/IOOperator.d.ts +63 -0
  13. package/Push/Operator/LoopOperator.d.ts +50 -0
  14. package/Push/Operator/SyncOperator.d.ts +41 -0
  15. package/Push/Operator.d.ts +4 -0
  16. package/Push/Producer/IOProducer.d.ts +41 -0
  17. package/Push/Producer/SyncProducer.d.ts +61 -0
  18. package/Push/Producer.d.ts +1 -0
  19. package/Push/Sink.d.ts +65 -0
  20. package/Push/api.d.ts +80 -163
  21. package/Push/definition.d.ts +92 -19
  22. package/Push/internal.d.ts +3 -0
  23. package/Push.d.ts +6 -0
  24. package/Queue/api/dimapIO.d.ts +12 -12
  25. package/Ref/Synchronized/definition.d.ts +32 -9
  26. package/Ref/definition.d.ts +12 -0
  27. package/STM/api.d.ts +1 -1
  28. package/Scope/api.d.ts +16 -1
  29. package/Semaphore/definition.d.ts +1 -1
  30. package/Sink/definition.d.ts +5 -6
  31. package/Subject/Atomic.d.ts +19 -9
  32. package/Subject/DeferredRef.d.ts +17 -0
  33. package/Subject/Hold.d.ts +19 -0
  34. package/Subject/RefSubject/Atomic.d.ts +43 -0
  35. package/Subject/RefSubject/Derived.d.ts +43 -0
  36. package/Subject/RefSubject/RefSubject.d.ts +37 -0
  37. package/Subject/RefSubject/constructors.d.ts +15 -0
  38. package/Subject/RefSubject.d.ts +4 -0
  39. package/Subject/definition.d.ts +14 -2
  40. package/Subject.d.ts +3 -0
  41. package/SubscriptionRef.d.ts +0 -1
  42. package/Supervisor/definition.d.ts +1 -1
  43. package/_cjs/Cached/api.cjs +8 -2
  44. package/_cjs/Cached/api.cjs.map +1 -1
  45. package/_cjs/Cached/definition.cjs +2 -6
  46. package/_cjs/Cached/definition.cjs.map +1 -1
  47. package/_cjs/CancellerState.cjs +4 -7
  48. package/_cjs/CancellerState.cjs.map +1 -1
  49. package/_cjs/Channel/UpstreamPullRequest/definition.cjs +4 -2
  50. package/_cjs/Channel/UpstreamPullRequest/definition.cjs.map +1 -1
  51. package/_cjs/Channel/api.cjs +2 -3
  52. package/_cjs/Channel/api.cjs.map +1 -1
  53. package/_cjs/Channel/definition.cjs +22 -16
  54. package/_cjs/Channel/definition.cjs.map +1 -1
  55. package/_cjs/Channel/internal/ChannelExecutor.cjs +35 -11
  56. package/_cjs/Channel/internal/ChannelExecutor.cjs.map +1 -1
  57. package/_cjs/Channel/internal/ChannelState.cjs +15 -8
  58. package/_cjs/Channel/internal/ChannelState.cjs.map +1 -1
  59. package/_cjs/Channel/internal/MergeDecision.cjs +6 -8
  60. package/_cjs/Channel/internal/MergeDecision.cjs.map +1 -1
  61. package/_cjs/Channel/internal/MergeState.cjs +7 -3
  62. package/_cjs/Channel/internal/MergeState.cjs.map +1 -1
  63. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs +49 -42
  64. package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs.map +1 -1
  65. package/_cjs/Clock/live.cjs +1 -4
  66. package/_cjs/Clock/live.cjs.map +1 -1
  67. package/_cjs/CountdownLatch.cjs +22 -12
  68. package/_cjs/CountdownLatch.cjs.map +1 -1
  69. package/_cjs/Differ/api.cjs +3 -12
  70. package/_cjs/Differ/api.cjs.map +1 -1
  71. package/_cjs/Differ/definition.cjs +1 -5
  72. package/_cjs/Differ/definition.cjs.map +1 -1
  73. package/_cjs/Fiber/FiberMessage.cjs +6 -3
  74. package/_cjs/Fiber/FiberMessage.cjs.map +1 -1
  75. package/_cjs/Fiber/FiberRuntime.cjs +66 -61
  76. package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
  77. package/_cjs/Fiber/definition.cjs +10 -6
  78. package/_cjs/Fiber/definition.cjs.map +1 -1
  79. package/_cjs/FiberDescriptor.cjs +3 -0
  80. package/_cjs/FiberDescriptor.cjs.map +1 -1
  81. package/_cjs/FiberRef/definition.cjs +9 -6
  82. package/_cjs/FiberRef/definition.cjs.map +1 -1
  83. package/_cjs/FiberRefs/Patch.cjs +13 -13
  84. package/_cjs/FiberRefs/Patch.cjs.map +1 -1
  85. package/_cjs/FiberScope/definition.cjs +2 -0
  86. package/_cjs/FiberScope/definition.cjs.map +1 -1
  87. package/_cjs/FiberSet.cjs +4 -3
  88. package/_cjs/FiberSet.cjs.map +1 -1
  89. package/_cjs/FiberStatus/definition.cjs +12 -9
  90. package/_cjs/FiberStatus/definition.cjs.map +1 -1
  91. package/_cjs/Future/State.cjs +8 -7
  92. package/_cjs/Future/State.cjs.map +1 -1
  93. package/_cjs/Future/definition.cjs +3 -3
  94. package/_cjs/Future/definition.cjs.map +1 -1
  95. package/_cjs/Hub/api.cjs +61 -44
  96. package/_cjs/Hub/api.cjs.map +1 -1
  97. package/_cjs/Hub/definition.cjs +4 -8
  98. package/_cjs/Hub/definition.cjs.map +1 -1
  99. package/_cjs/Hub/internal.cjs +130 -110
  100. package/_cjs/Hub/internal.cjs.map +1 -1
  101. package/_cjs/IO/api/foreachExec.cjs +29 -4
  102. package/_cjs/IO/api/foreachExec.cjs.map +1 -1
  103. package/_cjs/IO/api/transplant.cjs +8 -7
  104. package/_cjs/IO/api/transplant.cjs.map +1 -1
  105. package/_cjs/IO/api.cjs +9 -4
  106. package/_cjs/IO/api.cjs.map +1 -1
  107. package/_cjs/IO/definition.cjs +8 -12
  108. package/_cjs/IO/definition.cjs.map +1 -1
  109. package/_cjs/IO/runtime.cjs +64 -61
  110. package/_cjs/IO/runtime.cjs.map +1 -1
  111. package/_cjs/InterruptStatus/definition.cjs +1 -0
  112. package/_cjs/InterruptStatus/definition.cjs.map +1 -1
  113. package/_cjs/Layer/MemoMap.cjs +25 -24
  114. package/_cjs/Layer/MemoMap.cjs.map +1 -1
  115. package/_cjs/Layer/definition.cjs +30 -13
  116. package/_cjs/Layer/definition.cjs.map +1 -1
  117. package/_cjs/LogLevel.cjs +3 -0
  118. package/_cjs/LogLevel.cjs.map +1 -1
  119. package/_cjs/LogSpan.cjs +2 -0
  120. package/_cjs/LogSpan.cjs.map +1 -1
  121. package/_cjs/Logger/definition.cjs +1 -0
  122. package/_cjs/Logger/definition.cjs.map +1 -1
  123. package/_cjs/MVar/definition.cjs +3 -4
  124. package/_cjs/MVar/definition.cjs.map +1 -1
  125. package/_cjs/Push/Bounds.cjs +2 -0
  126. package/_cjs/Push/Bounds.cjs.map +1 -0
  127. package/_cjs/Push/FlattenStrategy.cjs +96 -0
  128. package/_cjs/Push/FlattenStrategy.cjs.map +1 -0
  129. package/_cjs/Push/IndexedBuffer.cjs +74 -0
  130. package/_cjs/Push/IndexedBuffer.cjs.map +1 -0
  131. package/_cjs/Push/MergeStrategy.cjs +47 -0
  132. package/_cjs/Push/MergeStrategy.cjs.map +1 -0
  133. package/_cjs/Push/Operator/IOLoopOperator.cjs +225 -0
  134. package/_cjs/Push/Operator/IOLoopOperator.cjs.map +1 -0
  135. package/_cjs/Push/Operator/IOOperator.cjs +104 -0
  136. package/_cjs/Push/Operator/IOOperator.cjs.map +1 -0
  137. package/_cjs/Push/Operator/LoopOperator.cjs +165 -0
  138. package/_cjs/Push/Operator/LoopOperator.cjs.map +1 -0
  139. package/_cjs/Push/Operator/SyncOperator.cjs +78 -0
  140. package/_cjs/Push/Operator/SyncOperator.cjs.map +1 -0
  141. package/_cjs/Push/Operator.cjs +2 -0
  142. package/_cjs/Push/Operator.cjs.map +1 -0
  143. package/_cjs/Push/Producer/IOProducer.cjs +72 -0
  144. package/_cjs/Push/Producer/IOProducer.cjs.map +1 -0
  145. package/_cjs/Push/Producer/SyncProducer.cjs +111 -0
  146. package/_cjs/Push/Producer/SyncProducer.cjs.map +1 -0
  147. package/_cjs/Push/Producer.cjs +2 -0
  148. package/_cjs/Push/Producer.cjs.map +1 -0
  149. package/_cjs/Push/Sink.cjs +238 -0
  150. package/_cjs/Push/Sink.cjs.map +1 -0
  151. package/_cjs/Push/api.cjs +369 -387
  152. package/_cjs/Push/api.cjs.map +1 -1
  153. package/_cjs/Push/definition.cjs +82 -26
  154. package/_cjs/Push/definition.cjs.map +1 -1
  155. package/_cjs/Push/internal.cjs +31 -26
  156. package/_cjs/Push/internal.cjs.map +1 -1
  157. package/_cjs/Push.cjs +66 -0
  158. package/_cjs/Push.cjs.map +1 -1
  159. package/_cjs/Queue/api/dimapIO.cjs +74 -32
  160. package/_cjs/Queue/api/dimapIO.cjs.map +1 -1
  161. package/_cjs/Queue/api/filterInputIO.cjs +51 -25
  162. package/_cjs/Queue/api/filterInputIO.cjs.map +1 -1
  163. package/_cjs/Queue/api/filterOutputIO.cjs +60 -30
  164. package/_cjs/Queue/api/filterOutputIO.cjs.map +1 -1
  165. package/_cjs/Queue/api/zipWithIO.cjs +27 -10
  166. package/_cjs/Queue/api/zipWithIO.cjs.map +1 -1
  167. package/_cjs/Queue/definition.cjs +3 -7
  168. package/_cjs/Queue/definition.cjs.map +1 -1
  169. package/_cjs/Queue/internal.cjs +73 -62
  170. package/_cjs/Queue/internal.cjs.map +1 -1
  171. package/_cjs/Queue/strategy.cjs +1 -3
  172. package/_cjs/Queue/strategy.cjs.map +1 -1
  173. package/_cjs/Random/live.cjs +4 -3
  174. package/_cjs/Random/live.cjs.map +1 -1
  175. package/_cjs/Ref/Atomic.cjs +2 -3
  176. package/_cjs/Ref/Atomic.cjs.map +1 -1
  177. package/_cjs/Ref/Derived.cjs +2 -3
  178. package/_cjs/Ref/Derived.cjs.map +1 -1
  179. package/_cjs/Ref/DerivedAll.cjs +2 -3
  180. package/_cjs/Ref/DerivedAll.cjs.map +1 -1
  181. package/_cjs/Ref/Synchronized/definition.cjs +17 -16
  182. package/_cjs/Ref/Synchronized/definition.cjs.map +1 -1
  183. package/_cjs/Ref/definition.cjs +2 -6
  184. package/_cjs/Ref/definition.cjs.map +1 -1
  185. package/_cjs/Reloadable/definition.cjs +2 -0
  186. package/_cjs/Reloadable/definition.cjs.map +1 -1
  187. package/_cjs/STM/definition.cjs +30 -25
  188. package/_cjs/STM/definition.cjs.map +1 -1
  189. package/_cjs/STM/driver.cjs +5 -0
  190. package/_cjs/STM/driver.cjs.map +1 -1
  191. package/_cjs/STM/internal/Entry.cjs +9 -6
  192. package/_cjs/STM/internal/Entry.cjs.map +1 -1
  193. package/_cjs/STM/internal/TryCommit.cjs +6 -7
  194. package/_cjs/STM/internal/TryCommit.cjs.map +1 -1
  195. package/_cjs/STM/internal/Versioned.cjs +2 -3
  196. package/_cjs/STM/internal/Versioned.cjs.map +1 -1
  197. package/_cjs/Schedule/Decision.cjs +3 -4
  198. package/_cjs/Schedule/Decision.cjs.map +1 -1
  199. package/_cjs/Schedule/Driver.cjs +4 -0
  200. package/_cjs/Schedule/Driver.cjs.map +1 -1
  201. package/_cjs/Schedule/api.cjs +2 -5
  202. package/_cjs/Schedule/api.cjs.map +1 -1
  203. package/_cjs/Schedule/definition.cjs +3 -1
  204. package/_cjs/Schedule/definition.cjs.map +1 -1
  205. package/_cjs/Scope/ReleaseMap/definition.cjs +8 -2
  206. package/_cjs/Scope/ReleaseMap/definition.cjs.map +1 -1
  207. package/_cjs/Scope/api.cjs +29 -11
  208. package/_cjs/Scope/api.cjs.map +1 -1
  209. package/_cjs/Scope/definition.cjs +3 -7
  210. package/_cjs/Scope/definition.cjs.map +1 -1
  211. package/_cjs/ScopedRef/api.cjs +8 -3
  212. package/_cjs/ScopedRef/api.cjs.map +1 -1
  213. package/_cjs/ScopedRef/definition.cjs +1 -5
  214. package/_cjs/ScopedRef/definition.cjs.map +1 -1
  215. package/_cjs/Semaphore/Reservation.cjs +2 -0
  216. package/_cjs/Semaphore/Reservation.cjs.map +1 -1
  217. package/_cjs/Semaphore/definition.cjs +42 -38
  218. package/_cjs/Semaphore/definition.cjs.map +1 -1
  219. package/_cjs/Sink/definition.cjs +3 -3
  220. package/_cjs/Sink/definition.cjs.map +1 -1
  221. package/_cjs/State/api.cjs +1 -4
  222. package/_cjs/State/api.cjs.map +1 -1
  223. package/_cjs/State/definition.cjs +2 -6
  224. package/_cjs/State/definition.cjs.map +1 -1
  225. package/_cjs/State/internal.cjs +1 -5
  226. package/_cjs/State/internal.cjs.map +1 -1
  227. package/_cjs/Stream/api/zipAllWith.cjs +7 -11
  228. package/_cjs/Stream/api/zipAllWith.cjs.map +1 -1
  229. package/_cjs/Stream/api/zipWithChunks.cjs +5 -5
  230. package/_cjs/Stream/api/zipWithChunks.cjs.map +1 -1
  231. package/_cjs/Stream/api.cjs +8 -7
  232. package/_cjs/Stream/api.cjs.map +1 -1
  233. package/_cjs/Stream/definition.cjs +3 -4
  234. package/_cjs/Stream/definition.cjs.map +1 -1
  235. package/_cjs/Stream/internal/DebounceState.cjs +5 -5
  236. package/_cjs/Stream/internal/DebounceState.cjs.map +1 -1
  237. package/_cjs/Stream/internal/Handoff.cjs +18 -17
  238. package/_cjs/Stream/internal/Handoff.cjs.map +1 -1
  239. package/_cjs/Stream/internal/SinkEndReason.cjs +5 -12
  240. package/_cjs/Stream/internal/SinkEndReason.cjs.map +1 -1
  241. package/_cjs/Stream/internal/Take.cjs +3 -0
  242. package/_cjs/Stream/internal/Take.cjs.map +1 -1
  243. package/_cjs/Subject/Atomic.cjs +45 -15
  244. package/_cjs/Subject/Atomic.cjs.map +1 -1
  245. package/_cjs/Subject/DeferredRef.cjs +56 -0
  246. package/_cjs/Subject/DeferredRef.cjs.map +1 -0
  247. package/_cjs/Subject/Hold.cjs +38 -0
  248. package/_cjs/Subject/Hold.cjs.map +1 -0
  249. package/_cjs/Subject/RefSubject/Atomic.cjs +171 -0
  250. package/_cjs/Subject/RefSubject/Atomic.cjs.map +1 -0
  251. package/_cjs/Subject/RefSubject/Derived.cjs +103 -0
  252. package/_cjs/Subject/RefSubject/Derived.cjs.map +1 -0
  253. package/_cjs/Subject/RefSubject/RefSubject.cjs +18 -0
  254. package/_cjs/Subject/RefSubject/RefSubject.cjs.map +1 -0
  255. package/_cjs/Subject/RefSubject/constructors.cjs +30 -0
  256. package/_cjs/Subject/RefSubject/constructors.cjs.map +1 -0
  257. package/_cjs/Subject/RefSubject.cjs +2 -0
  258. package/_cjs/Subject/RefSubject.cjs.map +1 -0
  259. package/_cjs/Subject/definition.cjs +11 -1
  260. package/_cjs/Subject/definition.cjs.map +1 -1
  261. package/_cjs/Subject.cjs +33 -0
  262. package/_cjs/Subject.cjs.map +1 -1
  263. package/_cjs/SubscriptionRef.cjs +4 -5
  264. package/_cjs/SubscriptionRef.cjs.map +1 -1
  265. package/_cjs/Supervisor/constructors.cjs +3 -11
  266. package/_cjs/Supervisor/constructors.cjs.map +1 -1
  267. package/_cjs/Supervisor/definition.cjs +10 -4
  268. package/_cjs/Supervisor/definition.cjs.map +1 -1
  269. package/_cjs/SupervisorPatch.cjs +9 -12
  270. package/_cjs/SupervisorPatch.cjs.map +1 -1
  271. package/_cjs/TExit/definition.cjs +19 -18
  272. package/_cjs/TExit/definition.cjs.map +1 -1
  273. package/_cjs/TReentrantLock/definition.cjs +8 -3
  274. package/_cjs/TReentrantLock/definition.cjs.map +1 -1
  275. package/_cjs/TRef/definition.cjs +6 -6
  276. package/_cjs/TRef/definition.cjs.map +1 -1
  277. package/_cjs/internal/BackgroundScheduler.cjs +16 -16
  278. package/_cjs/internal/BackgroundScheduler.cjs.map +1 -1
  279. package/_cjs/internal/HashedPair.cjs +2 -0
  280. package/_cjs/internal/HashedPair.cjs.map +1 -1
  281. package/_cjs/internal/Hub.cjs +39 -15
  282. package/_cjs/internal/Hub.cjs.map +1 -1
  283. package/_cjs/internal/IsFatal.cjs +7 -11
  284. package/_cjs/internal/IsFatal.cjs.map +1 -1
  285. package/_cjs/internal/MutableQueue.cjs +14 -11
  286. package/_cjs/internal/MutableQueue.cjs.map +1 -1
  287. package/_cjs/internal/Scheduler.cjs +4 -8
  288. package/_cjs/internal/Scheduler.cjs.map +1 -1
  289. package/_cjs/internal/StackTraceBuilder.cjs +2 -4
  290. package/_cjs/internal/StackTraceBuilder.cjs.map +1 -1
  291. package/_mjs/Cached/api.mjs +8 -2
  292. package/_mjs/Cached/api.mjs.map +1 -1
  293. package/_mjs/Cached/definition.mjs +1 -5
  294. package/_mjs/Cached/definition.mjs.map +1 -1
  295. package/_mjs/CancellerState.mjs +4 -7
  296. package/_mjs/CancellerState.mjs.map +1 -1
  297. package/_mjs/Channel/UpstreamPullRequest/definition.mjs +4 -2
  298. package/_mjs/Channel/UpstreamPullRequest/definition.mjs.map +1 -1
  299. package/_mjs/Channel/api.mjs +2 -3
  300. package/_mjs/Channel/api.mjs.map +1 -1
  301. package/_mjs/Channel/definition.mjs +21 -15
  302. package/_mjs/Channel/definition.mjs.map +1 -1
  303. package/_mjs/Channel/internal/ChannelExecutor.mjs +35 -11
  304. package/_mjs/Channel/internal/ChannelExecutor.mjs.map +1 -1
  305. package/_mjs/Channel/internal/ChannelState.mjs +15 -8
  306. package/_mjs/Channel/internal/ChannelState.mjs.map +1 -1
  307. package/_mjs/Channel/internal/MergeDecision.mjs +5 -7
  308. package/_mjs/Channel/internal/MergeDecision.mjs.map +1 -1
  309. package/_mjs/Channel/internal/MergeState.mjs +7 -3
  310. package/_mjs/Channel/internal/MergeState.mjs.map +1 -1
  311. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs +49 -42
  312. package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs.map +1 -1
  313. package/_mjs/Clock/live.mjs +1 -4
  314. package/_mjs/Clock/live.mjs.map +1 -1
  315. package/_mjs/CountdownLatch.mjs +21 -11
  316. package/_mjs/CountdownLatch.mjs.map +1 -1
  317. package/_mjs/Differ/api.mjs +3 -12
  318. package/_mjs/Differ/api.mjs.map +1 -1
  319. package/_mjs/Differ/definition.mjs +1 -5
  320. package/_mjs/Differ/definition.mjs.map +1 -1
  321. package/_mjs/Fiber/FiberMessage.mjs +6 -3
  322. package/_mjs/Fiber/FiberMessage.mjs.map +1 -1
  323. package/_mjs/Fiber/FiberRuntime.mjs +66 -61
  324. package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
  325. package/_mjs/Fiber/definition.mjs +9 -5
  326. package/_mjs/Fiber/definition.mjs.map +1 -1
  327. package/_mjs/FiberDescriptor.mjs +3 -0
  328. package/_mjs/FiberDescriptor.mjs.map +1 -1
  329. package/_mjs/FiberRef/definition.mjs +9 -6
  330. package/_mjs/FiberRef/definition.mjs.map +1 -1
  331. package/_mjs/FiberRefs/Patch.mjs +13 -13
  332. package/_mjs/FiberRefs/Patch.mjs.map +1 -1
  333. package/_mjs/FiberScope/definition.mjs +2 -0
  334. package/_mjs/FiberScope/definition.mjs.map +1 -1
  335. package/_mjs/FiberSet.mjs +4 -3
  336. package/_mjs/FiberSet.mjs.map +1 -1
  337. package/_mjs/FiberStatus/definition.mjs +12 -9
  338. package/_mjs/FiberStatus/definition.mjs.map +1 -1
  339. package/_mjs/Future/State.mjs +8 -7
  340. package/_mjs/Future/State.mjs.map +1 -1
  341. package/_mjs/Future/definition.mjs +3 -3
  342. package/_mjs/Future/definition.mjs.map +1 -1
  343. package/_mjs/Hub/api.mjs +61 -44
  344. package/_mjs/Hub/api.mjs.map +1 -1
  345. package/_mjs/Hub/definition.mjs +3 -7
  346. package/_mjs/Hub/definition.mjs.map +1 -1
  347. package/_mjs/Hub/internal.mjs +130 -110
  348. package/_mjs/Hub/internal.mjs.map +1 -1
  349. package/_mjs/IO/api/foreachExec.mjs +27 -4
  350. package/_mjs/IO/api/foreachExec.mjs.map +1 -1
  351. package/_mjs/IO/api/transplant.mjs +8 -7
  352. package/_mjs/IO/api/transplant.mjs.map +1 -1
  353. package/_mjs/IO/api.mjs +9 -4
  354. package/_mjs/IO/api.mjs.map +1 -1
  355. package/_mjs/IO/definition.mjs +7 -11
  356. package/_mjs/IO/definition.mjs.map +1 -1
  357. package/_mjs/IO/runtime.mjs +64 -61
  358. package/_mjs/IO/runtime.mjs.map +1 -1
  359. package/_mjs/InterruptStatus/definition.mjs +1 -0
  360. package/_mjs/InterruptStatus/definition.mjs.map +1 -1
  361. package/_mjs/Layer/MemoMap.mjs +25 -24
  362. package/_mjs/Layer/MemoMap.mjs.map +1 -1
  363. package/_mjs/Layer/definition.mjs +29 -12
  364. package/_mjs/Layer/definition.mjs.map +1 -1
  365. package/_mjs/LogLevel.mjs +3 -0
  366. package/_mjs/LogLevel.mjs.map +1 -1
  367. package/_mjs/LogSpan.mjs +2 -0
  368. package/_mjs/LogSpan.mjs.map +1 -1
  369. package/_mjs/Logger/definition.mjs +1 -0
  370. package/_mjs/Logger/definition.mjs.map +1 -1
  371. package/_mjs/MVar/definition.mjs +2 -3
  372. package/_mjs/MVar/definition.mjs.map +1 -1
  373. package/_mjs/Push/Bounds.mjs +2 -0
  374. package/_mjs/Push/Bounds.mjs.map +1 -0
  375. package/_mjs/Push/FlattenStrategy.mjs +87 -0
  376. package/_mjs/Push/FlattenStrategy.mjs.map +1 -0
  377. package/_mjs/Push/IndexedBuffer.mjs +65 -0
  378. package/_mjs/Push/IndexedBuffer.mjs.map +1 -0
  379. package/_mjs/Push/MergeStrategy.mjs +36 -0
  380. package/_mjs/Push/MergeStrategy.mjs.map +1 -0
  381. package/_mjs/Push/Operator/IOLoopOperator.mjs +208 -0
  382. package/_mjs/Push/Operator/IOLoopOperator.mjs.map +1 -0
  383. package/_mjs/Push/Operator/IOOperator.mjs +91 -0
  384. package/_mjs/Push/Operator/IOOperator.mjs.map +1 -0
  385. package/_mjs/Push/Operator/LoopOperator.mjs +151 -0
  386. package/_mjs/Push/Operator/LoopOperator.mjs.map +1 -0
  387. package/_mjs/Push/Operator/SyncOperator.mjs +67 -0
  388. package/_mjs/Push/Operator/SyncOperator.mjs.map +1 -0
  389. package/_mjs/Push/Operator.mjs +2 -0
  390. package/_mjs/Push/Operator.mjs.map +1 -0
  391. package/_mjs/Push/Producer/IOProducer.mjs +60 -0
  392. package/_mjs/Push/Producer/IOProducer.mjs.map +1 -0
  393. package/_mjs/Push/Producer/SyncProducer.mjs +94 -0
  394. package/_mjs/Push/Producer/SyncProducer.mjs.map +1 -0
  395. package/_mjs/Push/Producer.mjs +2 -0
  396. package/_mjs/Push/Producer.mjs.map +1 -0
  397. package/_mjs/Push/Sink.mjs +225 -0
  398. package/_mjs/Push/Sink.mjs.map +1 -0
  399. package/_mjs/Push/api.mjs +340 -348
  400. package/_mjs/Push/api.mjs.map +1 -1
  401. package/_mjs/Push/definition.mjs +75 -21
  402. package/_mjs/Push/definition.mjs.map +1 -1
  403. package/_mjs/Push/internal.mjs +30 -26
  404. package/_mjs/Push/internal.mjs.map +1 -1
  405. package/_mjs/Push.mjs +7 -1
  406. package/_mjs/Push.mjs.map +1 -1
  407. package/_mjs/Queue/api/dimapIO.mjs +74 -32
  408. package/_mjs/Queue/api/dimapIO.mjs.map +1 -1
  409. package/_mjs/Queue/api/filterInputIO.mjs +51 -25
  410. package/_mjs/Queue/api/filterInputIO.mjs.map +1 -1
  411. package/_mjs/Queue/api/filterOutputIO.mjs +60 -30
  412. package/_mjs/Queue/api/filterOutputIO.mjs.map +1 -1
  413. package/_mjs/Queue/api/zipWithIO.mjs +27 -10
  414. package/_mjs/Queue/api/zipWithIO.mjs.map +1 -1
  415. package/_mjs/Queue/definition.mjs +3 -7
  416. package/_mjs/Queue/definition.mjs.map +1 -1
  417. package/_mjs/Queue/internal.mjs +73 -62
  418. package/_mjs/Queue/internal.mjs.map +1 -1
  419. package/_mjs/Queue/strategy.mjs +1 -3
  420. package/_mjs/Queue/strategy.mjs.map +1 -1
  421. package/_mjs/Random/live.mjs +4 -3
  422. package/_mjs/Random/live.mjs.map +1 -1
  423. package/_mjs/Ref/Atomic.mjs +2 -3
  424. package/_mjs/Ref/Atomic.mjs.map +1 -1
  425. package/_mjs/Ref/Derived.mjs +2 -3
  426. package/_mjs/Ref/Derived.mjs.map +1 -1
  427. package/_mjs/Ref/DerivedAll.mjs +2 -3
  428. package/_mjs/Ref/DerivedAll.mjs.map +1 -1
  429. package/_mjs/Ref/Synchronized/definition.mjs +16 -15
  430. package/_mjs/Ref/Synchronized/definition.mjs.map +1 -1
  431. package/_mjs/Ref/definition.mjs +1 -5
  432. package/_mjs/Ref/definition.mjs.map +1 -1
  433. package/_mjs/Reloadable/definition.mjs +2 -0
  434. package/_mjs/Reloadable/definition.mjs.map +1 -1
  435. package/_mjs/STM/definition.mjs +29 -24
  436. package/_mjs/STM/definition.mjs.map +1 -1
  437. package/_mjs/STM/driver.mjs +5 -0
  438. package/_mjs/STM/driver.mjs.map +1 -1
  439. package/_mjs/STM/internal/Entry.mjs +8 -5
  440. package/_mjs/STM/internal/Entry.mjs.map +1 -1
  441. package/_mjs/STM/internal/TryCommit.mjs +6 -7
  442. package/_mjs/STM/internal/TryCommit.mjs.map +1 -1
  443. package/_mjs/STM/internal/Versioned.mjs +2 -3
  444. package/_mjs/STM/internal/Versioned.mjs.map +1 -1
  445. package/_mjs/Schedule/Decision.mjs +3 -4
  446. package/_mjs/Schedule/Decision.mjs.map +1 -1
  447. package/_mjs/Schedule/Driver.mjs +4 -0
  448. package/_mjs/Schedule/Driver.mjs.map +1 -1
  449. package/_mjs/Schedule/api.mjs +2 -5
  450. package/_mjs/Schedule/api.mjs.map +1 -1
  451. package/_mjs/Schedule/definition.mjs +3 -1
  452. package/_mjs/Schedule/definition.mjs.map +1 -1
  453. package/_mjs/Scope/ReleaseMap/definition.mjs +8 -2
  454. package/_mjs/Scope/ReleaseMap/definition.mjs.map +1 -1
  455. package/_mjs/Scope/api.mjs +23 -8
  456. package/_mjs/Scope/api.mjs.map +1 -1
  457. package/_mjs/Scope/definition.mjs +2 -6
  458. package/_mjs/Scope/definition.mjs.map +1 -1
  459. package/_mjs/ScopedRef/api.mjs +8 -3
  460. package/_mjs/ScopedRef/api.mjs.map +1 -1
  461. package/_mjs/ScopedRef/definition.mjs +1 -5
  462. package/_mjs/ScopedRef/definition.mjs.map +1 -1
  463. package/_mjs/Semaphore/Reservation.mjs +2 -0
  464. package/_mjs/Semaphore/Reservation.mjs.map +1 -1
  465. package/_mjs/Semaphore/definition.mjs +42 -38
  466. package/_mjs/Semaphore/definition.mjs.map +1 -1
  467. package/_mjs/Sink/definition.mjs +3 -3
  468. package/_mjs/Sink/definition.mjs.map +1 -1
  469. package/_mjs/State/api.mjs +1 -4
  470. package/_mjs/State/api.mjs.map +1 -1
  471. package/_mjs/State/definition.mjs +1 -5
  472. package/_mjs/State/definition.mjs.map +1 -1
  473. package/_mjs/State/internal.mjs +1 -5
  474. package/_mjs/State/internal.mjs.map +1 -1
  475. package/_mjs/Stream/api/zipAllWith.mjs +7 -11
  476. package/_mjs/Stream/api/zipAllWith.mjs.map +1 -1
  477. package/_mjs/Stream/api/zipWithChunks.mjs +5 -5
  478. package/_mjs/Stream/api/zipWithChunks.mjs.map +1 -1
  479. package/_mjs/Stream/api.mjs +8 -7
  480. package/_mjs/Stream/api.mjs.map +1 -1
  481. package/_mjs/Stream/definition.mjs +2 -3
  482. package/_mjs/Stream/definition.mjs.map +1 -1
  483. package/_mjs/Stream/internal/DebounceState.mjs +5 -5
  484. package/_mjs/Stream/internal/DebounceState.mjs.map +1 -1
  485. package/_mjs/Stream/internal/Handoff.mjs +17 -16
  486. package/_mjs/Stream/internal/Handoff.mjs.map +1 -1
  487. package/_mjs/Stream/internal/SinkEndReason.mjs +4 -11
  488. package/_mjs/Stream/internal/SinkEndReason.mjs.map +1 -1
  489. package/_mjs/Stream/internal/Take.mjs +3 -0
  490. package/_mjs/Stream/internal/Take.mjs.map +1 -1
  491. package/_mjs/Subject/Atomic.mjs +46 -15
  492. package/_mjs/Subject/Atomic.mjs.map +1 -1
  493. package/_mjs/Subject/DeferredRef.mjs +48 -0
  494. package/_mjs/Subject/DeferredRef.mjs.map +1 -0
  495. package/_mjs/Subject/Hold.mjs +30 -0
  496. package/_mjs/Subject/Hold.mjs.map +1 -0
  497. package/_mjs/Subject/RefSubject/Atomic.mjs +163 -0
  498. package/_mjs/Subject/RefSubject/Atomic.mjs.map +1 -0
  499. package/_mjs/Subject/RefSubject/Derived.mjs +95 -0
  500. package/_mjs/Subject/RefSubject/Derived.mjs.map +1 -0
  501. package/_mjs/Subject/RefSubject/RefSubject.mjs +11 -0
  502. package/_mjs/Subject/RefSubject/RefSubject.mjs.map +1 -0
  503. package/_mjs/Subject/RefSubject/constructors.mjs +23 -0
  504. package/_mjs/Subject/RefSubject/constructors.mjs.map +1 -0
  505. package/_mjs/Subject/RefSubject.mjs +2 -0
  506. package/_mjs/Subject/RefSubject.mjs.map +1 -0
  507. package/_mjs/Subject/definition.mjs +9 -0
  508. package/_mjs/Subject/definition.mjs.map +1 -1
  509. package/_mjs/Subject.mjs +3 -0
  510. package/_mjs/Subject.mjs.map +1 -1
  511. package/_mjs/SubscriptionRef.mjs +4 -5
  512. package/_mjs/SubscriptionRef.mjs.map +1 -1
  513. package/_mjs/Supervisor/constructors.mjs +3 -11
  514. package/_mjs/Supervisor/constructors.mjs.map +1 -1
  515. package/_mjs/Supervisor/definition.mjs +10 -4
  516. package/_mjs/Supervisor/definition.mjs.map +1 -1
  517. package/_mjs/SupervisorPatch.mjs +9 -12
  518. package/_mjs/SupervisorPatch.mjs.map +1 -1
  519. package/_mjs/TExit/definition.mjs +19 -18
  520. package/_mjs/TExit/definition.mjs.map +1 -1
  521. package/_mjs/TReentrantLock/definition.mjs +8 -3
  522. package/_mjs/TReentrantLock/definition.mjs.map +1 -1
  523. package/_mjs/TRef/definition.mjs +6 -6
  524. package/_mjs/TRef/definition.mjs.map +1 -1
  525. package/_mjs/internal/BackgroundScheduler.mjs +16 -16
  526. package/_mjs/internal/BackgroundScheduler.mjs.map +1 -1
  527. package/_mjs/internal/HashedPair.mjs +2 -0
  528. package/_mjs/internal/HashedPair.mjs.map +1 -1
  529. package/_mjs/internal/Hub.mjs +39 -15
  530. package/_mjs/internal/Hub.mjs.map +1 -1
  531. package/_mjs/internal/IsFatal.mjs +7 -11
  532. package/_mjs/internal/IsFatal.mjs.map +1 -1
  533. package/_mjs/internal/MutableQueue.mjs +14 -11
  534. package/_mjs/internal/MutableQueue.mjs.map +1 -1
  535. package/_mjs/internal/Scheduler.mjs +4 -8
  536. package/_mjs/internal/Scheduler.mjs.map +1 -1
  537. package/_mjs/internal/StackTraceBuilder.mjs +2 -4
  538. package/_mjs/internal/StackTraceBuilder.mjs.map +1 -1
  539. package/_src/Cached/api.ts +8 -2
  540. package/_src/Channel/internal/SingleProducerAsyncInput.ts +6 -4
  541. package/_src/CountdownLatch.ts +24 -13
  542. package/_src/Fiber/FiberRuntime.ts +4 -2
  543. package/_src/FiberRef/definition.ts +1 -1
  544. package/_src/Hub/api.ts +85 -54
  545. package/_src/Hub/internal.ts +36 -20
  546. package/_src/IO/api/foreachExec.ts +47 -0
  547. package/_src/IO/api.ts +0 -5
  548. package/_src/Push/Bounds.ts +4 -0
  549. package/_src/Push/FlattenStrategy.ts +137 -0
  550. package/_src/Push/IndexedBuffer.ts +79 -0
  551. package/_src/Push/MergeStrategy.ts +59 -0
  552. package/_src/Push/Operator/IOLoopOperator.ts +413 -0
  553. package/_src/Push/Operator/IOOperator.ts +173 -0
  554. package/_src/Push/Operator/LoopOperator.ts +242 -0
  555. package/_src/Push/Operator/SyncOperator.ts +107 -0
  556. package/_src/Push/Operator.ts +7 -0
  557. package/_src/Push/Producer/IOProducer.ts +83 -0
  558. package/_src/Push/Producer/SyncProducer.ts +105 -0
  559. package/_src/Push/Producer.ts +0 -0
  560. package/_src/Push/Sink.ts +302 -0
  561. package/_src/Push/api.ts +389 -515
  562. package/_src/Push/definition.ts +216 -23
  563. package/_src/Push/internal.ts +11 -0
  564. package/_src/Push.ts +7 -1
  565. package/_src/Queue/api/dimapIO.ts +57 -19
  566. package/_src/Queue/api/filterInputIO.ts +36 -12
  567. package/_src/Queue/api/filterOutputIO.ts +42 -18
  568. package/_src/Queue/api/zipWithIO.ts +23 -11
  569. package/_src/Queue/internal.ts +9 -3
  570. package/_src/Ref/Synchronized/definition.ts +81 -37
  571. package/_src/Ref/definition.ts +26 -0
  572. package/_src/Schedule/api.ts +1 -1
  573. package/_src/Scope/api.ts +22 -0
  574. package/_src/ScopedRef/api.ts +6 -2
  575. package/_src/Semaphore/definition.ts +4 -2
  576. package/_src/Sink/definition.ts +4 -5
  577. package/_src/Stream/api.ts +0 -2
  578. package/_src/Stream/definition.ts +0 -1
  579. package/_src/Subject/Atomic.ts +68 -11
  580. package/_src/Subject/DeferredRef.ts +44 -0
  581. package/_src/Subject/Hold.ts +48 -0
  582. package/_src/Subject/RefSubject/Atomic.ts +233 -0
  583. package/_src/Subject/RefSubject/Derived.ts +184 -0
  584. package/_src/Subject/RefSubject/RefSubject.ts +100 -0
  585. package/_src/Subject/RefSubject/constructors.ts +27 -0
  586. package/_src/Subject/RefSubject.ts +7 -0
  587. package/_src/Subject/definition.ts +21 -3
  588. package/_src/Subject.ts +6 -3
  589. package/_src/SubscriptionRef.ts +1 -1
  590. package/_src/Supervisor/constructors.ts +0 -2
  591. package/_src/Supervisor/definition.ts +2 -1
  592. package/_src/TReentrantLock/api.ts +1 -1
  593. package/_src/global.ts +8 -0
  594. package/_src/index.ts +49 -50
  595. package/_src/internal/MutableQueue.ts +5 -3
  596. package/global.d.ts +8 -0
  597. package/index.d.ts +0 -1
  598. package/internal/MutableQueue.d.ts +2 -2
  599. package/package.json +4 -4
  600. package/RefSubject/Atomic.d.ts +0 -34
  601. package/RefSubject/Synchronized/api.d.ts +0 -9
  602. package/RefSubject/Synchronized/definition.d.ts +0 -39
  603. package/RefSubject/api.d.ts +0 -120
  604. package/RefSubject/definition.d.ts +0 -52
  605. package/RefSubject.d.ts +0 -3
  606. package/_cjs/RefSubject/Atomic.cjs +0 -107
  607. package/_cjs/RefSubject/Atomic.cjs.map +0 -1
  608. package/_cjs/RefSubject/Synchronized/api.cjs +0 -22
  609. package/_cjs/RefSubject/Synchronized/api.cjs.map +0 -1
  610. package/_cjs/RefSubject/Synchronized/definition.cjs +0 -55
  611. package/_cjs/RefSubject/Synchronized/definition.cjs.map +0 -1
  612. package/_cjs/RefSubject/api.cjs +0 -251
  613. package/_cjs/RefSubject/api.cjs.map +0 -1
  614. package/_cjs/RefSubject/definition.cjs +0 -26
  615. package/_cjs/RefSubject/definition.cjs.map +0 -1
  616. package/_cjs/RefSubject.cjs +0 -39
  617. package/_cjs/RefSubject.cjs.map +0 -1
  618. package/_mjs/RefSubject/Atomic.mjs +0 -99
  619. package/_mjs/RefSubject/Atomic.mjs.map +0 -1
  620. package/_mjs/RefSubject/Synchronized/api.mjs +0 -15
  621. package/_mjs/RefSubject/Synchronized/api.mjs.map +0 -1
  622. package/_mjs/RefSubject/Synchronized/definition.mjs +0 -47
  623. package/_mjs/RefSubject/Synchronized/definition.mjs.map +0 -1
  624. package/_mjs/RefSubject/api.mjs +0 -229
  625. package/_mjs/RefSubject/api.mjs.map +0 -1
  626. package/_mjs/RefSubject/definition.mjs +0 -19
  627. package/_mjs/RefSubject/definition.mjs.map +0 -1
  628. package/_mjs/RefSubject.mjs +0 -5
  629. package/_mjs/RefSubject.mjs.map +0 -1
  630. package/_src/RefSubject/Atomic.ts +0 -129
  631. package/_src/RefSubject/Synchronized/api.ts +0 -14
  632. package/_src/RefSubject/Synchronized/definition.ts +0 -76
  633. package/_src/RefSubject/api.ts +0 -253
  634. package/_src/RefSubject/definition.ts +0 -70
  635. package/_src/RefSubject.ts +0 -5
package/_src/Push/api.ts CHANGED
@@ -1,58 +1,92 @@
1
- import { AtomicReference } from "@fncts/base/internal/AtomicReference";
2
- import { IO } from "@fncts/io/IO";
3
- import { withExhaust, withSwitch, withUnboundedConcurrency } from "@fncts/io/Push/internal";
1
+ import type { MergeStrategy } from "./MergeStrategy.js";
2
+ import type { UnsafeSink } from "@fncts/io/Push/Sink";
4
3
 
5
- import { Push, PushTypeId, PushVariance, Sink } from "./definition.js";
4
+ import { IO, IOTag } from "@fncts/io/IO";
5
+ import { Push, PushPrimitive, PushTag } from "@fncts/io/Push/definition";
6
+ import { FlattenStrategy, UnboundedStrategy } from "@fncts/io/Push/FlattenStrategy";
7
+ import { SyncProducer } from "@fncts/io/Push/Producer/SyncProducer";
8
+ import { Sink } from "@fncts/io/Push/Sink";
9
+ import { Scope } from "@fncts/io/Scope";
10
+
11
+ import { FromIO, FromScheduled, type IOProducer, Scheduled } from "./Producer/IOProducer.js";
6
12
 
7
13
  /**
8
- * @tsplus pipeable fncts.io.Push as
14
+ * @tsplus static fncts.io.PushOps bracketExit
9
15
  */
10
- export function as<B>(b: Lazy<B>) {
11
- return <R, E, A>(self: Push<R, E, A>): Push<R, E, B> => {
12
- return self.map(b);
13
- };
16
+ export function bracketExit<R, E, A, R1, E1, B, R2, E2, C>(
17
+ acquire: IO<R, E, A>,
18
+ use: (a: A) => Push<R1, E1, B>,
19
+ release: (a: A, exit: Exit<unknown, unknown>) => IO<R2, E2, C>,
20
+ ): Push<R | R1 | R2, E | E1 | E2, B> {
21
+ return new BracketExit(acquire, use, release);
14
22
  }
15
23
 
16
- interface UnsafeSink<E, A> {
17
- event: (value: A) => void;
18
- error: (cause: Cause<E>) => void;
24
+ class BracketExit<R, E, A, R1, E1, B, R2, E2, C> extends Push<R | R1 | R2, E | E1 | E2, B> {
25
+ constructor(
26
+ readonly acquire: IO<R, E, A>,
27
+ readonly use: (a: A) => Push<R1, E1, B>,
28
+ readonly release: (a: A, exit: Exit<unknown, unknown>) => IO<R2, E2, C>,
29
+ ) {
30
+ super();
31
+ }
32
+
33
+ run<R3>(sink: Push.UnsafeSink<R3, E | E1 | E2, B>): IO<R | R1 | R2 | R3, never, void> {
34
+ return IO.bracketExit(
35
+ this.acquire,
36
+ (a) => this.use(a).run(sink),
37
+ (a, exit) => this.release(a, exit).catchAllCause(sink.onFailure),
38
+ ).catchAllCause(sink.onFailure);
39
+ }
19
40
  }
20
41
 
21
42
  /**
22
- * @tsplus static fncts.io.PushOps asyncInterrupt
43
+ * @tsplus static fncts.io.PushOps defer
23
44
  */
24
- export function asyncInterrupt<R, E, A>(
25
- make: (emitter: UnsafeSink<E, A>) => Either<IO<R, never, void>, Push<R, E, A>>,
26
- ): Push<R, E, A> {
27
- return Push<R, E, A>(
28
- <R1>(sink: Sink<R | R1, E, A>) =>
45
+ export function defer<R, E, A>(self: Lazy<Push<R, E, A>>): Push<R, E, A> {
46
+ return new Defer(self);
47
+ }
48
+
49
+ class CombineLatest<R, E, A> extends Push<R | Scope, E, ReadonlyArray<A>> {
50
+ private static UNSET = Symbol();
51
+
52
+ constructor(readonly streams: Iterable<Push<R, E, A>>) {
53
+ super();
54
+ }
55
+
56
+ run<R1>(sink: UnsafeSink<R1, E, readonly A[]>): IO<Scope | R | R1, never, void> {
57
+ return UnboundedStrategy.withFork((fork) =>
29
58
  Do((Δ) => {
30
- const future = Δ(Future.make<never, void>());
31
- const scope = Δ(IO.scope);
32
- const runtime = Δ(IO.runtime<R | R1>());
33
- const unsafeSink: UnsafeSink<E, A> = {
34
- event: (value) => runtime.unsafeRunOrFork(sink.event(value).forkIn(scope)),
35
- error: (cause) => runtime.unsafeRunOrFork(sink.error(cause).fulfill(future).forkIn(scope)),
36
- };
37
- const eitherPush = Δ(IO(make(unsafeSink)));
59
+ const size = this.streams.size;
60
+ const latch = Δ(CountdownLatch(size));
61
+ const ref: Array<A> = Array(size).fill(CombineLatest.UNSET, 0, size);
62
+ const emitIfReady = IO.defer(sink.onSuccess(ref)).whenIO(latch.isOpen);
63
+
38
64
  Δ(
39
- eitherPush.match(
40
- (canceller) => future.await.onInterrupt(canceller),
41
- (push) => push.run(sink),
65
+ IO.foreach(this.streams.zipWithIndex, ([i, stream]) =>
66
+ fork(
67
+ stream.run(
68
+ Sink.unsafeMake(
69
+ (value) =>
70
+ IO.defer(() => {
71
+ const indexEmpty = ref[i] === CombineLatest.UNSET;
72
+
73
+ ref[i] = value;
74
+
75
+ if (indexEmpty) {
76
+ return latch.countDown;
77
+ } else {
78
+ return IO.unit;
79
+ }
80
+ }) > emitIfReady,
81
+ (cause) => sink.onFailure(cause),
82
+ ),
83
+ ),
84
+ ),
42
85
  ),
43
86
  );
44
- }).scoped,
45
- );
46
- }
47
-
48
- /**
49
- * @tsplus static fncts.io.PushOps async
50
- */
51
- export function async<E, A>(make: (sink: UnsafeSink<E, A>) => void): Push<never, E, A> {
52
- return Push.asyncInterrupt((sink) => {
53
- make(sink);
54
- return Either.left(IO.unit);
55
- });
87
+ }),
88
+ );
89
+ }
56
90
  }
57
91
 
58
92
  /**
@@ -60,647 +94,487 @@ export function async<E, A>(make: (sink: UnsafeSink<E, A>) => void): Push<never,
60
94
  */
61
95
  export function combineLatest<A extends ReadonlyArray<Push<any, any, any>>>(
62
96
  streams: [...A],
63
- ): Push<Push.EnvironmentOf<A[number]>, Push.ErrorOf<A[number]>, { [K in keyof A]: Push.ValueOf<A[K]> }>;
64
- export function combineLatest<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R, E, ReadonlyArray<A>>;
65
- export function combineLatest<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R, E, ReadonlyArray<A>> {
66
- return Push((emitter) =>
67
- Do((Δ) => {
68
- const size = streams.size;
69
- const ref: Array<A> = Δ(IO(Array(size)));
70
- const emitIfReady = IO(ref.filter((a) => a != null)).flatMap((as) =>
71
- as.length === size ? emitter.event(as) : IO.unit,
72
- );
73
- Δ(
74
- IO.foreachConcurrent(streams.zipWithIndex, ([i, stream]) =>
75
- stream.run(
76
- Sink(
77
- (value) => IO((ref[i] = value)) > emitIfReady,
78
- (cause) => emitter.error(cause),
79
- ),
80
- ),
81
- ),
82
- );
83
- }),
84
- );
85
- }
97
+ ): Push<Push.EnvironmentOf<A[number]> | Scope, Push.ErrorOf<A[number]>, { [K in keyof A]: Push.ValueOf<A[K]> }>;
98
+ export function combineLatest<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R | Scope, E, ReadonlyArray<A>>;
99
+ export function combineLatest<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R | Scope, E, ReadonlyArray<A>> {
100
+ return new CombineLatest(streams);
101
+ }
102
+
103
+ class ContramapEnvironment<R, E, A, R1> extends Push<R1, E, A> {
104
+ constructor(
105
+ readonly self: Push<R, E, A>,
106
+ readonly f: (r: Environment<R1>) => Environment<R>,
107
+ ) {
108
+ super();
109
+ }
86
110
 
87
- /**
88
- * @tsplus pipeable fncts.io.PushOps combineLatestWith
89
- */
90
- export function combineLatestWith<A, R1, E1, B, C>(that: Push<R1, E1, B>, f: (a: A, b: B) => C) {
91
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, C> => {
92
- return Push.combineLatest([self, that]).map(([a, b]) => f(a, b));
93
- };
111
+ run<R2>(sink: UnsafeSink<R2, E, A>): IO<R1 | R2, never, void> {
112
+ return this.self.run(sink).contramapEnvironment(this.f);
113
+ }
94
114
  }
95
115
 
96
116
  /**
97
- * @tsplus pipeable fncts.io.Push debounce
117
+ * @tsplus pipeable fncts.io.Push contramapEnvironment
98
118
  */
99
- export function debounce(duration: Lazy<Duration>) {
100
- return <R, E, A>(self: Push<R, E, A>): Push<R, E, A> => {
101
- return self.switchMapIO((a) => IO.succeedNow(a).delay(duration));
102
- };
119
+ export function contramapEnvironment<R, R1>(f: (r: Environment<R1>) => Environment<R>) {
120
+ return <E, A>(self: Push<R, E, A>): Push<R1, E, A> => new ContramapEnvironment(self, f);
103
121
  }
104
122
 
105
- /**
106
- * @tsplus static fncts.io.PushOps defer
107
- */
108
- export function defer<R, E, A>(self: Lazy<Push<R, E, A>>): Push<R, E, A> {
109
- return Push((emitter) => IO(self).flatMap((push) => push.run(emitter)));
123
+ class Defer<R, E, A> extends Push<R, E, A> {
124
+ constructor(readonly self: Lazy<Push<R, E, A>>) {
125
+ super();
126
+ }
127
+ run<R1>(sink: UnsafeSink<R1, E, A>): IO<R | R1, never, void> {
128
+ return IO.defer(this.self().run(sink));
129
+ }
110
130
  }
111
131
 
112
132
  /**
113
- * @tsplus pipeable fncts.io.Push exhaustMap
133
+ * @tsplus static fncts.io.PushOps failCause
114
134
  */
115
- export function exhaustMap<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>) {
116
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
117
- return Push((sink) => withExhaust((fork) => self.run(Sink((a) => fork(f(a).run(sink)), sink.error))));
118
- };
135
+ export function failCause<E>(cause: Lazy<Cause<E>>): Push<never, E, never> {
136
+ const op = new PushPrimitive(PushTag.FailCause) as any;
137
+ op.i0 = cause;
138
+ return op;
119
139
  }
120
140
 
121
141
  /**
122
- * @tsplus pipeable fncts.io.Push exhaustMapIO
142
+ * @tsplus static fncts.io.PushOps failCauseNow
123
143
  */
124
- export function exhaustMapIO<A, R1, E1, B>(f: (a: A) => IO<R1, E1, B>) {
125
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
126
- return self.exhaustMap((a) => Push.fromIO(f(a)));
127
- };
144
+ export function failCauseNow<E>(cause: Cause<E>): Push<never, E, never> {
145
+ const op = new PushPrimitive(PushTag.FailCause) as any;
146
+ op.i0 = () => cause;
147
+ return op;
128
148
  }
129
149
 
130
150
  /**
131
- * @tsplus pipeable fncts.io.Push filterIO
151
+ * @tsplus static fncts.io.PushOps failNow
132
152
  */
133
- export function filterIO<A, R1, E1>(predicate: (a: A) => IO<R1, E1, boolean>) {
134
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, A> => {
135
- return Push((sink) =>
136
- self.run(
137
- Sink(
138
- (a) =>
139
- predicate(a)
140
- .flatMap((b) => (b ? sink.event(a) : IO.unit))
141
- .catchAllCause(sink.error),
142
- sink.error,
143
- ),
144
- ),
145
- );
146
- };
153
+ export function failNow<E>(error: E): Push<never, E, never> {
154
+ return Push.failCauseNow(Cause.fail(error));
147
155
  }
148
156
 
149
- /**
150
- * @tsplus pipeable fncts.io.Push filterMapIO
151
- */
152
- export function filterMapIO<A, R1, E1, B>(f: (a: A) => IO<R1, E1, Maybe<B>>) {
153
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
154
- return Push((sink) =>
155
- self.run(
156
- Sink(
157
- (a) =>
158
- f(a)
159
- .flatMap((mb) => mb.match(() => IO.unit, sink.event))
160
- .catchAllCause(sink.error),
161
- sink.error,
162
- ),
157
+ class Filter<R, E, A, B extends A = A> extends Push<R, E, B> {
158
+ constructor(
159
+ readonly self: Push<R, E, A>,
160
+ readonly p: Predicate<A>,
161
+ ) {
162
+ super();
163
+ }
164
+ run<R1>(sink: UnsafeSink<R1, E, B>): IO<R | R1, never, void> {
165
+ return this.self.run(
166
+ Sink.unsafeMake(
167
+ (value) => {
168
+ if (this.p(value)) {
169
+ return sink.onSuccess(value as B);
170
+ } else {
171
+ return IO.unit;
172
+ }
173
+ },
174
+ (cause) => sink.onFailure(cause),
163
175
  ),
164
176
  );
165
- };
177
+ }
166
178
  }
167
179
 
168
180
  /**
169
181
  * @tsplus pipeable fncts.io.Push filter
170
182
  */
171
- export function filter<A, B extends A>(refinement: Refinement<A, B>): <R, E>(self: Push<R, E, A>) => Push<R, E, B>;
172
- export function filter<A>(predicate: Predicate<A>): <R, E>(self: Push<R, E, A>) => Push<R, E, A>;
173
- export function filter<A>(predicate: Predicate<A>) {
174
- return <R, E>(self: Push<R, E, A>): Push<R, E, A> => {
175
- return Push((sink) => self.run(Sink((a) => (predicate(a) ? sink.event(a) : IO.unit), sink.error)));
176
- };
183
+ export function filter<A, B extends A>(p: Refinement<A, B>): <R, E>(self: Push<R, E, A>) => Push<R, E, B>;
184
+ export function filter<A>(p: Predicate<A>): <R, E>(self: Push<R, E, A>) => Push<R, E, A>;
185
+ export function filter<A>(p: Predicate<A>) {
186
+ return <R, E>(self: Push<R, E, A>): Push<R, E, A> => new Filter(self, p);
187
+ }
188
+ class FilterMap<R, E, A, B> extends Push<R, E, B> {
189
+ constructor(
190
+ readonly self: Push<R, E, A>,
191
+ readonly f: (value: A) => Maybe<B>,
192
+ ) {
193
+ super();
194
+ }
195
+ run<R1>(sink: UnsafeSink<R1, E, B>): IO<R | R1, never, void> {
196
+ return this.self.run(
197
+ Sink.unsafeMake(
198
+ (value) =>
199
+ this.f(value).match(
200
+ () => IO.unit,
201
+ (b) => sink.onSuccess(b),
202
+ ),
203
+ (cause) => sink.onFailure(cause),
204
+ ),
205
+ );
206
+ }
177
207
  }
178
208
 
179
209
  /**
180
210
  * @tsplus pipeable fncts.io.Push filterMap
181
211
  */
182
- export function filterMap<A, B>(f: (a: A) => Maybe<B>) {
183
- return <R, E>(self: Push<R, E, A>): Push<R, E, B> => {
184
- return Push((sink) => self.run(Sink((a) => f(a).match(() => IO.unit, sink.event), sink.error)));
185
- };
186
- }
187
-
188
- /**
189
- * @tsplus pipeable fncts.io.Push flatMapConcurrentBounded
190
- */
191
- export function flatMapConcurrentBounded<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>, concurrency: number) {
192
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
193
- return Push(<R2>(emitter: Sink<R | R1 | R2, E | E1, B>) =>
194
- Do((Δ) => {
195
- const semaphore = Δ(Semaphore(concurrency));
196
- Δ(self.flatMapConcurrentUnbounded((a) => f(a).transform((io) => semaphore.withPermit(io))).run(emitter));
197
- }),
198
- );
199
- };
212
+ export function filterMap<A, B>(f: (value: A) => Maybe<B>) {
213
+ return <R, E>(self: Push<R, E, A>): Push<R, E, B> => new FilterMap(self, f);
200
214
  }
201
215
 
202
216
  /**
203
- * @tsplus pipeable fncts.io.Push flatMapConcurrentUnbounded
217
+ * @tsplus pipeable fncts.io.Push flatMap
204
218
  */
205
- export function flatMapConcurrentUnbounded<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>) {
219
+ export function flatMap<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>) {
206
220
  return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
207
- return Push((sink) => withUnboundedConcurrency((fork) => self.run(Sink((a) => fork(f(a).run(sink)), sink.error))));
221
+ const op = new PushPrimitive(PushTag.OnSuccess);
222
+ op.i0 = self;
223
+ op.i1 = f;
224
+ return op;
208
225
  };
209
226
  }
210
227
 
211
228
  /**
212
- * @tsplus pipeable fncts.io.Push flatMapConcurrent
229
+ * @tsplus pipeable fncts.io.Push flatMapUnbounded
213
230
  */
214
- export function flatMapConcurrent<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>) {
215
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
216
- return Push.unwrap(
217
- IO.concurrency.map((concurrency) =>
218
- concurrency.match(
219
- () => self.flatMapConcurrentUnbounded(f),
220
- (n) => self.flatMapConcurrentBounded(f, n),
221
- ),
222
- ),
223
- );
224
- };
231
+ export function flatMapUnbounded<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>) {
232
+ return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> =>
233
+ self.flatMapWithStrategy(f, FlattenStrategy.Unbounded, ExecutionStrategy.concurrent);
225
234
  }
226
235
 
227
236
  /**
228
- * @tsplus pipeable fncts.io.Push flatMap
237
+ * @tsplus pipeable fncts.io.Push flatMapWithStrategy
229
238
  */
230
- export function flatMap<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>) {
239
+ export function flatMapWithStrategy<A, R1, E1, B>(
240
+ f: (a: A) => Push<R1, E1, B>,
241
+ flattenStrategy: FlattenStrategy,
242
+ executionStrategy: ExecutionStrategy,
243
+ ) {
231
244
  return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
232
- return self.flatMapConcurrentBounded(f, 1);
245
+ const op = new PushPrimitive(PushTag.OnSuccessWithStrategy);
246
+ op.i0 = self;
247
+ op.i1 = f;
248
+ op.i2 = flattenStrategy;
249
+ op.i3 = executionStrategy;
250
+ return op;
233
251
  };
234
252
  }
235
253
 
236
254
  /**
237
- * @tsplus getter fncts.io.Push flatten
255
+ * @tsplus static fncts.io.PushOps fromArray
238
256
  */
239
- export function flatten<R, E, R1, E1, A>(self: Push<R, E, Push<R1, E1, A>>): Push<R | R1, E | E1, A> {
240
- return self.flatMap(Function.identity);
257
+ export function fromArray<A extends ReadonlyArray<any>>(array: A): Push<never, never, A[number]> {
258
+ return Push.fromSyncProducer(SyncProducer.fromArray(array));
241
259
  }
242
-
243
260
  /**
244
261
  * @tsplus static fncts.io.PushOps fromIO
245
262
  */
246
- export function fromIO<R, E, A>(io: Lazy<IO<R, E, A>>): Push<R, E, A> {
247
- return Push((emitter) =>
248
- IO.defer(io).matchCauseIO(
249
- (cause) => emitter.error(cause),
250
- (value) => emitter.event(value),
251
- ),
252
- );
263
+ export function fromIO<R, E, A>(io: IO<R, E, A>): Push<R, E, A> {
264
+ const concrete = IO.concrete(io);
265
+ switch (concrete._ioOpCode) {
266
+ case IOTag.SucceedNow: {
267
+ return Push.succeedNow(concrete.i0);
268
+ }
269
+ case IOTag.Fail: {
270
+ return Push.failCause<any>(concrete.i0);
271
+ }
272
+ case IOTag.Sync: {
273
+ return Push.fromSyncProducer(SyncProducer.fromSync(concrete.i0));
274
+ }
275
+ default: {
276
+ return Push.fromIOProducer(new FromIO(io));
277
+ }
278
+ }
253
279
  }
254
-
255
280
  /**
256
- * @tsplus static fncts.io.PushOps fromAsyncIterable
281
+ * @tsplus static fncts.io.PushOps fromIOProducer
257
282
  */
258
- export function fromAsyncIterable<A>(iterable: AsyncIterable<A>): Push<never, never, A> {
259
- return Push(<R>(sink: Sink<R, never, A>) =>
260
- IO.asyncIO<R, never, void>((cb) => IO.defer(fromAsyncIterableLoop(iterable[Symbol.asyncIterator](), sink, cb))),
261
- );
262
- }
263
-
264
- function fromAsyncIterableLoop<A, R>(
265
- iterator: AsyncIterator<A>,
266
- sink: Sink<R, never, A>,
267
- cb: (io: UIO<void>) => void,
268
- __tsplusTrace?: string,
269
- ): IO<R, never, void> {
270
- return IO.fromPromiseHalt(iterator.next).matchCauseIO(
271
- (cause) => sink.error(cause),
272
- (result) => (result.done ? IO(cb(IO.unit)) : sink.event(result.value) > fromAsyncIterableLoop(iterator, sink, cb)),
273
- );
283
+ export function fromIOProducer<R, E, A>(producer: IOProducer<R, E, A>): Push<R, E, A> {
284
+ const op = new PushPrimitive(PushTag.ProducerIO);
285
+ op.i0 = producer;
286
+ return op;
274
287
  }
275
288
 
276
289
  /**
277
290
  * @tsplus static fncts.io.PushOps fromIterable
278
291
  */
279
292
  export function fromIterable<A>(iterable: Iterable<A>): Push<never, never, A> {
280
- return Push(<R>(sink: Sink<R, never, A>) =>
281
- IO.asyncIO<R, never, void>((cb) => IO.defer(fromIterableLoop(iterable[Symbol.iterator](), sink, cb))),
282
- );
293
+ return Push.fromSyncProducer(SyncProducer.fromIterable(iterable));
283
294
  }
284
295
 
285
- function fromIterableLoop<A, R>(
286
- iterator: Iterator<A>,
287
- sink: Sink<R, never, A>,
288
- cb: (io: UIO<void>) => void,
289
- ): IO<R, never, void> {
290
- return IO.defer(() => {
291
- const value = iterator.next();
292
- return value.done ? IO(cb(IO.unit)) : sink.event(value.value) > fromIterableLoop(iterator, sink, cb);
293
- });
296
+ /**
297
+ * @tsplus static fncts.io.PushOps fromScheduled
298
+ */
299
+ export function fromScheduled<R, E, I, R1, O>(io: IO<R, E, I>, schedule: Schedule<R1, I, O>): Push<R | R1, E, O> {
300
+ return Push.fromIOProducer(new FromScheduled(io, schedule));
294
301
  }
295
302
 
296
303
  /**
297
- * @tsplus getter fncts.io.Push multicast
304
+ * @tsplus static fncts.io.PushOps fromSyncProducer
298
305
  */
299
- export function multicast<R, E, A>(self: Push<R, E, A>): Push<R, E, A> {
300
- return new Multicast(self);
306
+ export function fromSyncProducer<A>(producer: SyncProducer<A>): Push<never, never, A> {
307
+ const op = new PushPrimitive(PushTag.ProducerSync) as any;
308
+ op.i0 = producer;
309
+ return op;
301
310
  }
302
311
 
303
- interface MulticastObserver<E, A> {
304
- readonly sink: Sink<any, E, A>;
305
- readonly environment: Environment<any>;
312
+ /**
313
+ * @tsplus static fncts.io.PushOps haltNow
314
+ */
315
+ export function haltNow(error: unknown): Push<never, never, never> {
316
+ return Push.failCauseNow(Cause.halt(error));
306
317
  }
307
318
 
308
- export class Multicast<R, E, A> implements Push<R, E, A>, Sink<never, E, A> {
309
- readonly [PushTypeId]: PushTypeId = PushTypeId;
310
- declare [PushVariance]: {
311
- readonly _R: (_: never) => R;
312
- readonly _E: (_: never) => E;
313
- readonly _A: (_: never) => A;
314
- };
315
- protected observers: Array<MulticastObserver<E, A>> = [];
316
- protected fiber: Fiber<never, unknown> | undefined;
317
- constructor(readonly push: Push<R, E, A>) {}
318
-
319
- run<R1>(sink: Sink<R1, E, A>): IO<R | R1, never, void> {
320
- return Do((Δ) => {
321
- const environment = Δ(IO.environment<R1>());
322
- Δ(
323
- IO.defer(() => {
324
- let io: URIO<R, void> = IO.unit;
325
- if (this.observers.push({ sink: sink, environment }) === 1) {
326
- io = this.push.run(this).forkDaemon.flatMap((fiber) => IO((this.fiber = fiber)));
327
- }
328
- return io > this.fiber!.await.ensuring(this.removeSink(sink));
329
- }),
330
- );
331
- });
332
- }
333
-
334
- event(value: A) {
335
- return IO.defer(IO.foreachDiscard(this.observers.slice(), (observer) => this.runValue(value, observer)));
336
- }
337
-
338
- error(cause: Cause<E>) {
339
- return IO.defer(IO.foreachDiscard(this.observers.slice(), (observer) => this.runError(cause, observer)));
340
- }
341
-
342
- protected runValue(value: A, observer: MulticastObserver<E, A>) {
343
- return observer.sink
344
- .event(value)
345
- .provideEnvironment(observer.environment)
346
- .catchAllCause(() => this.removeSink(observer.sink));
347
- }
319
+ /**
320
+ * @tsplus static fncts.io.PushOps __call
321
+ */
322
+ export function makePush<R, E, A>(
323
+ run: <R1>(sink: Push.UnsafeSink<R1, E, A>) => IO<R | R1, never, unknown>,
324
+ ): Push<R, E, A> {
325
+ const op = new PushPrimitive(PushTag.FromPush) as any;
326
+ op.i0 = run;
327
+ return op;
328
+ }
348
329
 
349
- protected runError(cause: Cause<E>, observer: MulticastObserver<E, A>) {
350
- return observer.sink
351
- .error(cause)
352
- .provideEnvironment(observer.environment)
353
- .catchAllCause(() => this.removeSink(observer.sink));
330
+ class Map<R, E, A, B> extends Push<R, E, B> {
331
+ constructor(
332
+ readonly self: Push<R, E, A>,
333
+ readonly f: (a: A) => B,
334
+ ) {
335
+ super();
354
336
  }
355
-
356
- protected removeSink(sink: Sink<any, E, A>) {
357
- return IO.defer(() => {
358
- if (this.observers.length === 0) {
359
- return IO.unit;
360
- }
361
- const index = this.observers.findIndex((observer) => observer.sink === sink);
362
- if (index > -1) {
363
- this.observers.splice(index, 1);
364
- if (this.observers.length === 0) {
365
- const interrupt = this.fiber!.interrupt;
366
- this.fiber = undefined;
367
- return interrupt;
368
- }
369
- }
370
- return IO.unit;
371
- });
337
+ run<R1>(sink: UnsafeSink<R1, E, B>): IO<R | R1, never, void> {
338
+ return this.self.run(
339
+ Sink.unsafeMake(
340
+ (value) => sink.onSuccess(this.f(value)),
341
+ (cause) => sink.onFailure(cause),
342
+ ),
343
+ );
372
344
  }
373
345
  }
374
346
 
375
347
  /**
376
- * @tsplus getter fncts.io.Push hold
348
+ * @tsplus pipeable fncts.io.Push map
377
349
  */
378
- export function hold<R, E, A>(self: Push<R, E, A>): Push<R, E, A> {
379
- return new Hold(self);
350
+ export function map<A, B>(f: (a: A) => B) {
351
+ return <R, E>(self: Push<R, E, A>): Push<R, E, B> => new Map(self, f);
380
352
  }
381
353
 
382
- export class Hold<R, E, A> extends Multicast<R, E, A> {
383
- readonly current = new AtomicReference(Nothing<A>());
384
-
385
- constructor(public push: Push<R, E, A>) {
386
- super(push);
354
+ class MapAccum<R, E, A, S, B> extends Push<R, E, B> {
355
+ constructor(
356
+ readonly self: Push<R, E, A>,
357
+ readonly seed: S,
358
+ readonly f: (acc: S, a: A) => readonly [S, B],
359
+ ) {
360
+ super();
387
361
  }
388
362
 
389
- run<R1>(sink: Sink<R1, E, A>): IO<R | R1, never, void> {
390
- const current = this.current.get;
391
-
392
- if (current.isJust()) {
393
- return sink.event(current.value) > super.run(sink);
394
- }
395
-
396
- return super.run(sink);
397
- }
398
-
399
- event(value: A): IO<never, never, void> {
363
+ run<R1>(sink: UnsafeSink<R1, E, B>): IO<R | R1, never, void> {
400
364
  return IO.defer(() => {
401
- this.current.set(Just(value));
402
- return super.event(value);
365
+ let acc = this.seed;
366
+ return this.self.run(
367
+ Sink.unsafeMake(
368
+ (value) => {
369
+ const [s, b] = this.f(acc, value);
370
+ acc = s;
371
+ return sink.onSuccess(b);
372
+ },
373
+ (cause) => sink.onFailure(cause),
374
+ ),
375
+ );
403
376
  });
404
377
  }
405
378
  }
406
379
 
407
380
  /**
408
- * @tsplus pipeable fncts.io.Push map 1
381
+ * @tsplus pipeable fncts.io.Push mapAccum
409
382
  */
410
- export function map<A, B>(f: (a: A) => B) {
411
- return <R, E>(self: Push<R, E, A>): Push<R, E, B> => {
412
- return self.mapIO((a) => IO.succeedNow(f(a)));
413
- };
383
+ export function mapAccum<A, S, B>(seed: S, f: (acc: S, a: A) => readonly [S, B]) {
384
+ return <R, E>(self: Push<R, E, A>): Push<R, E, B> => new MapAccum(self, seed, f);
414
385
  }
415
386
 
416
- /**
417
- * @tsplus pipeable fncts.io.Push mapError
418
- */
419
- export function mapError<E, E1>(f: (e: E) => E1) {
420
- return <R, A>(self: Push<R, E, A>): Push<R, E1, A> => {
421
- return Push((emitter) =>
422
- self.run(
423
- Sink(
424
- (value) => emitter.event(value),
425
- (cause) => emitter.error(cause.map(f)),
426
- ),
427
- ),
428
- );
429
- };
430
- }
387
+ class MapIO<R, E, A, R1, E1, B> extends Push<R | R1, E | E1, B> {
388
+ constructor(
389
+ readonly self: Push<R, E, A>,
390
+ readonly f: (a: A) => IO<R1, E1, B>,
391
+ ) {
392
+ super();
393
+ }
431
394
 
432
- /**
433
- * @tsplus pipeable fncts.io.Push mapErrorCause
434
- */
435
- export function mapErrorCause<E, E1>(f: (cause: Cause<E>) => Cause<E1>) {
436
- return <R, A>(self: Push<R, E, A>): Push<R, E1, A> => {
437
- return Push((emitter) =>
438
- self.run(
439
- Sink(
440
- (value) => emitter.event(value),
441
- (cause) => emitter.error(f(cause)),
442
- ),
395
+ run<R2>(sink: UnsafeSink<R2, E | E1, B>): IO<R | R1 | R2, never, void> {
396
+ return this.self.run(
397
+ Sink.unsafeMake(
398
+ (value) => this.f(value).matchCauseIO(sink.onFailure, sink.onSuccess),
399
+ (cause) => sink.onFailure(cause),
443
400
  ),
444
401
  );
445
- };
402
+ }
446
403
  }
447
404
 
448
405
  /**
449
406
  * @tsplus pipeable fncts.io.Push mapIO
450
407
  */
451
408
  export function mapIO<A, R1, E1, B>(f: (a: A) => IO<R1, E1, B>) {
452
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> =>
453
- Push((emitter) =>
454
- self.run(
455
- Sink(
456
- (value) =>
457
- f(value).matchCauseIO(
458
- (cause) => emitter.error(cause),
459
- (b) => emitter.event(b),
460
- ),
461
- (cause) => emitter.error(cause),
462
- ),
463
- ),
464
- );
409
+ return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => new MapIO(self, f);
465
410
  }
466
411
 
467
412
  /**
468
- * @tsplus pipeable fncts.io.Push merge
413
+ * @tsplus pipeable fncts.io.Push mapIOWithStrategy
469
414
  */
470
- export function merge<R1, E1, B>(that: Push<R1, E1, B>) {
471
- return <R, E, A>(self: Push<R, E, A>): Push<R | R1, E | E1, A | B> => {
472
- return Push.mergeAll([self, that]);
473
- };
415
+ export function mapIOWithStrategy<A, R1, E1, B>(
416
+ f: (a: A) => IO<R1, E1, B>,
417
+ flattenStrategy: FlattenStrategy,
418
+ executionStrategy: ExecutionStrategy,
419
+ ) {
420
+ return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> =>
421
+ self.flatMapWithStrategy((a) => Push.fromIO(f(a)), flattenStrategy, executionStrategy);
422
+ }
423
+
424
+ class MergeWithStrategy<Ps extends ReadonlyArray<Push<any, any, any>>> extends Push<
425
+ Push.EnvironmentOf<Ps[number]>,
426
+ Push.ErrorOf<Ps[number]>,
427
+ Push.ValueOf<Ps[number]>
428
+ > {
429
+ constructor(
430
+ readonly ps: Ps,
431
+ readonly mergeStrategy: MergeStrategy,
432
+ ) {
433
+ super();
434
+ }
435
+
436
+ run<R1>(
437
+ sink: UnsafeSink<R1, Push.ErrorOf<Ps[number]>, Push.ValueOf<Ps[number]>>,
438
+ ): IO<Push.EnvironmentOf<Ps[number]> | R1, never, void> {
439
+ return this.mergeStrategy.runMerge(this.ps, sink);
440
+ }
474
441
  }
475
442
 
476
443
  /**
477
- * @tsplus static fncts.io.PushOps mergeAll
444
+ * @tsplus static fncts.io.PushOps mergeWithStrategy
478
445
  */
479
- export function mergeAll<A extends ReadonlyArray<Push<any, any, any>>>(
480
- streams: [...A],
481
- ): Push<Push.EnvironmentOf<A[number]>, Push.ErrorOf<A[number]>, Push.ValueOf<A[number]>>;
482
- export function mergeAll<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R, E, A>;
483
- export function mergeAll<R, E, A>(streams: Iterable<Push<R, E, A>>): Push<R, E, A> {
484
- return Push((sink) =>
485
- IO.foreachConcurrentDiscard(streams, (stream) =>
486
- stream.run(Sink(sink.event, (cause) => (cause.isInterruptedOnly ? IO.unit : sink.error(cause)))),
487
- ),
488
- );
446
+ export function mergeWithStrategy<Ps extends ReadonlyArray<Push<any, any, any>>>(
447
+ streams: Ps,
448
+ mergeStrategy: MergeStrategy,
449
+ ): Push<Push.EnvironmentOf<Ps[number]>, Push.ErrorOf<Ps[number]>, Push.ValueOf<Ps[number]>> {
450
+ return new MergeWithStrategy(streams, mergeStrategy);
489
451
  }
490
452
 
491
453
  /**
492
454
  * @tsplus pipeable fncts.io.Push observe
493
455
  */
494
- export function observe<A, R1, E1>(f: (a: A) => IO<R1, E1, void>, __tsplusTrace?: string) {
495
- return <R, E>(self: Push<R, E, A>): IO<R | R1 | Scope, E | E1, void> => {
496
- return Do((Δ) => {
497
- const future = Δ(Future.make<E | E1, void>());
498
- const fiber = Δ(
499
- self
500
- .run(
501
- Sink(
502
- (a) => f(a).catchAllCause((cause) => future.failCause(cause)),
503
- (cause) => future.failCause(cause),
504
- ),
505
- )
506
- .flatMap(() => future.succeed(undefined)).forkScoped,
507
- );
508
-
509
- Δ(future.await);
510
- Δ(fiber.interruptFork);
511
- });
456
+ export function observe<A, R1>(f: (a: A) => IO<R1, never, void>) {
457
+ return <R, E>(self: Push<R, E, A>): IO<R | R1, never, void> => {
458
+ return self.run(Sink.unsafeMake(f, (cause) => IO.failCause(cause).orHalt));
512
459
  };
513
460
  }
514
461
 
515
- /**
516
- * @tsplus static fncts.io.PushOps repeatIOMaybe
517
- */
518
- export function repeatIOMaybe<R, E, A>(io: IO<R, Maybe<E>, A>, __tsplusTrace?: string): Push<R, E, A> {
519
- return Push.unfoldIO(undefined, () =>
520
- io
521
- .map((a) => Just([a, undefined] as const))
522
- .catchAll((maybeError) => maybeError.match(() => IO.succeedNow(Nothing()), IO.failNow)),
523
- );
524
- }
525
-
526
- /**
527
- * @tsplus getter fncts.io.Push runCollect
528
- */
529
- export function runCollect<R, E, A>(self: Push<R, E, A>): IO<R | Scope, E, Conc<A>> {
530
- return IO.defer(() => {
531
- const out: Array<A> = [];
532
- return self.observe((a) => IO(out.push(a))).as(Conc.fromArray(out));
533
- });
462
+ class OrElseCause<R, E, A, R1, E1, B> extends Push<R | R1, E | E1, A | B> {
463
+ constructor(
464
+ readonly self: Push<R, E, A>,
465
+ readonly that: (cause: Cause<E>) => Push<R1, E1, B>,
466
+ ) {
467
+ super();
468
+ }
469
+ run<R2>(sink: UnsafeSink<R2, E | E1, A | B>): IO<R | R1 | R2, never, void> {
470
+ return this.self.run(Sink.unsafeMake(sink.onSuccess, (cause) => this.that(cause).run(sink)));
471
+ }
534
472
  }
535
473
 
536
474
  /**
537
- * @tsplus getter fncts.io.Push runDrain
475
+ * @tsplus pipeable fncts.io.Push orElseCause
538
476
  */
539
- export function runDrain<R, E, A>(self: Push<R, E, A>): IO<R | Scope, E, void> {
540
- return self.observe(() => IO.unit);
477
+ export function orElseCause<E, R1, E1, B>(that: (cause: Cause<E>) => Push<R1, E1, B>) {
478
+ return <R, A>(self: Push<R, E, A>): Push<R | R1, E | E1, A | B> => new OrElseCause(self, that);
541
479
  }
542
480
 
543
481
  /**
544
- * @tsplus static fncts.io.PushOps scoped
482
+ * @tsplus pipeable fncts.io.Push provideEnvironment
545
483
  */
546
- export function scoped<R, E, A>(io: Lazy<IO<R, E, A>>, __tsplusTrace?: string): Push<Exclude<R, Scope>, E, A> {
547
- return Push((emitter) =>
548
- IO.defer(io).scoped.matchCauseIO(
549
- (cause) => emitter.error(cause),
550
- (value) => emitter.event(value),
551
- ),
552
- );
484
+ export function provideEnvironment<R>(environment: Environment<R>) {
485
+ return <E, A>(self: Push<R, E, A>): Push<never, E, A> => self.provideSomeEnvironment(environment);
553
486
  }
554
487
 
555
- /**
556
- * @tsplus static fncts.io.PushOps succeed
557
- */
558
- export function succeed<A>(value: Lazy<A>): Push<never, never, A> {
559
- return Push.fromIO(IO.succeed(value));
488
+ class ProvideLayer<R, E, A, R1, E1, R2> extends Push<Exclude<R, R2> | R1, E | E1, A> {
489
+ constructor(
490
+ readonly self: Push<R, E, A>,
491
+ readonly layer: Layer<R1, E1, R2>,
492
+ ) {
493
+ super();
494
+ }
495
+ run<R3>(sink: UnsafeSink<R3, E | E1, A>): IO<R1 | Exclude<R, R2> | R3, never, void> {
496
+ return IO.bracketExit(
497
+ Scope.make,
498
+ (scope) =>
499
+ this.layer
500
+ .build(scope)
501
+ .matchCauseIO(sink.onFailure, (environment) => this.self.run(sink).provideSomeEnvironment(environment)),
502
+ (scope, exit) => scope.close(exit),
503
+ );
504
+ }
560
505
  }
561
506
 
562
507
  /**
563
- * @tsplus pipeable fncts.io.Push switchMap
508
+ * @tsplus pipeable fncts.io.Push provideLayer
564
509
  */
565
- export function switchMap<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>) {
566
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
567
- return Push((sink) => withSwitch((fork) => self.run(Sink((a) => fork(f(a).run(sink)), sink.error))));
568
- };
510
+ export function provideLayer<R1, E1, R2>(layer: Layer<R1, E1, R2>) {
511
+ return <R, E, A>(self: Push<R, E, A>): Push<Exclude<R, R2> | R1, E | E1, A> => new ProvideLayer(self, layer);
569
512
  }
570
513
 
571
514
  /**
572
- * @tsplus pipeable fncts.io.Push switchMapIO
515
+ * @tsplus pipeable fncts.io.Push provideSomeEnvironment
573
516
  */
574
- export function switchMapIO<A, R1, E1, B>(f: (a: A) => IO<R1, E1, B>) {
575
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> => {
576
- return self.switchMap((a) => Push.fromIO(f(a)));
577
- };
517
+ export function provideSomeEnvironment<R1>(environment: Environment<R1>) {
518
+ return <R, E, A>(self: Push<R, E, A>): Push<Exclude<R, R1>, E, A> =>
519
+ self.contramapEnvironment((r) => r.union(environment));
578
520
  }
579
521
 
580
522
  /**
581
- * @tsplus pipeable fncts.io.Push tap
523
+ * @tsplus static fncts.io.PushOps schedule
582
524
  */
583
- export function tap<A, R1, E1, B>(f: (a: A) => IO<R1, E1, B>) {
584
- return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, A> => {
585
- return Push((sink) => self.run(Sink((a) => f(a).matchCauseIO(sink.error, () => sink.event(a)), sink.error)));
586
- };
525
+ export function schedule<R, E, A, R1, O>(io: IO<R, E, A>, schedule: Schedule<R1, unknown, O>): Push<R | R1, E, A> {
526
+ return Push.fromIOProducer(new Scheduled(io, schedule));
587
527
  }
588
528
 
589
529
  /**
590
- * @tsplus pipeable fncts.io.Push transform
530
+ * @tsplus static fncts.io.PushOps succeed
591
531
  */
592
- export function transform<R1 = never>(f: <R, E, A>(io: IO<R, E, A>) => IO<R | R1, E, A>) {
593
- return <R, E, A>(self: Push<R, E, A>): Push<R | R1, E, A> => Push((emitter) => f(self.run(emitter)));
594
- }
595
-
596
- function unfoldLoop<S, A, R1>(
597
- s: S,
598
- f: (s: S) => Maybe<readonly [A, S]>,
599
- emitter: Sink<R1, never, A>,
600
- ): IO<R1, never, void> {
601
- return f(s).match(
602
- () => IO.unit,
603
- ([a, s]) => emitter.event(a) > unfoldLoop(s, f, emitter),
604
- );
532
+ export function succeed<A>(value: Lazy<A>): Push<never, never, A> {
533
+ return Push.fromSyncProducer(SyncProducer.fromSync(value));
605
534
  }
606
535
 
607
536
  /**
608
- * @tsplus static fncts.io.PushOps unfold
537
+ * @tsplus static fncts.io.PushOps succeedNow
609
538
  */
610
- export function unfold<S, A>(s: S, f: (s: S) => Maybe<readonly [A, S]>): Push<never, never, A> {
611
- return Push((emitter) => unfoldLoop(s, f, emitter));
612
- }
613
-
614
- function unfoldIOLoop<S, R, E, A, R1>(
615
- s: S,
616
- f: (s: S) => IO<R, E, Maybe<readonly [A, S]>>,
617
- emitter: Sink<R1, E, A>,
618
- ): IO<R | R1, never, void> {
619
- return f(s)
620
- .flatMap((result) =>
621
- result.match(
622
- () => IO.unit,
623
- ([a, s]) => emitter.event(a) > unfoldIOLoop(s, f, emitter),
624
- ),
625
- )
626
- .catchAllCause((cause) => emitter.error(cause));
539
+ export function succeedNow<A>(value: A): Push<never, never, A> {
540
+ return Push.fromSyncProducer(SyncProducer.Success(value));
627
541
  }
628
542
 
629
543
  /**
630
- * @tsplus static fncts.io.PushOps unfoldIO
544
+ * @tsplus pipeable fncts.io.Push switchMap
631
545
  */
632
- export function unfoldIO<S, R, E, A>(s: S, f: (s: S) => IO<R, E, Maybe<readonly [A, S]>>): Push<R, E, A> {
633
- return Push((emitter) => unfoldIOLoop(s, f, emitter));
546
+ export function switchMap<A, R1, E1, B>(f: (a: A) => Push<R1, E1, B>, executionStrategy?: ExecutionStrategy) {
547
+ return <R, E>(self: Push<R, E, A>): Push<R | R1, E | E1, B> =>
548
+ self.flatMapWithStrategy(f, FlattenStrategy.Switch, executionStrategy ?? ExecutionStrategy.sequential);
634
549
  }
635
550
 
636
551
  /**
637
- * @tsplus pipeable fncts.io.Push untilFuture
552
+ * @tsplus pipeable fncts.io.Push transform
638
553
  */
639
- export function untilFuture<E1, B>(future: Future<E1, B>) {
640
- return <R, E, A>(self: Push<R, E, A>): Push<R, E | E1, A> => {
641
- return Push(<R1>(sink: Sink<R1, E | E1, A>) =>
642
- IO.asyncIO<R | R1, never, void>((cb) => {
643
- const exit = IO(cb(IO.unit));
644
- return Do((Δ) => {
645
- const streamFiber = Δ(self.run(sink).fork);
646
- const futureFiber = Δ(
647
- future.await
648
- .matchCauseIO(
649
- (cause) => sink.error(cause),
650
- () => IO.unit,
651
- )
652
- .zipRight(exit).fork,
653
- );
654
- Δ(Fiber.joinAll([streamFiber, futureFiber]));
655
- });
656
- }),
657
- );
554
+ export function transform<R, R1>(f: (io: IO<R, never, void>) => IO<R1, never, void>) {
555
+ return <E, A>(self: Push<R, E, A>): Push<R | R1, E, A> => {
556
+ const op = new PushPrimitive(PushTag.Transform);
557
+ op.i0 = self;
558
+ op.i1 = f;
559
+ return op;
658
560
  };
659
561
  }
660
562
 
661
- /**
662
- * @tsplus pipeable fncts.io.Push untilPush
663
- */
664
- export function untilPush<R1, E1, B>(signal: Push<R1, E1, B>) {
665
- return <R, E, A>(self: Push<R, E, A>): Push<R | R1, E | E1, A> => {
666
- return Push(<R2>(sink: Sink<R2, E | E1, A>) =>
667
- IO.asyncIO<R | R1 | R2, never, void>((cb) => {
668
- const exit = IO(cb(IO.unit));
669
- return Do((Δ) => {
670
- const signalFiber = Δ(
671
- signal.run(
672
- Sink(
673
- () => exit,
674
- (cause) => sink.error(cause),
675
- ),
676
- ).fork,
677
- );
678
- const streamFiber = Δ(self.run(sink).fork);
679
- Δ(Fiber.joinAll([signalFiber, streamFiber]));
680
- });
681
- }),
563
+ class Unwrap<R, E, R1, E1, A> extends Push<R | R1, E | E1, A> {
564
+ constructor(readonly io: IO<R, E, Push<R1, E1, A>>) {
565
+ super();
566
+ }
567
+ run<R2>(sink: UnsafeSink<R2, E | E1, A>): IO<R | R1 | R2, never, void> {
568
+ return this.io.matchCauseIO(
569
+ (cause) => sink.onFailure(cause),
570
+ (stream) => stream.run(sink),
682
571
  );
683
- };
572
+ }
684
573
  }
685
574
 
686
575
  /**
687
576
  * @tsplus static fncts.io.PushOps unwrap
688
577
  */
689
578
  export function unwrap<R, E, R1, E1, A>(io: IO<R, E, Push<R1, E1, A>>): Push<R | R1, E | E1, A> {
690
- return Push.fromIO(io).flatten;
691
- }
692
-
693
- /**
694
- * @tsplus static fncts.io.PushOps unwrapScoped
695
- */
696
- export function unwrapScoped<R, E, R1, E1, A>(
697
- self: IO<R, E, Push<R1, E1, A>>,
698
- __tsplusTrace?: string,
699
- ): Push<R1 | Exclude<R, Scope>, E | E1, A> {
700
- return Push.scoped(self).flatten;
579
+ return new Unwrap(io);
701
580
  }
702
-
703
- /**
704
- * @tsplus static fncts.io.PushOps never
705
- */
706
- export const never = Push.fromIO(IO.never);