@typed/fx 1.18.4 → 1.20.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 (423) hide show
  1. package/AsyncData/package.json +6 -0
  2. package/Emitter/package.json +6 -0
  3. package/Form/package.json +6 -0
  4. package/FormEntry/package.json +6 -0
  5. package/Fx/package.json +6 -0
  6. package/Guard/package.json +6 -0
  7. package/Idle/package.json +6 -0
  8. package/Match/package.json +6 -0
  9. package/Pull/package.json +6 -0
  10. package/Push/package.json +6 -0
  11. package/RefArray/package.json +6 -0
  12. package/RefChunk/package.json +6 -0
  13. package/RefHashMap/package.json +6 -0
  14. package/RefHashSet/package.json +6 -0
  15. package/RefSubject/package.json +6 -0
  16. package/Sink/package.json +6 -0
  17. package/Stream/package.json +6 -0
  18. package/Subject/package.json +6 -0
  19. package/TypeId/package.json +6 -0
  20. package/Typeclass/package.json +6 -0
  21. package/Versioned/package.json +6 -0
  22. package/dist/cjs/AsyncData.js +177 -0
  23. package/dist/cjs/AsyncData.js.map +1 -0
  24. package/dist/cjs/Emitter.js +24 -21
  25. package/dist/cjs/Emitter.js.map +1 -1
  26. package/dist/cjs/Form.js +78 -21
  27. package/dist/cjs/Form.js.map +1 -1
  28. package/dist/cjs/FormEntry.js +75 -48
  29. package/dist/cjs/FormEntry.js.map +1 -1
  30. package/dist/cjs/Fx.js +517 -872
  31. package/dist/cjs/Fx.js.map +1 -1
  32. package/dist/cjs/Guard.js +21 -13
  33. package/dist/cjs/Guard.js.map +1 -1
  34. package/dist/cjs/Idle.js +49 -37
  35. package/dist/cjs/Idle.js.map +1 -1
  36. package/dist/cjs/Match.js +99 -61
  37. package/dist/cjs/Match.js.map +1 -1
  38. package/dist/cjs/Pull.js.map +1 -1
  39. package/dist/cjs/Push.js +168 -0
  40. package/dist/cjs/Push.js.map +1 -0
  41. package/dist/cjs/RefArray.js +32 -30
  42. package/dist/cjs/RefArray.js.map +1 -1
  43. package/dist/cjs/RefChunk.js +26 -24
  44. package/dist/cjs/RefChunk.js.map +1 -1
  45. package/dist/cjs/RefHashMap.js +20 -20
  46. package/dist/cjs/RefHashMap.js.map +1 -1
  47. package/dist/cjs/RefHashSet.js +11 -8
  48. package/dist/cjs/RefHashSet.js.map +1 -1
  49. package/dist/cjs/RefSubject.js +899 -158
  50. package/dist/cjs/RefSubject.js.map +1 -1
  51. package/dist/cjs/Sink.js +588 -62
  52. package/dist/cjs/Sink.js.map +1 -1
  53. package/dist/cjs/Stream.js +15 -10
  54. package/dist/cjs/Stream.js.map +1 -1
  55. package/dist/cjs/Subject.js +153 -55
  56. package/dist/cjs/Subject.js.map +1 -1
  57. package/dist/cjs/TypeId.js +10 -5
  58. package/dist/cjs/TypeId.js.map +1 -1
  59. package/dist/cjs/Typeclass.js +28 -31
  60. package/dist/cjs/Typeclass.js.map +1 -1
  61. package/dist/cjs/Versioned.js +118 -57
  62. package/dist/cjs/Versioned.js.map +1 -1
  63. package/dist/cjs/index.js +44 -8
  64. package/dist/cjs/index.js.map +1 -1
  65. package/dist/cjs/internal/{deferred-ref.js → DeferredRef.js} +45 -13
  66. package/dist/cjs/internal/DeferredRef.js.map +1 -0
  67. package/dist/cjs/internal/UnionToTuple.js +6 -0
  68. package/dist/cjs/internal/UnionToTuple.js.map +1 -0
  69. package/dist/cjs/internal/core.js +1590 -779
  70. package/dist/cjs/internal/core.js.map +1 -1
  71. package/dist/cjs/internal/diff.js +114 -0
  72. package/dist/cjs/internal/diff.js.map +1 -0
  73. package/dist/cjs/internal/effect-loop-operator.js +288 -0
  74. package/dist/cjs/internal/effect-loop-operator.js.map +1 -0
  75. package/dist/cjs/internal/effect-operator.js +46 -37
  76. package/dist/cjs/internal/effect-operator.js.map +1 -1
  77. package/dist/cjs/internal/effect-producer.js +74 -0
  78. package/dist/cjs/internal/effect-producer.js.map +1 -0
  79. package/dist/cjs/internal/helpers.js +158 -128
  80. package/dist/cjs/internal/helpers.js.map +1 -1
  81. package/dist/cjs/internal/keyed.js +136 -173
  82. package/dist/cjs/internal/keyed.js.map +1 -1
  83. package/dist/cjs/internal/loop-operator.js +213 -0
  84. package/dist/cjs/internal/loop-operator.js.map +1 -0
  85. package/dist/cjs/internal/operator.js +79 -0
  86. package/dist/cjs/internal/operator.js.map +1 -0
  87. package/dist/cjs/internal/protos.js +19 -81
  88. package/dist/cjs/internal/protos.js.map +1 -1
  89. package/dist/cjs/internal/provide.js +47 -25
  90. package/dist/cjs/internal/provide.js.map +1 -1
  91. package/dist/cjs/internal/requestIdleCallback.js +5 -5
  92. package/dist/cjs/internal/requestIdleCallback.js.map +1 -1
  93. package/dist/cjs/internal/share.js +12 -15
  94. package/dist/cjs/internal/share.js.map +1 -1
  95. package/dist/cjs/internal/sync-operator.js +50 -22
  96. package/dist/cjs/internal/sync-operator.js.map +1 -1
  97. package/dist/cjs/internal/sync-producer.js +114 -0
  98. package/dist/cjs/internal/sync-producer.js.map +1 -0
  99. package/dist/cjs/internal/withKey.js +45 -51
  100. package/dist/cjs/internal/withKey.js.map +1 -1
  101. package/dist/dts/AsyncData.d.ts +185 -0
  102. package/dist/dts/AsyncData.d.ts.map +1 -0
  103. package/dist/dts/Emitter.d.ts +13 -20
  104. package/dist/dts/Emitter.d.ts.map +1 -1
  105. package/dist/dts/Form.d.ts +45 -28
  106. package/dist/dts/Form.d.ts.map +1 -1
  107. package/dist/dts/FormEntry.d.ts +25 -13
  108. package/dist/dts/FormEntry.d.ts.map +1 -1
  109. package/dist/dts/Fx.d.ts +983 -1387
  110. package/dist/dts/Fx.d.ts.map +1 -1
  111. package/dist/dts/Guard.d.ts +8 -1
  112. package/dist/dts/Guard.d.ts.map +1 -1
  113. package/dist/dts/Idle.d.ts +3 -3
  114. package/dist/dts/Idle.d.ts.map +1 -1
  115. package/dist/dts/Match.d.ts +8 -8
  116. package/dist/dts/Match.d.ts.map +1 -1
  117. package/dist/dts/Pull.d.ts +5 -5
  118. package/dist/dts/Pull.d.ts.map +1 -1
  119. package/dist/dts/Push.d.ts +170 -0
  120. package/dist/dts/Push.d.ts.map +1 -0
  121. package/dist/dts/RefArray.d.ts +21 -23
  122. package/dist/dts/RefArray.d.ts.map +1 -1
  123. package/dist/dts/RefChunk.d.ts +17 -19
  124. package/dist/dts/RefChunk.d.ts.map +1 -1
  125. package/dist/dts/RefHashMap.d.ts +19 -20
  126. package/dist/dts/RefHashMap.d.ts.map +1 -1
  127. package/dist/dts/RefHashSet.d.ts +12 -16
  128. package/dist/dts/RefHashSet.d.ts.map +1 -1
  129. package/dist/dts/RefSubject.d.ts +396 -187
  130. package/dist/dts/RefSubject.d.ts.map +1 -1
  131. package/dist/dts/Sink.d.ts +193 -93
  132. package/dist/dts/Sink.d.ts.map +1 -1
  133. package/dist/dts/Stream.d.ts +7 -1
  134. package/dist/dts/Stream.d.ts.map +1 -1
  135. package/dist/dts/Subject.d.ts +27 -36
  136. package/dist/dts/Subject.d.ts.map +1 -1
  137. package/dist/dts/TypeId.d.ts +10 -0
  138. package/dist/dts/TypeId.d.ts.map +1 -1
  139. package/dist/dts/Typeclass.d.ts +2 -2
  140. package/dist/dts/Typeclass.d.ts.map +1 -1
  141. package/dist/dts/Versioned.d.ts +50 -78
  142. package/dist/dts/Versioned.d.ts.map +1 -1
  143. package/dist/dts/index.d.ts +66 -6
  144. package/dist/dts/index.d.ts.map +1 -1
  145. package/dist/dts/internal/DeferredRef.d.ts +20 -0
  146. package/dist/dts/internal/DeferredRef.d.ts.map +1 -0
  147. package/dist/dts/internal/UnionToTuple.d.ts +6 -0
  148. package/dist/dts/internal/UnionToTuple.d.ts.map +1 -0
  149. package/dist/dts/internal/core.d.ts +218 -450
  150. package/dist/dts/internal/core.d.ts.map +1 -1
  151. package/dist/dts/internal/diff.d.ts +38 -0
  152. package/dist/dts/internal/diff.d.ts.map +1 -0
  153. package/dist/dts/internal/effect-loop-operator.d.ts +34 -0
  154. package/dist/dts/internal/effect-loop-operator.d.ts.map +1 -0
  155. package/dist/dts/internal/effect-operator.d.ts +8 -5
  156. package/dist/dts/internal/effect-operator.d.ts.map +1 -1
  157. package/dist/dts/internal/effect-producer.d.ts +25 -0
  158. package/dist/dts/internal/effect-producer.d.ts.map +1 -0
  159. package/dist/dts/internal/helpers.d.ts +33 -24
  160. package/dist/dts/internal/helpers.d.ts.map +1 -1
  161. package/dist/dts/internal/keyed.d.ts +3 -3
  162. package/dist/dts/internal/keyed.d.ts.map +1 -1
  163. package/dist/dts/internal/loop-operator.d.ts +40 -0
  164. package/dist/dts/internal/loop-operator.d.ts.map +1 -0
  165. package/dist/dts/internal/operator.d.ts +16 -0
  166. package/dist/dts/internal/operator.d.ts.map +1 -0
  167. package/dist/dts/internal/protos.d.ts +16 -43
  168. package/dist/dts/internal/protos.d.ts.map +1 -1
  169. package/dist/dts/internal/provide.d.ts +7 -1
  170. package/dist/dts/internal/provide.d.ts.map +1 -1
  171. package/dist/dts/internal/share.d.ts +12 -9
  172. package/dist/dts/internal/share.d.ts.map +1 -1
  173. package/dist/dts/internal/sync-operator.d.ts +7 -3
  174. package/dist/dts/internal/sync-operator.d.ts.map +1 -1
  175. package/dist/dts/internal/sync-producer.d.ts +36 -0
  176. package/dist/dts/internal/sync-producer.d.ts.map +1 -0
  177. package/dist/dts/internal/withKey.d.ts +3 -3
  178. package/dist/dts/internal/withKey.d.ts.map +1 -1
  179. package/dist/esm/AsyncData.js +151 -0
  180. package/dist/esm/AsyncData.js.map +1 -0
  181. package/dist/esm/Emitter.js +24 -21
  182. package/dist/esm/Emitter.js.map +1 -1
  183. package/dist/esm/Form.js +69 -14
  184. package/dist/esm/Form.js.map +1 -1
  185. package/dist/esm/FormEntry.js +77 -52
  186. package/dist/esm/FormEntry.js.map +1 -1
  187. package/dist/esm/Fx.js +509 -874
  188. package/dist/esm/Fx.js.map +1 -1
  189. package/dist/esm/Guard.js +5 -1
  190. package/dist/esm/Guard.js.map +1 -1
  191. package/dist/esm/Idle.js +49 -39
  192. package/dist/esm/Idle.js.map +1 -1
  193. package/dist/esm/Match.js +103 -63
  194. package/dist/esm/Match.js.map +1 -1
  195. package/dist/esm/Pull.js.map +1 -1
  196. package/dist/esm/Push.js +159 -0
  197. package/dist/esm/Push.js.map +1 -0
  198. package/dist/esm/RefArray.js +32 -30
  199. package/dist/esm/RefArray.js.map +1 -1
  200. package/dist/esm/RefChunk.js +26 -24
  201. package/dist/esm/RefChunk.js.map +1 -1
  202. package/dist/esm/RefHashMap.js +20 -20
  203. package/dist/esm/RefHashMap.js.map +1 -1
  204. package/dist/esm/RefHashSet.js +11 -8
  205. package/dist/esm/RefHashSet.js.map +1 -1
  206. package/dist/esm/RefSubject.js +873 -150
  207. package/dist/esm/RefSubject.js.map +1 -1
  208. package/dist/esm/Sink.js +608 -57
  209. package/dist/esm/Sink.js.map +1 -1
  210. package/dist/esm/Stream.js +13 -9
  211. package/dist/esm/Stream.js.map +1 -1
  212. package/dist/esm/Subject.js +151 -56
  213. package/dist/esm/Subject.js.map +1 -1
  214. package/dist/esm/TypeId.js +9 -4
  215. package/dist/esm/TypeId.js.map +1 -1
  216. package/dist/esm/Typeclass.js +29 -29
  217. package/dist/esm/Typeclass.js.map +1 -1
  218. package/dist/esm/Versioned.js +110 -53
  219. package/dist/esm/Versioned.js.map +1 -1
  220. package/dist/esm/index.js +66 -6
  221. package/dist/esm/index.js.map +1 -1
  222. package/dist/esm/internal/DeferredRef.js +54 -0
  223. package/dist/esm/internal/DeferredRef.js.map +1 -0
  224. package/dist/esm/internal/UnionToTuple.js +2 -0
  225. package/dist/esm/internal/UnionToTuple.js.map +1 -0
  226. package/dist/esm/internal/core.js +1439 -719
  227. package/dist/esm/internal/core.js.map +1 -1
  228. package/dist/esm/internal/diff.js +82 -0
  229. package/dist/esm/internal/diff.js.map +1 -0
  230. package/dist/esm/internal/effect-loop-operator.js +269 -0
  231. package/dist/esm/internal/effect-loop-operator.js.map +1 -0
  232. package/dist/esm/internal/effect-operator.js +44 -37
  233. package/dist/esm/internal/effect-operator.js.map +1 -1
  234. package/dist/esm/internal/effect-producer.js +47 -0
  235. package/dist/esm/internal/effect-producer.js.map +1 -0
  236. package/dist/esm/internal/helpers.js +157 -129
  237. package/dist/esm/internal/helpers.js.map +1 -1
  238. package/dist/esm/internal/keyed.js +128 -139
  239. package/dist/esm/internal/keyed.js.map +1 -1
  240. package/dist/esm/internal/loop-operator.js +186 -0
  241. package/dist/esm/internal/loop-operator.js.map +1 -0
  242. package/dist/esm/internal/operator.js +68 -0
  243. package/dist/esm/internal/operator.js.map +1 -0
  244. package/dist/esm/internal/protos.js +16 -75
  245. package/dist/esm/internal/protos.js.map +1 -1
  246. package/dist/esm/internal/provide.js +33 -25
  247. package/dist/esm/internal/provide.js.map +1 -1
  248. package/dist/esm/internal/requestIdleCallback.js +5 -5
  249. package/dist/esm/internal/requestIdleCallback.js.map +1 -1
  250. package/dist/esm/internal/share.js +12 -12
  251. package/dist/esm/internal/share.js.map +1 -1
  252. package/dist/esm/internal/sync-operator.js +49 -21
  253. package/dist/esm/internal/sync-operator.js.map +1 -1
  254. package/dist/esm/internal/sync-producer.js +88 -0
  255. package/dist/esm/internal/sync-producer.js.map +1 -0
  256. package/dist/esm/internal/withKey.js +46 -47
  257. package/dist/esm/internal/withKey.js.map +1 -1
  258. package/package.json +22 -62
  259. package/src/AsyncData.ts +447 -0
  260. package/src/Emitter.ts +47 -38
  261. package/src/Form.ts +185 -65
  262. package/src/FormEntry.ts +142 -109
  263. package/src/Fx.ts +1685 -1851
  264. package/src/Guard.ts +12 -1
  265. package/src/Idle.ts +76 -62
  266. package/src/Match.ts +149 -93
  267. package/src/Pull.ts +8 -8
  268. package/src/Push.ts +472 -0
  269. package/src/RefArray.ts +53 -51
  270. package/src/RefChunk.ts +44 -41
  271. package/src/RefHashMap.ts +57 -43
  272. package/src/RefHashSet.ts +21 -31
  273. package/src/RefSubject.ts +1984 -457
  274. package/src/Sink.ts +922 -171
  275. package/src/Stream.ts +32 -20
  276. package/src/Subject.ts +230 -87
  277. package/src/TypeId.ts +16 -4
  278. package/src/Typeclass.ts +31 -32
  279. package/src/Versioned.ts +220 -168
  280. package/src/index.ts +78 -6
  281. package/src/internal/DeferredRef.ts +62 -0
  282. package/src/internal/UnionToTuple.ts +11 -0
  283. package/src/internal/core.ts +2491 -1950
  284. package/src/internal/diff.ts +157 -0
  285. package/src/internal/effect-loop-operator.ts +466 -0
  286. package/src/internal/effect-operator.ts +89 -54
  287. package/src/internal/effect-producer.ts +125 -0
  288. package/src/internal/helpers.ts +275 -205
  289. package/src/internal/keyed.ts +192 -241
  290. package/src/internal/loop-operator.ts +266 -0
  291. package/src/internal/operator.ts +87 -0
  292. package/src/internal/protos.ts +29 -104
  293. package/src/internal/provide.ts +48 -40
  294. package/src/internal/requestIdleCallback.ts +5 -6
  295. package/src/internal/share.ts +26 -24
  296. package/src/internal/sync-operator.ts +68 -27
  297. package/src/internal/sync-producer.ts +146 -0
  298. package/src/internal/withKey.ts +64 -74
  299. package/dist/cjs/Computed.js +0 -115
  300. package/dist/cjs/Computed.js.map +0 -1
  301. package/dist/cjs/Filtered.js +0 -95
  302. package/dist/cjs/Filtered.js.map +0 -1
  303. package/dist/cjs/Model.js +0 -119
  304. package/dist/cjs/Model.js.map +0 -1
  305. package/dist/cjs/RefAsyncData.js +0 -187
  306. package/dist/cjs/RefAsyncData.js.map +0 -1
  307. package/dist/cjs/RefAsyncDataArray.js +0 -38
  308. package/dist/cjs/RefAsyncDataArray.js.map +0 -1
  309. package/dist/cjs/RefBoolean.js +0 -45
  310. package/dist/cjs/RefBoolean.js.map +0 -1
  311. package/dist/cjs/RefNumber.js +0 -49
  312. package/dist/cjs/RefNumber.js.map +0 -1
  313. package/dist/cjs/internal/core-ref-subject.js +0 -254
  314. package/dist/cjs/internal/core-ref-subject.js.map +0 -1
  315. package/dist/cjs/internal/core-subject.js +0 -108
  316. package/dist/cjs/internal/core-subject.js.map +0 -1
  317. package/dist/cjs/internal/deferred-ref.js.map +0 -1
  318. package/dist/cjs/internal/effect-primitive.js +0 -47
  319. package/dist/cjs/internal/effect-primitive.js.map +0 -1
  320. package/dist/cjs/internal/fx-effect-proto.js +0 -58
  321. package/dist/cjs/internal/fx-effect-proto.js.map +0 -1
  322. package/dist/cjs/internal/fx-primitive.js +0 -193
  323. package/dist/cjs/internal/fx-primitive.js.map +0 -1
  324. package/dist/cjs/internal/fx.js +0 -240
  325. package/dist/cjs/internal/fx.js.map +0 -1
  326. package/dist/cjs/internal/matchers.js +0 -34
  327. package/dist/cjs/internal/matchers.js.map +0 -1
  328. package/dist/cjs/internal/run.js +0 -54
  329. package/dist/cjs/internal/run.js.map +0 -1
  330. package/dist/cjs/internal/schema-ref-subject.js +0 -132
  331. package/dist/cjs/internal/schema-ref-subject.js.map +0 -1
  332. package/dist/cjs/internal/versioned-transform.js +0 -46
  333. package/dist/cjs/internal/versioned-transform.js.map +0 -1
  334. package/dist/dts/Computed.d.ts +0 -106
  335. package/dist/dts/Computed.d.ts.map +0 -1
  336. package/dist/dts/Filtered.d.ts +0 -97
  337. package/dist/dts/Filtered.d.ts.map +0 -1
  338. package/dist/dts/Model.d.ts +0 -200
  339. package/dist/dts/Model.d.ts.map +0 -1
  340. package/dist/dts/RefAsyncData.d.ts +0 -236
  341. package/dist/dts/RefAsyncData.d.ts.map +0 -1
  342. package/dist/dts/RefAsyncDataArray.d.ts +0 -56
  343. package/dist/dts/RefAsyncDataArray.d.ts.map +0 -1
  344. package/dist/dts/RefBoolean.d.ts +0 -47
  345. package/dist/dts/RefBoolean.d.ts.map +0 -1
  346. package/dist/dts/RefNumber.d.ts +0 -48
  347. package/dist/dts/RefNumber.d.ts.map +0 -1
  348. package/dist/dts/internal/core-ref-subject.d.ts +0 -100
  349. package/dist/dts/internal/core-ref-subject.d.ts.map +0 -1
  350. package/dist/dts/internal/core-subject.d.ts +0 -5
  351. package/dist/dts/internal/core-subject.d.ts.map +0 -1
  352. package/dist/dts/internal/deferred-ref.d.ts +0 -12
  353. package/dist/dts/internal/deferred-ref.d.ts.map +0 -1
  354. package/dist/dts/internal/effect-primitive.d.ts +0 -6
  355. package/dist/dts/internal/effect-primitive.d.ts.map +0 -1
  356. package/dist/dts/internal/fx-effect-proto.d.ts +0 -30
  357. package/dist/dts/internal/fx-effect-proto.d.ts.map +0 -1
  358. package/dist/dts/internal/fx-primitive.d.ts +0 -109
  359. package/dist/dts/internal/fx-primitive.d.ts.map +0 -1
  360. package/dist/dts/internal/fx.d.ts +0 -245
  361. package/dist/dts/internal/fx.d.ts.map +0 -1
  362. package/dist/dts/internal/matchers.d.ts +0 -33
  363. package/dist/dts/internal/matchers.d.ts.map +0 -1
  364. package/dist/dts/internal/run.d.ts +0 -8
  365. package/dist/dts/internal/run.d.ts.map +0 -1
  366. package/dist/dts/internal/schema-ref-subject.d.ts +0 -5
  367. package/dist/dts/internal/schema-ref-subject.d.ts.map +0 -1
  368. package/dist/dts/internal/versioned-transform.d.ts +0 -17
  369. package/dist/dts/internal/versioned-transform.d.ts.map +0 -1
  370. package/dist/esm/Computed.js +0 -103
  371. package/dist/esm/Computed.js.map +0 -1
  372. package/dist/esm/Filtered.js +0 -83
  373. package/dist/esm/Filtered.js.map +0 -1
  374. package/dist/esm/Model.js +0 -100
  375. package/dist/esm/Model.js.map +0 -1
  376. package/dist/esm/RefAsyncData.js +0 -163
  377. package/dist/esm/RefAsyncData.js.map +0 -1
  378. package/dist/esm/RefAsyncDataArray.js +0 -27
  379. package/dist/esm/RefAsyncDataArray.js.map +0 -1
  380. package/dist/esm/RefBoolean.js +0 -31
  381. package/dist/esm/RefBoolean.js.map +0 -1
  382. package/dist/esm/RefNumber.js +0 -35
  383. package/dist/esm/RefNumber.js.map +0 -1
  384. package/dist/esm/internal/core-ref-subject.js +0 -242
  385. package/dist/esm/internal/core-ref-subject.js.map +0 -1
  386. package/dist/esm/internal/core-subject.js +0 -90
  387. package/dist/esm/internal/core-subject.js.map +0 -1
  388. package/dist/esm/internal/deferred-ref.js +0 -23
  389. package/dist/esm/internal/deferred-ref.js.map +0 -1
  390. package/dist/esm/internal/effect-primitive.js +0 -41
  391. package/dist/esm/internal/effect-primitive.js.map +0 -1
  392. package/dist/esm/internal/fx-effect-proto.js +0 -43
  393. package/dist/esm/internal/fx-effect-proto.js.map +0 -1
  394. package/dist/esm/internal/fx-primitive.js +0 -175
  395. package/dist/esm/internal/fx-primitive.js.map +0 -1
  396. package/dist/esm/internal/fx.js +0 -216
  397. package/dist/esm/internal/fx.js.map +0 -1
  398. package/dist/esm/internal/matchers.js +0 -38
  399. package/dist/esm/internal/matchers.js.map +0 -1
  400. package/dist/esm/internal/run.js +0 -32
  401. package/dist/esm/internal/run.js.map +0 -1
  402. package/dist/esm/internal/schema-ref-subject.js +0 -121
  403. package/dist/esm/internal/schema-ref-subject.js.map +0 -1
  404. package/dist/esm/internal/versioned-transform.js +0 -37
  405. package/dist/esm/internal/versioned-transform.js.map +0 -1
  406. package/src/Computed.ts +0 -289
  407. package/src/Filtered.ts +0 -274
  408. package/src/Model.ts +0 -483
  409. package/src/RefAsyncData.ts +0 -547
  410. package/src/RefAsyncDataArray.ts +0 -135
  411. package/src/RefBoolean.ts +0 -71
  412. package/src/RefNumber.ts +0 -77
  413. package/src/internal/core-ref-subject.ts +0 -528
  414. package/src/internal/core-subject.ts +0 -143
  415. package/src/internal/deferred-ref.ts +0 -26
  416. package/src/internal/effect-primitive.ts +0 -230
  417. package/src/internal/fx-effect-proto.ts +0 -56
  418. package/src/internal/fx-primitive.ts +0 -223
  419. package/src/internal/fx.ts +0 -619
  420. package/src/internal/matchers.ts +0 -83
  421. package/src/internal/run.ts +0 -51
  422. package/src/internal/schema-ref-subject.ts +0 -163
  423. package/src/internal/versioned-transform.ts +0 -48
package/src/Guard.ts CHANGED
@@ -2,8 +2,10 @@
2
2
  * @since 1.18.0
3
3
  */
4
4
 
5
- import { Effect, Option } from "effect"
5
+ import type { Predicate } from "effect"
6
+ import * as Effect from "effect/Effect"
6
7
  import { dual } from "effect/Function"
8
+ import * as Option from "effect/Option"
7
9
 
8
10
  /**
9
11
  * @since 1.18.0
@@ -157,3 +159,12 @@ export type AnyOutput<GS extends Readonly<Record<string, Guard<any, any, any, an
157
159
  [K in keyof GS]: { readonly _tag: K; readonly value: Guard.Output<GS[K]> }
158
160
  }[keyof GS]
159
161
  ] extends [infer R] ? R : never
162
+
163
+ /**
164
+ * @since 1.20.0
165
+ */
166
+ export function liftPredicate<A, B extends A>(predicate: Predicate.Refinement<A, B>): Guard<A, never, never, B>
167
+ export function liftPredicate<A>(predicate: Predicate.Predicate<A>): Guard<A, never, never, A>
168
+ export function liftPredicate<A>(predicate: Predicate.Predicate<A>): Guard<A, never, never, A> {
169
+ return (a) => Effect.sync(() => (predicate(a) ? Option.some(a) : Option.none()))
170
+ }
package/src/Idle.ts CHANGED
@@ -5,19 +5,22 @@
5
5
  */
6
6
 
7
7
  import type * as Context from "@typed/context"
8
- import { MutableHashMap, Option } from "effect"
9
8
  import * as Effect from "effect/Effect"
10
- import * as Fiber from "effect/Fiber"
9
+ import * as ExecutionStrategy from "effect/ExecutionStrategy"
10
+ import * as Exit from "effect/Exit"
11
+ import type * as Fiber from "effect/Fiber"
11
12
  import { constant, constVoid } from "effect/Function"
12
13
  import { globalValue } from "effect/GlobalValue"
13
- import type { Hash } from "effect/Hash"
14
14
  import * as Layer from "effect/Layer"
15
15
  import type * as Queue from "effect/Queue"
16
16
  import * as Scheduler from "effect/Scheduler"
17
17
  import * as Scope from "effect/Scope"
18
- import { dequeueIsActive } from "./internal/fx.js"
18
+ import { dequeueIsActive } from "./Fx.js"
19
+ import { withScope } from "./internal/helpers.js"
19
20
  import { cancelIdleCallback, requestIdleCallback } from "./internal/requestIdleCallback.js"
20
21
 
22
+ // TODO: Why is this even in the Fx package?? Where should we put it?
23
+
21
24
  /**
22
25
  * The IdleScheduler is an implementation of Effect's Scheduler interface, which utilizes a priority queue
23
26
  * to order tasks to be run when the event loop is idle through the usage of requestIdleCallback.
@@ -42,7 +45,7 @@ class IdleSchedulerImpl implements IdleScheduler {
42
45
  this.#tasks.scheduleTask(task, priority)
43
46
 
44
47
  // If we're not running yet, schedule the next run
45
- if (!this.#running) {
48
+ if (this.#running === false) {
46
49
  this.#running = true
47
50
  this.scheduleNextRun()
48
51
  }
@@ -62,23 +65,30 @@ class IdleSchedulerImpl implements IdleScheduler {
62
65
  }
63
66
 
64
67
  private scheduleNextRun() {
65
- this.#id = requestIdleCallback((deadline) => this.runTasks(deadline), this.options)
68
+ this.#id = requestIdleCallback((deadline) => this.runTasks(deadline), { timeout: 1000, ...this.options })
66
69
  }
67
70
 
68
71
  private runTasks(deadline: IdleDeadline) {
69
- const buckets = this.#tasks.buckets
72
+ const buckets = this.#tasks.buckets.slice(0)
73
+ this.#tasks.buckets = []
70
74
  const length = buckets.length
71
75
 
72
76
  let i = 0
73
77
  for (; shouldContinue(deadline) && i < length; ++i) {
74
- buckets[i][1].forEach((f) => f())
78
+ const tasks = buckets[i][1].slice()
79
+ tasks.forEach((f) => f())
75
80
  }
76
81
 
77
82
  // Remove all the buckets we were able to complete
78
83
  buckets.splice(0, i)
79
84
 
80
- // If there are more tasks to run, schedule the next run
85
+ // If there are leftover tasks, requeue them
81
86
  if (buckets.length > 0) {
87
+ buckets.forEach(([priority, tasks]) => tasks.forEach((f) => this.#tasks.scheduleTask(f, priority)))
88
+ }
89
+
90
+ // If there are more tasks to run, schedule the next run
91
+ if (this.#tasks.buckets.length > 0) {
82
92
  this.scheduleNextRun()
83
93
  } else {
84
94
  // Otherwise we're done for now
@@ -130,7 +140,7 @@ export const whenIdle = (options?: IdleRequestOptions): Effect.Effect<Scope.Scop
130
140
  * @since 1.18.0
131
141
  */
132
142
  export function shouldContinue(deadline: IdleDeadline): boolean {
133
- return deadline.didTimeout === false && deadline.timeRemaining() > 0
143
+ return deadline.didTimeout || deadline.timeRemaining() > 0
134
144
  }
135
145
 
136
146
  /**
@@ -200,85 +210,89 @@ export function dequeueWhileIdle<I, A, R2, E2, B>(
200
210
  /**
201
211
  * @since 1.18.0
202
212
  */
203
- export interface IdleQueue<I extends Hash> {
213
+ export interface IdleQueue<I> {
204
214
  readonly add: <R>(
205
215
  part: I,
206
216
  task: Effect.Effect<R, never, unknown>
207
217
  ) => Effect.Effect<R | Scope.Scope, never, void>
218
+
219
+ readonly interrupt: Effect.Effect<never, never, void>
208
220
  }
209
221
 
210
222
  /**
211
223
  * @since 1.18.0
212
224
  */
213
- export const makeIdleQueue = <I extends Hash>(
225
+ export const makeIdleQueue = <I>(
214
226
  options?: IdleRequestOptions
215
227
  ): Effect.Effect<Scope.Scope, never, IdleQueue<I>> =>
216
- Effect.scopeWith((scope) => Effect.sync(() => new IdleQueueImpl<I>(scope, options)))
228
+ withScope((scope) => Effect.sync(() => new IdleQueueImpl<I>(scope, options)), ExecutionStrategy.sequential)
217
229
 
218
- class IdleQueueImpl<I extends Hash> implements IdleQueue<I> {
219
- queue = MutableHashMap.empty<I, Effect.Effect<never, never, unknown>>()
230
+ class IdleQueueImpl<I> implements IdleQueue<I> {
231
+ queue = new Map<I, Effect.Effect<never, never, unknown>>()
220
232
  scheduled = false
221
233
 
222
- constructor(readonly scope: Scope.Scope, readonly options?: IdleRequestOptions) {}
234
+ readonly interrupt: Effect.Effect<never, never, void>
235
+ readonly scheduleNextRun: Effect.Effect<never, never, void>
236
+
237
+ constructor(readonly scope: Scope.CloseableScope, readonly options?: IdleRequestOptions) {
238
+ this.interrupt = Effect.fiberIdWith((id) => Scope.close(scope, Exit.interrupt(id)))
239
+
240
+ const run: Effect.Effect<Scope.Scope, never, void> = Effect.flatMap(
241
+ whenIdle(this.options),
242
+ (deadline) =>
243
+ Effect.gen(this, function*(_) {
244
+ const iterator = this.queue[Symbol.iterator]()
245
+
246
+ while (shouldContinue(deadline)) {
247
+ const result = iterator.next()
248
+
249
+ if (result.done) break
250
+ else {
251
+ const [part, task] = result.value
252
+ this.queue.delete(part)
253
+ yield* _(task)
254
+ }
255
+ }
256
+
257
+ if (this.queue.size > 0) {
258
+ yield* _(run)
259
+ } else {
260
+ this.scheduled = false
261
+ }
262
+ })
263
+ )
264
+
265
+ this.scheduleNextRun = Effect.provideService(
266
+ Effect.suspend(() => {
267
+ if (this.queue.size === 0) return Effect.unit
268
+
269
+ this.scheduled = true
270
+
271
+ return withScope(
272
+ (childScope) => Effect.provideService(run, Scope.Scope, childScope),
273
+ ExecutionStrategy.sequential
274
+ )
275
+ }),
276
+ Scope.Scope,
277
+ scope
278
+ )
279
+ }
223
280
 
224
281
  add = <R>(part: I, task: Effect.Effect<R, never, unknown>) =>
225
282
  Effect.contextWithEffect((ctx: Context.Context<R>) => {
226
283
  const provided = Effect.provide(task, ctx)
227
- MutableHashMap.set(this.queue, part, provided)
284
+ this.queue.set(part, provided)
228
285
 
229
286
  return Effect.zipRight(
230
287
  Effect.addFinalizer(() =>
231
288
  Effect.sync(() => {
232
- const currentTask = MutableHashMap.get(this.queue, part)
233
-
234
289
  // If the current task is still the same we'll delete it from the queue
235
- if (Option.isSome(currentTask) && currentTask.value === provided) {
236
- MutableHashMap.remove(this.queue, part)
290
+ if (this.queue.get(part) === provided) {
291
+ this.queue.delete(part)
237
292
  }
238
293
  })
239
294
  ),
240
295
  this.scheduleNextRun
241
296
  )
242
297
  })
243
-
244
- scheduleNextRun = Effect.suspend(() => {
245
- if (MutableHashMap.size(this.queue) === 0) return Effect.unit
246
-
247
- this.scheduled = true
248
-
249
- return Scope.addFinalizer(this.scope, Fiber.interrupt(Effect.runFork(this.run)))
250
- })
251
-
252
- run: Effect.Effect<never, never, void> = Effect.suspend(() =>
253
- Effect.provideService(
254
- Effect.flatMap(
255
- whenIdle(this.options),
256
- (deadline) =>
257
- Effect.gen(this, function*(_) {
258
- const iterator = this.queue[Symbol.iterator]()
259
-
260
- while (shouldContinue(deadline)) {
261
- const result = iterator.next()
262
-
263
- if (result.done) break
264
- else {
265
- const [part, task] = result.value
266
- MutableHashMap.remove(this.queue, part)
267
- yield* _(task)
268
- }
269
- }
270
-
271
- if (MutableHashMap.size(this.queue) > 0) {
272
- return this.run
273
- }
274
-
275
- this.scheduled = false
276
-
277
- return Effect.unit
278
- })
279
- ),
280
- Scope.Scope,
281
- this.scope
282
- )
283
- )
284
298
  }
package/src/Match.ts CHANGED
@@ -2,20 +2,29 @@
2
2
  * @since 1.18.0
3
3
  */
4
4
 
5
- import { Effect, Exit } from "effect"
6
5
  import * as Cause from "effect/Cause"
7
6
  import * as Chunk from "effect/Chunk"
7
+ import * as Effect from "effect/Effect"
8
+ import * as ExecutionStrategy from "effect/ExecutionStrategy"
9
+ import * as Exit from "effect/Exit"
10
+ import * as Fiber from "effect/Fiber"
8
11
  import { identity } from "effect/Function"
12
+ import * as MutableRef from "effect/MutableRef"
9
13
  import * as Option from "effect/Option"
10
14
  import { isNonEmptyReadonlyArray, reduce } from "effect/ReadonlyArray"
15
+ import * as Scope from "effect/Scope"
11
16
  import * as Fx from "./Fx.js"
12
17
  import type { Guard } from "./Guard.js"
18
+ import { withScopedFork } from "./internal/helpers.js"
19
+ import { FxBase } from "./internal/protos.js"
13
20
  import * as RefSubject from "./RefSubject.js"
21
+ import * as Sink from "./Sink.js"
22
+ import * as Subject from "./Subject.js"
14
23
 
15
24
  /**
16
25
  * @since 1.18.0
17
26
  */
18
- export const MatcherTypeId: unique symbol = Symbol.for("./Matcher.js")
27
+ export const MatcherTypeId: unique symbol = Symbol.for("@typed/fx/Matcher")
19
28
  /**
20
29
  * @since 1.18.0
21
30
  */
@@ -29,23 +38,25 @@ export interface TypeMatcher<R, E, I, O> {
29
38
 
30
39
  readonly [MatcherTypeId]: Matcher.Variance<R, E, I, O>
31
40
 
32
- readonly when: <R2, E2, A, R3 = never, E3 = never, B = never>(
41
+ readonly when: <R2 = never, E2 = never, A = never, R3 = never, E3 = never, B = never>(
33
42
  guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
34
- onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.FxInput<R3, E3, B>
43
+ onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
35
44
  ) => TypeMatcher<R | R2 | R3, E | E2 | E3, I, O | B>
36
45
 
37
- readonly to: <R2, E2, A, B>(
46
+ readonly to: <R2 = never, E2 = never, A = never, B = never>(
38
47
  guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
39
48
  onMatch: B
40
49
  ) => TypeMatcher<R | R2, E | E2, I, O | B>
41
50
 
42
- readonly run: <R2 = never, E2 = never>(input: Fx.FxInput<R2, E2, I>) => Fx.Fx<R | R2, E | E2, Option.Option<O>>
51
+ readonly run: <R2 = never, E2 = never>(
52
+ input: Fx.Fx<R2, E2, I>
53
+ ) => Fx.Fx<R | R2 | Scope.Scope, E | E2, Option.Option<O>>
43
54
  }
44
55
 
45
56
  /**
46
57
  * @since 1.18.0
47
58
  */
48
- export interface ValueMatcher<R, E, I, O> {
59
+ export interface ValueMatcher<R, E, I, O> extends Fx.Fx<R | Scope.Scope, E, Option.Option<O>> {
49
60
  readonly _tag: "ValueMatcher"
50
61
 
51
62
  readonly [MatcherTypeId]: Matcher.Variance<R, E, I, O>
@@ -54,7 +65,7 @@ export interface ValueMatcher<R, E, I, O> {
54
65
 
55
66
  readonly when: <R2, E2, A, R3 = never, E3 = never, B = never>(
56
67
  guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
57
- onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.FxInput<R3, E3, B>
68
+ onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
58
69
  ) => ValueMatcher<R | R2 | R3, E | E2 | E3, I, O | B>
59
70
 
60
71
  readonly to: <R2, E2, A, B>(
@@ -62,11 +73,9 @@ export interface ValueMatcher<R, E, I, O> {
62
73
  onMatch: B
63
74
  ) => ValueMatcher<R | R2, E | E2, I, O | B>
64
75
 
65
- readonly run: Fx.Fx<R, E, Option.Option<O>>
66
-
67
76
  readonly getOrElse: <R2 = never, E2 = never, B = never>(
68
- f: () => Fx.FxInput<R2, E2, B>
69
- ) => Fx.Fx<R | R2, E | E2, O | B>
77
+ f: () => Fx.Fx<R2, E2, B>
78
+ ) => Fx.Fx<R | R2 | Scope.Scope, E | E2, O | B>
70
79
  }
71
80
 
72
81
  /**
@@ -93,8 +102,8 @@ export const type = <I>(): TypeMatcher<never, never, I, never> =>
93
102
  /**
94
103
  * @since 1.18.0
95
104
  */
96
- export const value = <R, E, I>(input: Fx.FxInput<R, E, I>): ValueMatcher<R, E, I, never> =>
97
- new ValueMatcherImpl(Fx.from(input), type<I>())
105
+ export const value = <R, E, I>(input: Fx.Fx<R, E, I>): ValueMatcher<R, E, I, never> =>
106
+ new ValueMatcherImpl(input, type<I>())
98
107
 
99
108
  // Internals
100
109
 
@@ -108,7 +117,16 @@ const variance: Matcher.Variance<any, any, any, any> = {
108
117
  class When<R, E, I, A, O> {
109
118
  constructor(
110
119
  readonly guard: (input: I) => Effect.Effect<R, E, Option.Option<A>>,
111
- readonly onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.FxInput<R, E, O>
120
+ readonly onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R, E, O>
121
+ ) {}
122
+ }
123
+
124
+ class Matched<R, E, I, A, O> {
125
+ constructor(
126
+ readonly when: When<R, E, I, A, O>,
127
+ readonly ref: RefSubject.RefSubject<never, never, A>,
128
+ readonly fiber: Fiber.Fiber<never, unknown>,
129
+ readonly interrupt: Effect.Effect<never, never, void>
112
130
  ) {}
113
131
  }
114
132
 
@@ -123,7 +141,7 @@ class TypeMatcherImpl<R, E, I, O> implements TypeMatcher<R, E, I, O> {
123
141
 
124
142
  when<R2, E2, A, R3 = never, E3 = never, B = never>(
125
143
  guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
126
- onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.FxInput<R3, E3, B>
144
+ onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
127
145
  ): TypeMatcher<R | R2 | R3, E | E2 | E3, I, O | B> {
128
146
  return new TypeMatcherImpl<R | R2 | R3, E | E2 | E3, I, O | B>(
129
147
  Chunk.append(this.cases, new When<R2 | R3, E2 | E3, I, A, B>(getGuard(guard), onMatch))
@@ -134,112 +152,153 @@ class TypeMatcherImpl<R, E, I, O> implements TypeMatcher<R, E, I, O> {
134
152
  guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
135
153
  onMatch: B
136
154
  ): TypeMatcher<R | R2, E | E2, I, O | B> {
137
- return this.when(guard, () => Effect.succeed(onMatch))
155
+ return this.when(guard, () => Fx.succeed(onMatch))
138
156
  }
139
157
 
140
- run<R2, E2>(input: Fx.FxInput<R2, E2, I>): Fx.Fx<R | R2, E | E2, Option.Option<O>> {
158
+ run<R2, E2>(input: Fx.Fx<R2, E2, I>): Fx.Fx<R | R2 | Scope.Scope, E | E2, Option.Option<O>> {
141
159
  const { cases } = this
142
160
 
143
- return Fx.suspend(() => {
144
- const refSubjects = new WeakMap<When<any, any, I, any, any>, RefSubject.RefSubject<never, never, any>>()
145
-
146
- const getRefSubject = (_case: When<any, any, I, any, any>, value: any) =>
147
- Effect.gen(function*(_) {
148
- let refSubject = refSubjects.get(_case)
149
-
150
- if (refSubject) {
151
- yield* _(refSubject.set(value))
152
- } else {
153
- refSubject = yield* _(RefSubject.of(value))
154
- }
161
+ return Fx.make<R | R2 | Scope.Scope, E | E2, Option.Option<O>>((sink) =>
162
+ withScopedFork(
163
+ (fork, parentScope) => {
164
+ let previous: Matched<any, any, I, any, O>
165
+
166
+ const onMatch = <A>(
167
+ when: When<R | R2 | Scope.Scope, E | E2, I, A, O>,
168
+ value: A
169
+ ) =>
170
+ Effect.gen(function*(_) {
171
+ if (previous?.when === when) {
172
+ yield* _(RefSubject.set(previous.ref, value))
173
+ } else {
174
+ // Interrupt any previous resources
175
+ if (previous !== undefined) {
176
+ yield* _(previous.interrupt)
177
+ }
155
178
 
156
- return refSubject
157
- })
179
+ // RefSubject to pass along to our matching function
180
+ const refSubject = yield* _(RefSubject.of(value))
181
+
182
+ // Track if the case is ended
183
+ const hasEnded = MutableRef.make(false)
184
+ // Used to signal when the case has ended
185
+ const endSignal = Subject.unsafeMake<never, void>(0)
186
+
187
+ // Run the case
188
+ const fiber = yield* _(
189
+ fork(
190
+ Fx.mergeFirst(when.onMatch(refSubject), Fx.tap(endSignal, () => MutableRef.set(hasEnded, true)))
191
+ .run(
192
+ Sink.make(
193
+ (cause) =>
194
+ MutableRef.get(hasEnded) || Cause.isInterruptedOnly(cause)
195
+ ? Effect.unit
196
+ : sink.onFailure(cause),
197
+ (value) => MutableRef.get(hasEnded) ? Effect.unit : sink.onSuccess(Option.some(value))
198
+ )
199
+ )
200
+ )
201
+ )
202
+
203
+ previous = new Matched(
204
+ when,
205
+ refSubject,
206
+ fiber,
207
+ // Interrupt the case when the endSignal first to disallow emissions of values, but asynchonously
208
+ // interrupt the fiber without blocking the next match to take over.
209
+ Effect.all([endSignal.onSuccess(undefined), Fiber.interruptFork(fiber)], { discard: true })
210
+ )
211
+ }
212
+ }).pipe(Effect.provideService(Scope.Scope, parentScope))
158
213
 
159
- let previous: When<any, any, I, any, any>
214
+ function matchWhen<A>(input: I, when: When<R | R2 | Scope.Scope, E | E2, I, A, O>) {
215
+ return Effect.gen(function*(_) {
216
+ const matched = yield* _(when.guard(input))
160
217
 
161
- return Fx.from(input).pipe(
162
- Fx.switchMap((input) =>
163
- Effect.gen(function*(_) {
164
- // Allow failures to be accumulated, such that errors do not break the overall match
165
- // and additional matchers can be attempted against first
166
- const causes: Array<Cause.Cause<E>> = []
218
+ if (Option.isSome(matched)) {
219
+ yield* _(onMatch(when, matched.value))
167
220
 
168
- // If there's a previous match, attempt it first
169
- if (previous) {
170
- const matchedExit = yield* _(previous.guard(input), Effect.exit)
221
+ return true
222
+ } else {
223
+ return false
224
+ }
225
+ })
226
+ }
171
227
 
172
- if (Exit.isSuccess(matchedExit)) {
173
- const matched = matchedExit.value
228
+ function matchInput(input: I) {
229
+ return Effect.gen(function*(_) {
230
+ // Allow failures to be accumulated, such that errors do not break the overall match
231
+ // and additional matchers can be attempted against first
232
+ const causes: Array<Cause.Cause<E | E2>> = []
174
233
 
175
- if (Option.isSome(matched)) {
176
- const refSubject = yield* _(getRefSubject(previous, matched.value))
234
+ // If there's a previous match, attempt it first to avoid re-testing all cases in order
235
+ if (previous !== undefined) {
236
+ const matchedExit = yield* _(matchWhen(input, previous.when), Effect.exit)
177
237
 
178
- return Option.some([previous, refSubject] as const)
238
+ if (Exit.isFailure(matchedExit)) {
239
+ causes.push(matchedExit.cause)
240
+ } else if (matchedExit.value) {
241
+ return
179
242
  }
180
- } else {
181
- causes.push(matchedExit.cause)
182
243
  }
183
- }
184
-
185
- for (const _case of cases) {
186
- // Don't test this case twice
187
- if (_case === previous) continue
188
-
189
- const matchedExit = yield* _(_case.guard(input), Effect.exit)
190
244
 
191
- if (Exit.isSuccess(matchedExit)) {
192
- const matched = matchedExit.value
245
+ for (const when of cases) {
246
+ // Don't test this case twice
247
+ if (when === previous?.when) continue
193
248
 
194
- if (Option.isSome(matched)) {
195
- const refSubject = yield* _(getRefSubject(_case, matched.value))
196
- previous = _case
249
+ const matchedExit = yield* _(matchWhen(input, when), Effect.exit)
197
250
 
198
- return Option.some([_case, refSubject] as const)
251
+ if (Exit.isFailure(matchedExit)) {
252
+ causes.push(matchedExit.cause)
253
+ } else if (matchedExit.value) {
254
+ return
199
255
  }
256
+ }
257
+
258
+ if (isNonEmptyReadonlyArray(causes)) {
259
+ const [first, ...rest] = causes
260
+ yield* _(sink.onFailure(reduce(rest, first, Cause.sequential)))
200
261
  } else {
201
- causes.push(matchedExit.cause)
262
+ if (previous !== undefined) {
263
+ yield* _(previous.interrupt)
264
+ }
265
+
266
+ yield* _(sink.onSuccess(Option.none()))
202
267
  }
203
- }
204
-
205
- if (isNonEmptyReadonlyArray(causes)) {
206
- const [first, ...rest] = causes
207
-
208
- return yield* _(Effect.failCause(reduce(rest, first, Cause.sequential)))
209
- } else {
210
- return Option.none()
211
- }
212
- })
213
- ),
214
- // Avoid restarting based on the Case that was matched to keep a peristent
215
- // workflow for matcher that has its input values change
216
- Fx.skipRepeatsWith(Option.getEquivalence(([a], [b]) => a === b)),
217
- Fx.switchMap(
218
- Option.match({
219
- onNone: () => Effect.succeedNone,
220
- onSome: ([when, ref]) => {
221
- return Fx.map(Fx.from(when.onMatch(ref)), Option.some)
222
- }
223
- })
224
- )
268
+ })
269
+ }
270
+
271
+ return Fx.skipRepeats(input).run(Sink.make(
272
+ sink.onFailure,
273
+ matchInput
274
+ ))
275
+ },
276
+ ExecutionStrategy.sequential
225
277
  )
226
- })
278
+ )
227
279
  }
228
280
  }
229
281
 
230
- class ValueMatcherImpl<R, E, I, O> implements ValueMatcher<R, E, I, O> {
282
+ class ValueMatcherImpl<R, E, I, O> extends FxBase<R | Scope.Scope, E, Option.Option<O>>
283
+ implements ValueMatcher<R, E, I, O>
284
+ {
231
285
  readonly _tag = "ValueMatcher"
232
286
  readonly [MatcherTypeId]: ValueMatcher<R, E, I, O>[MatcherTypeId] = variance
233
287
 
234
288
  constructor(readonly value: Fx.Fx<R, E, I>, readonly matcher: TypeMatcher<R, E, I, O>) {
289
+ super()
235
290
  this.when = this.when.bind(this)
236
291
  this.to = this.to.bind(this)
237
292
  this.getOrElse = this.getOrElse.bind(this)
238
293
  }
239
294
 
295
+ run<R2>(sink: Sink.Sink<R2, E, Option.Option<O>>) {
296
+ return this.matcher.run(this.value).run(sink)
297
+ }
298
+
240
299
  when<R2, E2, A, R3 = never, E3 = never, B = never>(
241
300
  guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
242
- onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.FxInput<R3, E3, B>
301
+ onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
243
302
  ): ValueMatcher<R | R2 | R3, E | E2 | E3, I, O | B> {
244
303
  return new ValueMatcherImpl<R | R2 | R3, E | E2 | E3, I, O | B>(
245
304
  this.value,
@@ -251,13 +310,10 @@ class ValueMatcherImpl<R, E, I, O> implements ValueMatcher<R, E, I, O> {
251
310
  guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
252
311
  onMatch: B
253
312
  ): ValueMatcher<R | R2, E | E2, I, O | B> {
254
- return this.when(guard, () => Effect.succeed(onMatch))
313
+ return this.when(guard, () => Fx.succeed(onMatch))
255
314
  }
256
315
 
257
- run: ValueMatcher<R, E, I, O>["run"] = Fx.suspend(() => this.matcher.run(this.value))
258
-
259
- getOrElse: ValueMatcher<R, E, I, O>["getOrElse"] = (f) =>
260
- Fx.suspend(() => Fx.getOrElse(this.matcher.run(this.value), f))
316
+ getOrElse: ValueMatcher<R, E, I, O>["getOrElse"] = (f) => Fx.getOrElse(this.matcher.run(this.value), f)
261
317
  }
262
318
 
263
319
  /**
package/src/Pull.ts CHANGED
@@ -13,7 +13,7 @@ import * as Either from "effect/Either"
13
13
  import { dual } from "effect/Function"
14
14
  import * as Option from "effect/Option"
15
15
  import type * as Schedule from "effect/Schedule"
16
- import type { WithContext } from "./Sink.js"
16
+ import type { Sink } from "./Sink.js"
17
17
 
18
18
  /**
19
19
  * An Effect which can be used to pull values of a Stream.
@@ -24,7 +24,7 @@ export interface Pull<R, E, A> extends Effect.Effect<R, Option.Option<E>, Chunk.
24
24
  function schedulePull<R, E, A, R2, R3>(
25
25
  pull: Pull<R, E, A>,
26
26
  f: (effect: Effect.Effect<R | R3, never, unknown>) => Effect.Effect<R2, never, unknown>,
27
- sink: WithContext<R3, E, A>
27
+ sink: Sink<R3, E, A>
28
28
  ): Effect.Effect<R2, never, void> {
29
29
  return Effect.asyncEffect((resume) =>
30
30
  pull.pipe(
@@ -55,18 +55,18 @@ function schedulePull<R, E, A, R2, R3>(
55
55
  export const schedule: {
56
56
  <R2, R3, E, A>(
57
57
  schedule: Schedule.Schedule<R2, unknown, unknown>,
58
- sink: WithContext<R3, E, A>
58
+ sink: Sink<R3, E, A>
59
59
  ): <R>(pull: Pull<R, E, A>) => Effect.Effect<R | R2 | R3, never, unknown>
60
60
 
61
61
  <R, E, A, R2, R3>(
62
62
  pull: Pull<R, E, A>,
63
63
  schedule: Schedule.Schedule<R2, unknown, unknown>,
64
- sink: WithContext<R3, E, A>
64
+ sink: Sink<R3, E, A>
65
65
  ): Effect.Effect<R | R2 | R3, never, unknown>
66
66
  } = dual(3, function schedule<R, E, A, R2, R3>(
67
67
  pull: Pull<R, E, A>,
68
68
  schedule: Schedule.Schedule<R2, unknown, unknown>,
69
- sink: WithContext<R3, E, A>
69
+ sink: Sink<R3, E, A>
70
70
  ): Effect.Effect<R | R2 | R3, never, void> {
71
71
  return schedulePull(pull, Effect.schedule(schedule), sink)
72
72
  })
@@ -79,18 +79,18 @@ export const schedule: {
79
79
  export const repeat: {
80
80
  <R2, R3, E, A>(
81
81
  schedule: Schedule.Schedule<R2, unknown, unknown>,
82
- sink: WithContext<R3, E, A>
82
+ sink: Sink<R3, E, A>
83
83
  ): <R>(pull: Pull<R, E, A>) => Effect.Effect<R | R2 | R3, never, unknown>
84
84
 
85
85
  <R, E, A, R2, R3>(
86
86
  pull: Pull<R, E, A>,
87
87
  schedule: Schedule.Schedule<R2, unknown, unknown>,
88
- sink: WithContext<R3, E, A>
88
+ sink: Sink<R3, E, A>
89
89
  ): Effect.Effect<R | R2 | R3, never, unknown>
90
90
  } = dual(3, function repeat<R, E, A, R2, R3>(
91
91
  pull: Pull<R, E, A>,
92
92
  schedule: Schedule.Schedule<R2, unknown, unknown>,
93
- sink: WithContext<R3, E, A>
93
+ sink: Sink<R3, E, A>
94
94
  ): Effect.Effect<R | R2 | R3, never, void> {
95
95
  return schedulePull(pull, Effect.repeat(schedule), sink)
96
96
  })