@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/Sink.ts CHANGED
@@ -1,115 +1,81 @@
1
1
  /**
2
- * Sink is a data structure that represents a place to send failures and successes
3
- * over time in an effectful manner.
4
- * @since 1.18.0
2
+ * Sink is a data structure which can be used to consume values from a stream.
3
+ * @since 1.20.0
5
4
  */
6
5
 
7
- import type { Context } from "@typed/context"
6
+ import * as C from "@typed/context"
7
+ import type { Predicate, Tracer } from "effect"
8
8
  import * as Cause from "effect/Cause"
9
9
  import * as Clock from "effect/Clock"
10
10
  import * as Effect from "effect/Effect"
11
- import * as Either from "effect/Either"
12
11
  import { dual } from "effect/Function"
13
- import type * as Tracer from "effect/Tracer"
14
-
15
- /**
16
- * Sink is a data structure that represents a place to send failures and successes
17
- * over time in an effectful manner.
18
- * @since 1.18.0
19
- * @category models
20
- */
21
- export interface Sink<E, A> extends WithContext<never, E, A> {}
12
+ import * as Layer from "effect/Layer"
13
+ import * as Option from "effect/Option"
14
+ import { type Bounds } from "./internal/bounds.js"
22
15
 
23
16
  /**
24
- * Construct a Sink that can be used to handle failures and successes.
25
- * @since 1.18.0
26
- * @category constructors
17
+ * Sink is a data structure which can be used to consume values from a stream.
18
+ * @since 1.20.0
27
19
  */
28
- export function Sink<E, A>(
29
- onFailure: (cause: Cause.Cause<E>) => Effect.Effect<never, never, unknown>,
30
- onSuccess: (a: A) => Effect.Effect<never, never, unknown>
31
- ): Sink<E, A> {
32
- return {
33
- onFailure,
34
- onSuccess
35
- }
20
+ export interface Sink<out R, in E, in A> {
21
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown>
22
+ onSuccess(value: A): Effect.Effect<R, never, unknown>
36
23
  }
37
24
 
38
25
  /**
39
- * @since 1.18.0
26
+ * @since 1.20.0
40
27
  */
41
28
  export namespace Sink {
42
29
  /**
43
- * Extract the Error type from a Sink
44
- * @since 1.18.0
30
+ * @since 1.20.0
31
+ */
32
+ export type Context<T> = T extends Sink<infer R, infer _E, infer _A> ? R : never
33
+
34
+ /**
35
+ * @since 1.20.0
45
36
  */
46
- export type Error<T> = T extends Sink<infer E, any> ? E : never
37
+ export type Error<T> = T extends Sink<infer _R, infer E, infer _A> ? E : never
47
38
 
48
39
  /**
49
- * Extract the Success type from a Sink
50
- * @since 1.18.0
40
+ * @since 1.20.0
51
41
  */
52
- export type Success<T> = T extends Sink<any, infer A> ? A : never
42
+ export type Success<T> = T extends Sink<infer _R, infer _E, infer A> ? A : never
43
+
44
+ /**
45
+ * @since 1.20.0
46
+ */
47
+ export interface Tagged<I, E, A> extends Sink<I, E, A> {
48
+ readonly tag: C.Tagged<I, Sink<never, E, A>>
49
+ readonly make: <R>(sink: Sink<R, E, A>) => Layer.Layer<R, never, I>
50
+ }
53
51
  }
54
52
 
55
53
  /**
56
- * A Sink that can be used to handle failures and successes with a Context.
57
- * @since 1.18.0
58
- * @category models
54
+ * @since 1.20.0
59
55
  */
60
- export interface WithContext<R, E, A> {
61
- readonly onFailure: (cause: Cause.Cause<E>) => Effect.Effect<R, never, unknown>
62
- readonly onSuccess: (a: A) => Effect.Effect<R, never, unknown>
63
- }
56
+ export type Context<T> = Sink.Context<T>
64
57
 
65
58
  /**
66
- * Construct a Sink that can be used to handle failures and successes with a Context.
67
- * @since 1.18.0
68
- * @category constructors
59
+ * @since 1.20.0
69
60
  */
70
- export function WithContext<R, E, A, R2>(
71
- onFailure: (cause: Cause.Cause<E>) => Effect.Effect<R, never, unknown>,
72
- onSuccess: (a: A) => Effect.Effect<R2, never, unknown>
73
- ): WithContext<R | R2, E, A> {
74
- return {
75
- onFailure,
76
- onSuccess
77
- }
78
- }
61
+ export type Error<T> = Sink.Error<T>
79
62
 
80
63
  /**
81
- * @since 1.18.0
64
+ * @since 1.20.0
82
65
  */
83
- export namespace WithContext {
84
- /**
85
- * Extract the Context type from a Sink
86
- * @since 1.18.0
87
- */
88
- export type Context<T> = T extends WithContext<infer R, any, any> ? R : never
89
-
90
- /**
91
- * Extract the Error type from a Sink
92
- * @since 1.18.0
93
- */
94
- export type Error<T> = T extends WithContext<any, infer E, any> ? E : never
95
-
96
- /**
97
- * Extract the Success type from a Sink
98
- * @since 1.18.0
99
- */
100
- export type Success<T> = T extends WithContext<any, any, infer A> ? A : never
101
- }
66
+ export type Success<T> = Sink.Success<T>
102
67
 
103
68
  /**
104
- * Provide a Context to a Sink
105
- * @since 1.18.0
106
- * @category context
69
+ * @since 1.20.0
107
70
  */
108
- export function provide<R, E, A>(sink: WithContext<R, E, A>, ctx: Context<R>): Sink<E, A> {
109
- return Sink(
110
- (cause) => Effect.provide(sink.onFailure(cause), ctx),
111
- (a) => Effect.provide(sink.onSuccess(a), ctx)
112
- )
71
+ export function make<E, R, A, R2>(
72
+ onFailure: (cause: Cause.Cause<E>) => Effect.Effect<R, never, unknown>,
73
+ onSuccess: (value: A) => Effect.Effect<R2, never, unknown>
74
+ ): Sink<R | R2, E, A> {
75
+ return {
76
+ onFailure,
77
+ onSuccess
78
+ }
113
79
  }
114
80
 
115
81
  /**
@@ -118,137 +84,858 @@ export function provide<R, E, A>(sink: WithContext<R, E, A>, ctx: Context<R>): S
118
84
  * @since 1.18.0
119
85
  * @category models
120
86
  */
121
- export interface WithEarlyExit<E, A> extends Sink<E, A> {
87
+ export interface WithEarlyExit<R, E, A> extends Sink<R, E, A> {
122
88
  readonly earlyExit: Effect.Effect<never, never, void>
123
89
  }
124
90
 
91
+ /**
92
+ * @since 1.20.0
93
+ */
94
+ export function withEarlyExit<R, E, A, R2, B>(
95
+ sink: Sink<R, E, A>,
96
+ f: (sink: WithEarlyExit<R, E, A>) => Effect.Effect<R2, E, B>
97
+ ): Effect.Effect<R | R2, never, void> {
98
+ return Effect.asyncEffect<never, never, void, R | R2, never, void>((resume) => {
99
+ const earlyExit: WithEarlyExit<R, E, A> = {
100
+ ...sink,
101
+ earlyExit: Effect.sync(() => resume(Effect.unit))
102
+ }
103
+
104
+ return Effect.matchCauseEffect(f(earlyExit), {
105
+ onFailure: (cause) => sink.onFailure(cause),
106
+ onSuccess: () => earlyExit.earlyExit
107
+ })
108
+ })
109
+ }
110
+
125
111
  /**
126
112
  * Transform the input value of a Sink.
127
113
  * @since 1.18.0
128
114
  * @category combinators
129
115
  */
130
116
  export const map: {
131
- <B, A>(f: (b: B) => A): <R, E>(sink: WithContext<R, E, A>) => WithContext<R, E, B>
132
- <R, E, A, B>(sink: WithContext<R, E, A>, f: (b: B) => A): WithContext<R, E, B>
117
+ <B, A>(f: (b: B) => A): <R, E>(sink: Sink<R, E, A>) => Sink<R, E, B>
118
+ <R, E, A, B>(sink: Sink<R, E, A>, f: (b: B) => A): Sink<R, E, B>
133
119
  } = dual(2, function map<R, E, A, B>(
134
- sink: WithContext<R, E, A>,
120
+ sink: Sink<R, E, A>,
135
121
  f: (b: B) => A
136
- ): WithContext<R, E, B> {
137
- return WithContext(
138
- sink.onFailure,
139
- (a) => sink.onSuccess(f(a))
140
- )
122
+ ): Sink<R, E, B> {
123
+ return new MapSink(sink, f)
141
124
  })
142
125
 
126
+ class MapSink<R, E, A, B> implements Sink<R, E, A> {
127
+ constructor(
128
+ readonly sink: Sink<R, E, B>,
129
+ readonly f: (a: A) => B
130
+ ) {
131
+ this.onFailure = this.onFailure.bind(this)
132
+ this.onSuccess = this.onSuccess.bind(this)
133
+ }
134
+
135
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
136
+ return this.sink.onFailure(cause)
137
+ }
138
+
139
+ onSuccess(value: A) {
140
+ return this.sink.onSuccess(this.f(value))
141
+ }
142
+ }
143
+
143
144
  /**
144
- * Transform the input value of a Sink using an Effect.
145
- * @since 1.18.0
146
- * @category combinators
145
+ * @since 1.20.0
146
+ */
147
+ export function filter<R, E, A>(sink: Sink<R, E, A>, predicate: Predicate.Predicate<A>): Sink<R, E, A> {
148
+ return new FilterSink(sink, predicate)
149
+ }
150
+
151
+ class FilterSink<R, E, A> implements Sink<R, E, A> {
152
+ constructor(
153
+ readonly sink: Sink<R, E, A>,
154
+ readonly predicate: Predicate.Predicate<A>
155
+ ) {
156
+ this.onFailure = this.onFailure.bind(this)
157
+ this.onSuccess = this.onSuccess.bind(this)
158
+ }
159
+
160
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
161
+ return this.sink.onFailure(cause)
162
+ }
163
+
164
+ onSuccess(value: A) {
165
+ if (this.predicate(value)) return this.sink.onSuccess(value)
166
+ else return Effect.unit
167
+ }
168
+ }
169
+
170
+ /**
171
+ * @since 1.20.0
172
+ */
173
+ export function filterMap<R, E, A, B>(sink: Sink<R, E, B>, f: (a: A) => Option.Option<B>): Sink<R, E, A> {
174
+ return new FilterMapSink(sink, f)
175
+ }
176
+
177
+ class FilterMapSink<R, E, A, B> implements Sink<R, E, A> {
178
+ constructor(
179
+ readonly sink: Sink<R, E, B>,
180
+ readonly f: (a: A) => Option.Option<B>
181
+ ) {
182
+ this.onFailure = this.onFailure.bind(this)
183
+ this.onSuccess = this.onSuccess.bind(this)
184
+ }
185
+
186
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
187
+ return this.sink.onFailure(cause)
188
+ }
189
+
190
+ onSuccess(value: A) {
191
+ const option = this.f(value)
192
+ if (Option.isSome(option)) return this.sink.onSuccess(option.value)
193
+ else return Effect.unit
194
+ }
195
+ }
196
+
197
+ /**
198
+ * @since 1.20.0
147
199
  */
148
200
  export const mapEffect: {
149
- <B, R2, E, A>(f: (b: B) => Effect.Effect<R2, E, A>): <R>(sink: WithContext<R, E, A>) => WithContext<R | R2, E, B>
150
- <R, E, A, R2, B>(sink: WithContext<R, E, A>, f: (b: B) => Effect.Effect<R2, E, A>): WithContext<R | R2, E, B>
151
- } = dual(2, function mapEffect<R, E, A, R2, B>(
152
- sink: WithContext<R, E, A>,
153
- f: (b: B) => Effect.Effect<R2, E, A>
154
- ): WithContext<R | R2, E, B> {
155
- return WithContext(
156
- sink.onFailure,
157
- (b) => Effect.matchCauseEffect(f(b), sink)
158
- )
201
+ <B, R2, E2, A>(f: (b: B) => Effect.Effect<R2, E2, A>): <R, E>(
202
+ sink: Sink<R, E | E2, A>
203
+ ) => Sink<R | R2, E | E2, B>
204
+ <R, E, A, R2, E2, B>(sink: Sink<R, E | E2, A>, f: (b: B) => Effect.Effect<R2, E2, A>): Sink<R | R2, E | E2, B>
205
+ } = dual(2, function mapEffect<R, E, A, R2, E2, B>(
206
+ sink: Sink<R, E | E2, A>,
207
+ f: (b: B) => Effect.Effect<R2, E2, A>
208
+ ): Sink<R | R2, E | E2, B> {
209
+ return new MapEffectSink(sink, f)
159
210
  })
160
211
 
212
+ class MapEffectSink<R, E, A, R2, E2, B> implements Sink<R | R2, E2, B> {
213
+ constructor(
214
+ readonly sink: Sink<R, E | E2, A>,
215
+ readonly f: (b: B) => Effect.Effect<R2, E2, A>
216
+ ) {
217
+ this.onFailure = this.onFailure.bind(this)
218
+ this.onSuccess = this.onSuccess.bind(this)
219
+ }
220
+
221
+ onFailure(cause: Cause.Cause<E2>): Effect.Effect<R | R2, never, unknown> {
222
+ return this.sink.onFailure(cause)
223
+ }
224
+
225
+ onSuccess(value: B) {
226
+ return Effect.matchCauseEffect(this.f(value), this.sink)
227
+ }
228
+ }
229
+
161
230
  /**
162
- * Transform the input Cause of a Sink.
163
- * @since 1.18.0
164
- * @category combinators
231
+ * @since 1.20.0
165
232
  */
166
- export const mapErrorCause: {
167
- <E2, E, A>(f: (e: Cause.Cause<E2>) => Cause.Cause<E>): <R>(sink: WithContext<R, E, A>) => WithContext<R, E2, A>
168
- <R, E, A, E2>(sink: WithContext<R, E, A>, f: (e: Cause.Cause<E2>) => Cause.Cause<E>): WithContext<R, E2, A>
169
- } = dual(2, function mapErrorCause<E, A, E2>(
170
- sink: Sink<E, A>,
171
- f: (e: Cause.Cause<E2>) => Cause.Cause<E>
172
- ): Sink<E2, A> {
173
- return Sink(
174
- (cause) => sink.onFailure(f(cause)),
175
- sink.onSuccess
176
- )
233
+ export const filterMapEffect: {
234
+ <B, R2, E2, A>(f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>): <R, E>(
235
+ sink: Sink<R, E | E2, A>
236
+ ) => Sink<R | R2, E | E2, B>
237
+
238
+ <R, E, A, R2, E2, B>(
239
+ sink: Sink<R, E | E2, A>,
240
+ f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>
241
+ ): Sink<R | R2, E | E2, B>
242
+ } = dual(2, function filterMapEffect<R, E, A, R2, E2, B>(
243
+ sink: Sink<R, E | E2, A>,
244
+ f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>
245
+ ): Sink<R | R2, E | E2, B> {
246
+ return new FilterMapEffectSink(sink, f)
177
247
  })
178
248
 
249
+ class FilterMapEffectSink<R, E, A, R2, E2, B> implements Sink<R | R2, E2, B> {
250
+ constructor(
251
+ readonly sink: Sink<R, E | E2, A>,
252
+ readonly f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>
253
+ ) {
254
+ this.onFailure = this.onFailure.bind(this)
255
+ this.onSuccess = this.onSuccess.bind(this)
256
+ }
257
+
258
+ onFailure(cause: Cause.Cause<E2>): Effect.Effect<R | R2, never, unknown> {
259
+ return this.sink.onFailure(cause)
260
+ }
261
+
262
+ onSuccess(value: B) {
263
+ return Effect.matchCauseEffect(this.f(value), {
264
+ onFailure: (cause) => this.sink.onFailure(cause),
265
+ onSuccess: (option) => {
266
+ if (Option.isSome(option)) return this.sink.onSuccess(option.value)
267
+ else return Effect.unit
268
+ }
269
+ })
270
+ }
271
+ }
272
+
179
273
  /**
180
- * Transform the input Cause of a Sink using an Effect.
181
- * @since 1.18.0
182
- * @category combinators
274
+ * @since 1.20.0
183
275
  */
184
- export const mapErrorCauseEffect: {
185
- <E2, R2, E, A>(
186
- f: (e: Cause.Cause<E2>) => Effect.Effect<R2, E, Cause.Cause<E>>
187
- ): <R>(sink: WithContext<R, E, A>) => WithContext<R | R2, E2, A>
276
+ export const filterEffect: {
277
+ <A, R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>): <R, E>(
278
+ sink: Sink<R, E | E2, A>
279
+ ) => Sink<R | R2, E | E2, A>
280
+ <R, E, A>(sink: Sink<R, E, A>, f: (a: A) => Effect.Effect<R, E, boolean>): Sink<R, E, A>
281
+ } = dual(2, function filterEffect<R, E, A, R2>(
282
+ sink: Sink<R, E, A>,
283
+ f: (a: A) => Effect.Effect<R2, E, boolean>
284
+ ): Sink<R | R2, E, A> {
285
+ return new FilterEffectSink<R | R2, E, A>(sink, f)
286
+ })
287
+
288
+ class FilterEffectSink<R, E, A> implements Sink<R, E, A> {
289
+ constructor(
290
+ readonly sink: Sink<R, E, A>,
291
+ readonly f: (a: A) => Effect.Effect<R, E, boolean>
292
+ ) {
293
+ this.onFailure = this.onFailure.bind(this)
294
+ this.onSuccess = this.onSuccess.bind(this)
295
+ }
296
+
297
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
298
+ return this.sink.onFailure(cause)
299
+ }
300
+
301
+ onSuccess(value: A) {
302
+ return Effect.matchCauseEffect(this.f(value), {
303
+ onFailure: (cause) => this.sink.onFailure(cause),
304
+ onSuccess: (b) => {
305
+ if (b) return this.sink.onSuccess(value)
306
+ else return Effect.unit
307
+ }
308
+ })
309
+ }
310
+ }
311
+
312
+ /**
313
+ * @since 1.20.0
314
+ */
315
+ export const tapEffect: {
316
+ <A, R2, E2>(f: (a: A) => Effect.Effect<R2, E2, unknown>): <R, E>(
317
+ sink: Sink<R, E | E2, A>
318
+ ) => Sink<R | R2, E | E2, A>
319
+ <R, E, A, R2, E2>(sink: Sink<R, E | E2, A>, f: (a: A) => Effect.Effect<R2, E2, unknown>): Sink<R | R2, E | E2, A>
320
+ } = dual(2, function tapEffect<R, E, A, R2, E2>(
321
+ sink: Sink<R, E | E2, A>,
322
+ f: (a: A) => Effect.Effect<R2, E2, unknown>
323
+ ): Sink<R | R2, E | E2, A> {
324
+ return new TapEffectSink(sink, f)
325
+ })
326
+
327
+ class TapEffectSink<R, E, A, R2, E2> implements Sink<R | R2, E, A> {
328
+ constructor(
329
+ readonly sink: Sink<R, E | E2, A>,
330
+ readonly f: (a: A) => Effect.Effect<R2, E2, unknown>
331
+ ) {
332
+ this.onFailure = this.onFailure.bind(this)
333
+ this.onSuccess = this.onSuccess.bind(this)
334
+ }
335
+
336
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R | R2, never, unknown> {
337
+ return this.sink.onFailure(cause)
338
+ }
339
+
340
+ onSuccess(value: A) {
341
+ return Effect.matchCauseEffect(this.f(value), {
342
+ onFailure: (cause) => this.sink.onFailure(cause),
343
+ onSuccess: () => this.sink.onSuccess(value)
344
+ })
345
+ }
346
+ }
347
+
348
+ /**
349
+ * @since 1.20.0
350
+ */
351
+ export const loop: {
352
+ <B, A, C>(seed: B, f: (acc: B, a: A) => readonly [C, B]): <R, E>(
353
+ sink: Sink<R, E, C>
354
+ ) => Sink<R, E, A>
355
+ <R, E, A, B, C>(sink: Sink<R, E, C>, seed: B, f: (acc: B, a: A) => readonly [C, B]): Sink<R, E, A>
356
+ } = dual(3, function loop<R, E, A, B, C>(
357
+ sink: Sink<R, E, C>,
358
+ seed: B,
359
+ f: (acc: B, a: A) => readonly [C, B]
360
+ ): Sink<R, E, A> {
361
+ return new LoopSink(sink, seed, f)
362
+ })
363
+
364
+ class LoopSink<R, E, A, B, C> implements Sink<R, E, A> {
365
+ constructor(
366
+ readonly sink: Sink<R, E, C>,
367
+ private seed: B,
368
+ readonly f: (acc: B, a: A) => readonly [C, B]
369
+ ) {
370
+ this.onFailure = this.onFailure.bind(this)
371
+ this.onSuccess = this.onSuccess.bind(this)
372
+ }
373
+
374
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
375
+ return this.sink.onFailure(cause)
376
+ }
377
+
378
+ onSuccess(value: A) {
379
+ const [c, acc] = this.f(this.seed, value)
380
+ this.seed = acc
381
+ return this.sink.onSuccess(c)
382
+ }
383
+ }
384
+
385
+ /**
386
+ * @since 1.20.0
387
+ */
388
+ export const loopCause: {
389
+ <B, A, C>(seed: B, f: (acc: B, a: Cause.Cause<A>) => readonly [Cause.Cause<C>, B]): <R, E>(
390
+ sink: Sink<R, C, A>
391
+ ) => Sink<R, E, A>
392
+ <R, E, A, B, C>(
393
+ sink: Sink<R, C, A>,
394
+ seed: B,
395
+ f: (acc: B, a: Cause.Cause<E>) => readonly [Cause.Cause<C>, B]
396
+ ): Sink<R, E, A>
397
+ } = dual(3, function loopCause<R, E, A, B, C>(
398
+ sink: Sink<R, C, A>,
399
+ seed: B,
400
+ f: (acc: B, a: Cause.Cause<E>) => readonly [Cause.Cause<C>, B]
401
+ ): Sink<R, E, A> {
402
+ return new LoopCauseSink(sink, seed, f)
403
+ })
404
+
405
+ class LoopCauseSink<R, E, A, B, C> implements Sink<R, E, A> {
406
+ constructor(
407
+ readonly sink: Sink<R, C, A>,
408
+ private seed: B,
409
+ readonly f: (acc: B, a: Cause.Cause<E>) => readonly [Cause.Cause<C>, B]
410
+ ) {
411
+ this.onFailure = this.onFailure.bind(this)
412
+ this.onSuccess = this.onSuccess.bind(this)
413
+ }
414
+
415
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
416
+ const [c, acc] = this.f(this.seed, cause)
417
+ this.seed = acc
418
+ return this.sink.onFailure(c)
419
+ }
420
+
421
+ onSuccess(value: A) {
422
+ return this.sink.onSuccess(value)
423
+ }
424
+ }
425
+
426
+ /**
427
+ * @since 1.20.0
428
+ */
429
+ export const filterMapLoop: {
430
+ <B, A, C>(seed: B, f: (acc: B, a: A) => readonly [Option.Option<C>, B]): <R, E>(
431
+ sink: Sink<R, E, C>
432
+ ) => Sink<R, E, A>
433
+ <R, E, A, B, C>(sink: Sink<R, E, C>, seed: B, f: (acc: B, a: A) => readonly [Option.Option<C>, B]): Sink<R, E, A>
434
+ } = dual(3, function filterMapLoop<R, E, A, B, C>(
435
+ sink: Sink<R, E, C>,
436
+ seed: B,
437
+ f: (acc: B, a: A) => readonly [Option.Option<C>, B]
438
+ ): Sink<R, E, A> {
439
+ return new FilterMapLoopSink(sink, seed, f)
440
+ })
441
+
442
+ class FilterMapLoopSink<R, E, A, B, C> implements Sink<R, E, A> {
443
+ constructor(
444
+ readonly sink: Sink<R, E, C>,
445
+ private seed: B,
446
+ readonly f: (acc: B, a: A) => readonly [Option.Option<C>, B]
447
+ ) {
448
+ this.onFailure = this.onFailure.bind(this)
449
+ this.onSuccess = this.onSuccess.bind(this)
450
+ }
451
+
452
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
453
+ return this.sink.onFailure(cause)
454
+ }
455
+
456
+ onSuccess(value: A) {
457
+ const [option, acc] = this.f(this.seed, value)
458
+ this.seed = acc
459
+ if (Option.isSome(option)) return this.sink.onSuccess(option.value)
460
+ else return Effect.unit
461
+ }
462
+ }
463
+
464
+ /**
465
+ * @since 1.20.0
466
+ */
467
+ export const filterMapLoopCause: {
468
+ <B, A, C>(seed: B, f: (acc: B, a: Cause.Cause<A>) => readonly [Option.Option<Cause.Cause<C>>, B]): <R, E>(
469
+ sink: Sink<R, C, A>
470
+ ) => Sink<R, E, A>
471
+ <R, E, A, B, C>(
472
+ sink: Sink<R, C, A>,
473
+ seed: B,
474
+ f: (acc: B, a: Cause.Cause<E>) => readonly [Option.Option<Cause.Cause<C>>, B]
475
+ ): Sink<R, E, A>
476
+ } = dual(3, function filterMapLoopCause<R, E, A, B, C>(
477
+ sink: Sink<R, C, A>,
478
+ seed: B,
479
+ f: (acc: B, a: Cause.Cause<E>) => readonly [Option.Option<Cause.Cause<C>>, B]
480
+ ): Sink<R, E, A> {
481
+ return new FilterMapLoopCauseSink(sink, seed, f)
482
+ })
483
+
484
+ class FilterMapLoopCauseSink<R, E, A, B, C> implements Sink<R, E, A> {
485
+ constructor(
486
+ readonly sink: Sink<R, C, A>,
487
+ private seed: B,
488
+ readonly f: (acc: B, a: Cause.Cause<E>) => readonly [Option.Option<Cause.Cause<C>>, B]
489
+ ) {
490
+ this.onFailure = this.onFailure.bind(this)
491
+ this.onSuccess = this.onSuccess.bind(this)
492
+ }
493
+
494
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
495
+ const [option, acc] = this.f(this.seed, cause)
496
+ this.seed = acc
497
+ if (Option.isSome(option)) return this.sink.onFailure(option.value)
498
+ else return Effect.unit
499
+ }
500
+
501
+ onSuccess(value: A) {
502
+ return this.sink.onSuccess(value)
503
+ }
504
+ }
505
+
506
+ /**
507
+ * @since 1.20.0
508
+ */
509
+ export const loopEffect: {
510
+ <B, A, R2, E2, C>(seed: B, f: (acc: B, a: A) => Effect.Effect<R2, E2, readonly [C, B]>): <R, E>(
511
+ sink: Sink<R, E, C>
512
+ ) => Sink<R | R2, E | E2, A>
513
+ <R, E, A, B, C>(
514
+ sink: Sink<R, E, C>,
515
+ seed: B,
516
+ f: (acc: B, a: A) => Effect.Effect<R, E, readonly [C, B]>
517
+ ): Sink<R, E, A>
518
+ } = dual(3, function loopEffect<R, E, A, B, C>(
519
+ sink: Sink<R, E, C>,
520
+ seed: B,
521
+ f: (acc: B, a: A) => Effect.Effect<R, E, readonly [C, B]>
522
+ ): Sink<R, E, A> {
523
+ return new LoopEffectSink(sink, seed, f)
524
+ })
525
+
526
+ class LoopEffectSink<R, E, A, B, C> implements Sink<R, E, A> {
527
+ constructor(
528
+ readonly sink: Sink<R, E, C>,
529
+ private seed: B,
530
+ readonly f: (acc: B, a: A) => Effect.Effect<R, E, readonly [C, B]>
531
+ ) {
532
+ this.onFailure = this.onFailure.bind(this)
533
+ this.onSuccess = this.onSuccess.bind(this)
534
+ }
535
+
536
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
537
+ return this.sink.onFailure(cause)
538
+ }
539
+
540
+ onSuccess(value: A) {
541
+ return Effect.matchCauseEffect(this.f(this.seed, value), {
542
+ onFailure: (cause) => this.sink.onFailure(cause),
543
+ onSuccess: ([c, acc]) => {
544
+ this.seed = acc
545
+ return this.sink.onSuccess(c)
546
+ }
547
+ })
548
+ }
549
+ }
550
+
551
+ /**
552
+ * @since 1.20.0
553
+ */
554
+ export const filterMapLoopEffect: {
555
+ <B, A, R2, E2, C>(seed: B, f: (acc: B, a: A) => Effect.Effect<R2, E2, readonly [Option.Option<C>, B]>): <R, E>(
556
+ sink: Sink<R, E, C>
557
+ ) => Sink<R | R2, E | E2, A>
558
+ <R, E, A, B, R2, C>(
559
+ sink: Sink<R, E, C>,
560
+ seed: B,
561
+ f: (acc: B, a: A) => Effect.Effect<R2, E, readonly [Option.Option<C>, B]>
562
+ ): Sink<R | R2, E, A>
563
+ } = dual(3, function filterMapLoopEffect<R, E, A, B, R2, C>(
564
+ sink: Sink<R, E, C>,
565
+ seed: B,
566
+ f: (acc: B, a: A) => Effect.Effect<R2, E, readonly [Option.Option<C>, B]>
567
+ ): Sink<R | R2, E, A> {
568
+ return new FilterMapLoopEffectSink(sink, seed, f)
569
+ })
570
+
571
+ class FilterMapLoopEffectSink<R, E, A, B, R2, C> implements Sink<R | R2, E, A> {
572
+ constructor(
573
+ readonly sink: Sink<R, E, C>,
574
+ private seed: B,
575
+ readonly f: (acc: B, a: A) => Effect.Effect<R2, E, readonly [Option.Option<C>, B]>
576
+ ) {
577
+ this.onFailure = this.onFailure.bind(this)
578
+ this.onSuccess = this.onSuccess.bind(this)
579
+ }
580
+
581
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
582
+ return this.sink.onFailure(cause)
583
+ }
584
+
585
+ onSuccess(value: A) {
586
+ return Effect.matchCauseEffect(this.f(this.seed, value), {
587
+ onFailure: (cause) => this.sink.onFailure(cause),
588
+ onSuccess: ([option, acc]) => {
589
+ this.seed = acc
590
+ if (Option.isSome(option)) return this.sink.onSuccess(option.value)
591
+ else return Effect.unit
592
+ }
593
+ })
594
+ }
595
+ }
596
+
597
+ /**
598
+ * @since 1.20.0
599
+ */
600
+ export const loopCauseEffect: {
601
+ <B, A, R2, E2, C>(
602
+ seed: B,
603
+ f: (acc: B, a: Cause.Cause<A>) => Effect.Effect<R2, E2, readonly [Cause.Cause<C>, B]>
604
+ ): <R, E>(
605
+ sink: Sink<R, E | C, A>
606
+ ) => Sink<R, E | C, A>
607
+ <R, E, A, B, C>(
608
+ sink: Sink<R, E | C, A>,
609
+ seed: B,
610
+ f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R, E, readonly [Cause.Cause<C>, B]>
611
+ ): Sink<R, E | C, A>
612
+ } = dual(3, function loopCauseEffect<R, E, A, B, C>(
613
+ sink: Sink<R, E | C, A>,
614
+ seed: B,
615
+ f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R, E, readonly [Cause.Cause<C>, B]>
616
+ ): Sink<R, E | C, A> {
617
+ return new LoopCauseEffectSink(sink, seed, f)
618
+ })
619
+
620
+ class LoopCauseEffectSink<R, E, A, B, C> implements Sink<R, E, A> {
621
+ constructor(
622
+ readonly sink: Sink<R, E | C, A>,
623
+ private seed: B,
624
+ readonly f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R, E, readonly [Cause.Cause<C>, B]>
625
+ ) {
626
+ this.onFailure = this.onFailure.bind(this)
627
+ this.onSuccess = this.onSuccess.bind(this)
628
+ }
629
+
630
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
631
+ return Effect.matchCauseEffect(this.f(this.seed, cause), {
632
+ onFailure: (cause2) => this.sink.onFailure(Cause.sequential(cause, cause2)),
633
+ onSuccess: ([c, acc]) => {
634
+ this.seed = acc
635
+ return this.sink.onFailure(c)
636
+ }
637
+ })
638
+ }
639
+
640
+ onSuccess(value: A) {
641
+ return this.sink.onSuccess(value)
642
+ }
643
+ }
644
+
645
+ /**
646
+ * @since 1.20.0
647
+ */
648
+ export function filterMapLoopCauseEffect<R, E, A, B, R2, E2, C>(
649
+ sink: Sink<R, E2 | C, A>,
650
+ seed: B,
651
+ f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R2, E2, readonly [Option.Option<Cause.Cause<C>>, B]>
652
+ ): Sink<R | R2, E, A> {
653
+ return new FilterMapLoopCauseEffectSink(sink, seed, f)
654
+ }
655
+
656
+ class FilterMapLoopCauseEffectSink<R, E, A, B, R2, E2, C> implements Sink<R | R2, E, A> {
657
+ constructor(
658
+ readonly sink: Sink<R, E2 | C, A>,
659
+ private seed: B,
660
+ readonly f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R2, E2, readonly [Option.Option<Cause.Cause<C>>, B]>
661
+ ) {
662
+ this.onFailure = this.onFailure.bind(this)
663
+ this.onSuccess = this.onSuccess.bind(this)
664
+ }
665
+
666
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R | R2, never, unknown> {
667
+ return Effect.matchCauseEffect(this.f(this.seed, cause), {
668
+ onFailure: (cause2) => this.sink.onFailure(cause2),
669
+ onSuccess: ([option, acc]) => {
670
+ this.seed = acc
671
+ if (Option.isSome(option)) return this.sink.onFailure(option.value)
672
+ else return Effect.unit
673
+ }
674
+ })
675
+ }
676
+
677
+ onSuccess(value: A) {
678
+ return this.sink.onSuccess(value)
679
+ }
680
+ }
681
+
682
+ /**
683
+ * @since 1.20.0
684
+ */
685
+ export const slice: {
686
+ <R, E, A, R2>(bounds: Bounds, f: (sink: Sink<R, E, A>) => Effect.Effect<R2, never, unknown>): (
687
+ sink: Sink<R, E, A>
688
+ ) => Effect.Effect<R | R2, never, void>
689
+ <R, E, A, R2>(
690
+ sink: Sink<R, E, A>,
691
+ bounds: Bounds,
692
+ f: (sink: Sink<R, E, A>) => Effect.Effect<R2, never, unknown>
693
+ ): Effect.Effect<R | R2, never, void>
694
+ } = dual(3, function slice<R, E, A, R2>(
695
+ sink: Sink<R, E, A>,
696
+ bounds: Bounds,
697
+ f: (sink: Sink<R, E, A>) => Effect.Effect<R2, never, unknown>
698
+ ): Effect.Effect<R | R2, never, void> {
699
+ return withEarlyExit(sink, (s) => f(new SliceSink(s, bounds)))
700
+ })
701
+
702
+ class SliceSink<R, E, A> implements Sink<R, E, A> {
703
+ private drop: number
704
+ private take: number
705
+
706
+ constructor(
707
+ readonly sink: WithEarlyExit<R, E, A>,
708
+ readonly bounds: Bounds
709
+ ) {
710
+ this.drop = this.bounds.min
711
+ this.take = this.bounds.max
712
+
713
+ this.onFailure = this.onFailure.bind(this)
714
+ this.onSuccess = this.onSuccess.bind(this)
715
+ }
716
+
717
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
718
+ return this.sink.onFailure(cause)
719
+ }
720
+
721
+ onSuccess(value: A) {
722
+ if (this.drop > 0) {
723
+ this.drop--
724
+ return Effect.unit
725
+ }
726
+ if (this.take-- > 0) {
727
+ return Effect.tap(this.sink.onSuccess(value), () => this.take === 0 ? this.sink.earlyExit : Effect.unit)
728
+ }
729
+ return this.sink.earlyExit
730
+ }
731
+ }
732
+
733
+ /**
734
+ * @since 1.20.0
735
+ */
736
+ export const takeWhile: {
737
+ <R, E, A, R2, B>(predicate: Predicate.Predicate<A>, f: (sink: Sink<R, E, A>) => Effect.Effect<R2, E, B>): (
738
+ sink: Sink<R, E, A>
739
+ ) => Effect.Effect<R | R2, never, void>
740
+ <R, E, A, R2, B>(
741
+ sink: Sink<R, E, A>,
742
+ predicate: Predicate.Predicate<A>,
743
+ f: (sink: Sink<R, E, A>) => Effect.Effect<R2, E, B>
744
+ ): Effect.Effect<R | R2, never, void>
745
+ } = dual(3, function takeWhile<R, E, A, R2, B>(
746
+ sink: Sink<R, E, A>,
747
+ predicate: Predicate.Predicate<A>,
748
+ f: (sink: Sink<R, E, A>) => Effect.Effect<R2, E, B>
749
+ ) {
750
+ return withEarlyExit(sink, (s) => f(new TakeWhileSink(s, predicate)))
751
+ })
752
+
753
+ class TakeWhileSink<R, E, A> implements Sink<R, E, A> {
754
+ private take: boolean
755
+
756
+ constructor(
757
+ readonly sink: WithEarlyExit<R, E, A>,
758
+ readonly predicate: Predicate.Predicate<A>
759
+ ) {
760
+ this.take = true
761
+ this.onFailure = this.onFailure.bind(this)
762
+ this.onSuccess = this.onSuccess.bind(this)
763
+ }
764
+
765
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
766
+ return this.sink.onFailure(cause)
767
+ }
768
+
769
+ onSuccess(value: A) {
770
+ if (this.take === true && (this.take = this.predicate(value))) return this.sink.onSuccess(value)
771
+ else {
772
+ this.take = false
773
+ return this.sink.earlyExit
774
+ }
775
+ }
776
+ }
777
+
778
+ /**
779
+ * @since 1.20.0
780
+ */
781
+ export const dropWhile: {
782
+ <A>(predicate: Predicate.Predicate<A>): <R, E>(
783
+ sink: Sink<R, E, A>
784
+ ) => Sink<R, E, A>
785
+ <R, E, A>(sink: Sink<R, E, A>, predicate: Predicate.Predicate<A>): Sink<R, E, A>
786
+ } = dual(2, function dropWhile<R, E, A>(
787
+ sink: Sink<R, E, A>,
788
+ predicate: Predicate.Predicate<A>
789
+ ): Sink<R, E, A> {
790
+ return filterMapLoop(sink, true, (drop: boolean, a: A) => {
791
+ const drop2 = drop && predicate(a)
792
+ return [drop2 ? Option.none() : Option.some(a), drop2]
793
+ })
794
+ })
795
+
796
+ /**
797
+ * @since 1.20.0
798
+ */
799
+ export const dropAfter: {
800
+ <A>(predicate: Predicate.Predicate<A>): <R, E>(
801
+ sink: Sink<R, E, A>
802
+ ) => Sink<R, E, A>
803
+ <R, E, A>(sink: Sink<R, E, A>, predicate: Predicate.Predicate<A>): Sink<R, E, A>
804
+ } = dual(2, function dropAfter<R, E, A>(
805
+ sink: Sink<R, E, A>,
806
+ predicate: Predicate.Predicate<A>
807
+ ) {
808
+ return filterMapLoop(sink, false, (drop: boolean, a: A) => {
809
+ if (drop === true) return [Option.none(), drop]
810
+
811
+ const drop2 = predicate(a)
812
+ return [Option.some(a), drop2]
813
+ })
814
+ })
815
+
816
+ /**
817
+ * @since 1.20.0
818
+ */
819
+ export const takeWhileEffect: {
820
+ <R, E, A, R2, E2, R3, E3, B>(
821
+ predicate: (a: A) => Effect.Effect<R2, E2, boolean>,
822
+ f: (sink: Sink<R | R2, E, A>) => Effect.Effect<R3, E3, B>
823
+ ): <R, E>(
824
+ sink: Sink<R, E, A>
825
+ ) => Effect.Effect<R | R3, never, void>
826
+ <R, E, A, R2, E2, R3, E3, B>(
827
+ sink: Sink<R, E | E2 | E3, A>,
828
+ predicate: (a: A) => Effect.Effect<R2, E2, boolean>,
829
+ f: (sink: Sink<R | R2, E, A>) => Effect.Effect<R3, E3, B>
830
+ ): Effect.Effect<R | R3, never, void>
831
+ } = dual(3, function takeWhileEffect<R, E, A, R2, E2, R3, E3, B>(
832
+ sink: Sink<R, E | E2 | E3, A>,
833
+ predicate: (a: A) => Effect.Effect<R2, E2, boolean>,
834
+ f: (sink: Sink<R | R2, E, A>) => Effect.Effect<R3, E3, B>
835
+ ) {
836
+ return withEarlyExit(sink, (s) => f(new TakeWhileEffectSink(s, predicate)))
837
+ })
838
+
839
+ class TakeWhileEffectSink<R, E, A, R2, E2> implements Sink<R | R2, E, A> {
840
+ private take: boolean
841
+
842
+ constructor(
843
+ readonly sink: WithEarlyExit<R, E | E2, A>,
844
+ readonly predicate: (a: A) => Effect.Effect<R2, E2, boolean>
845
+ ) {
846
+ this.take = true
847
+ this.onFailure = this.onFailure.bind(this)
848
+ this.onSuccess = this.onSuccess.bind(this)
849
+ }
850
+
851
+ onFailure(cause: Cause.Cause<E | E2>): Effect.Effect<R | R2, never, unknown> {
852
+ return this.sink.onFailure(cause)
853
+ }
854
+
855
+ onSuccess(value: A) {
856
+ if (this.take === true) {
857
+ return Effect.matchCauseEffect(this.predicate(value), {
858
+ onFailure: (cause) => this.sink.onFailure(cause),
859
+ onSuccess: (b) => {
860
+ if ((this.take = b)) return this.sink.onSuccess(value)
861
+ else return this.sink.earlyExit
862
+ }
863
+ })
864
+ } else return this.sink.earlyExit
865
+ }
866
+ }
867
+
868
+ /**
869
+ * @since 1.20.0
870
+ */
871
+ export const dropWhileEffect: {
872
+ <A, R2, E2>(predicate: (a: A) => Effect.Effect<R2, E2, boolean>): <R, E>(
873
+ sink: Sink<R, E | E2, A>
874
+ ) => Sink<R | R2, E | E2, A>
188
875
  <R, E, A, R2, E2>(
189
- sink: WithContext<R, E, A>,
190
- f: (e: Cause.Cause<E2>) => Effect.Effect<R2, E, Cause.Cause<E>>
191
- ): WithContext<R | R2, E2, A>
192
- } = dual(2, function mapErrorCauseEffect<R, E, A, R2, E2>(
193
- sink: WithContext<R, E, A>,
194
- f: (e: Cause.Cause<E2>) => Effect.Effect<R2, E, Cause.Cause<E>>
195
- ): WithContext<R | R2, E2, A> {
196
- return WithContext(
197
- (cause) => Effect.matchCauseEffect(f(cause), WithContext(sink.onFailure, sink.onFailure)),
198
- sink.onSuccess
199
- )
876
+ sink: Sink<R, E | E2, A>,
877
+ predicate: (a: A) => Effect.Effect<R2, E2, boolean>
878
+ ): Sink<R | R2, E | E2, A>
879
+ } = dual(2, function dropWhileEffect<R, E, A, R2, E2>(
880
+ sink: Sink<R, E | E2, A>,
881
+ predicate: (a: A) => Effect.Effect<R2, E2, boolean>
882
+ ): Sink<R | R2, E | E2, A> {
883
+ return filterMapLoopEffect<R, E | E2, A, boolean, R2, A>(sink, true, (drop: boolean, a: A) => {
884
+ if (drop === false) return Effect.succeed([Option.some(a), drop as boolean] as const)
885
+
886
+ return Effect.map(predicate(a), (b) => [b ? Option.none<A>() : Option.some(a), b] as const)
887
+ })
200
888
  })
201
889
 
202
890
  /**
203
- * Transform the input Error of a Sink.
204
- * @since 1.18.0
205
- * @category combinators
891
+ * @since 1.20.0
206
892
  */
207
- export const mapError: {
208
- <E2, E, A>(f: (e: E2) => E): <R>(sink: WithContext<R, E, A>) => WithContext<R, E2, A>
209
- <R, E, A, E2>(sink: WithContext<R, E, A>, f: (e: E2) => E): WithContext<R, E2, A>
210
- } = dual(2, function mapError<R, E, A, E2>(
211
- sink: WithContext<R, E, A>,
212
- f: (e: E2) => E
213
- ): WithContext<R, E2, A> {
214
- return WithContext(
215
- (cause) => sink.onFailure(Cause.map(cause, f)),
216
- sink.onSuccess
217
- )
893
+ export const dropAfterEffect: {
894
+ <A, R2, E2>(predicate: (a: A) => Effect.Effect<R2, E2, boolean>): <R, E>(
895
+ sink: Sink<R, E | E2, A>
896
+ ) => Sink<R | R2, E | E2, A>
897
+ <R, E, A, R2, E2>(
898
+ sink: Sink<R, E | E2, A>,
899
+ predicate: (a: A) => Effect.Effect<R2, E2, boolean>
900
+ ): Sink<R | R2, E | E2, A>
901
+ } = dual(2, function dropAfterEffect<R, E, A, R2, E2>(
902
+ sink: Sink<R, E | E2, A>,
903
+ predicate: (a: A) => Effect.Effect<R2, E2, boolean>
904
+ ): Sink<R | R2, E | E2, A> {
905
+ return filterMapLoopEffect<R, E | E2, A, boolean, R2, A>(sink, false, (drop: boolean, a: A) => {
906
+ if (drop === true) return Effect.succeed([Option.none(), drop as boolean] as const)
907
+
908
+ return Effect.map(predicate(a), (b) => [Option.some(a), b] as const)
909
+ })
218
910
  })
219
911
 
220
912
  /**
221
- * Transform the input Error of a Sink using an Effect.
222
- * @since 1.18.0
223
- * @category combinators
913
+ * @since 1.20.0
224
914
  */
225
- export const mapErrorEffect: {
226
- <E2, R2, E, A>(f: (e: E2) => Effect.Effect<R2, E, E>): <R>(sink: WithContext<R, E, A>) => WithContext<R | R2, E, A>
227
- <R, E, A, R2, E2>(sink: WithContext<R, E, A>, f: (e: E2) => Effect.Effect<R2, E, E>): WithContext<R | R2, E, A>
228
- } = dual(2, function mapErrorEffect<R, E, A, R2, E2>(
229
- sink: WithContext<R, E, A>,
230
- f: (e: E2) => Effect.Effect<R2, E, E>
231
- ): WithContext<R | R2, E2, A> {
232
- return mapErrorCauseEffect(sink, (cause: Cause.Cause<E2>) =>
233
- Either.match(Cause.failureOrCause(cause), {
234
- onLeft: (e2) => Effect.map(f(e2), Cause.fail),
235
- onRight: (cause) => Effect.succeed(cause)
236
- }))
915
+ export const provide: {
916
+ <R2>(ctx: C.Context<R2>): <R, E, A>(sink: Sink<R, E, A>) => Sink<Exclude<R, R2>, E, A>
917
+ <R, E, A, R2>(sink: Sink<R, E, A>, ctx: C.Context<R2>): Sink<Exclude<R, R2>, E, A>
918
+ } = dual(2, function provide<R, E, A, R2>(
919
+ sink: Sink<R, E, A>,
920
+ ctx: C.Context<R2>
921
+ ): Sink<Exclude<R, R2>, E, A> {
922
+ return make(
923
+ (cause) => Effect.provide(sink.onFailure(cause), ctx),
924
+ (a) => Effect.provide(sink.onSuccess(a), ctx)
925
+ )
237
926
  })
238
927
 
239
928
  /**
240
- * Set the span a Sink will use to append events to.
241
- * @since 1.18.0
242
- * @category tracing
929
+ * @since 1.20.0
243
930
  */
244
931
  export const setSpan: {
245
- (span: Tracer.Span): <R, E, A>(self: WithContext<R, E, A>) => WithContext<R, E, A>
246
- <R, E, A>(self: WithContext<R, E, A>, span: Tracer.Span): WithContext<R, E, A>
247
- } = dual(2, function withSpan<R, E, A>(
248
- self: WithContext<R, E, A>,
932
+ (span: Tracer.Span): <R, E, A>(sink: Sink<R, E, A>) => Sink<R, E, A>
933
+ <R, E, A>(self: Sink<R, E, A>, span: Tracer.Span): Sink<R, E, A>
934
+ } = dual(2, function setSpan<R, E, A>(
935
+ self: Sink<R, E, A>,
249
936
  span: Tracer.Span
250
- ): WithContext<R, E, A> {
251
- return WithContext(
937
+ ): Sink<R, E, A> {
938
+ return make(
252
939
  (cause) =>
253
940
  addEvent(self.onFailure(cause), "fx.failure", span, {
254
941
  "cause": Cause.pretty(cause)
@@ -272,3 +959,67 @@ const addEvent = <R, E, A>(
272
959
 
273
960
  return effect
274
961
  }))
962
+
963
+ /**
964
+ * @since 1.20.0
965
+ */
966
+ export function tagged<E, A>(): {
967
+ <const I extends C.IdentifierFactory<any>>(identifier: I): Sink.Tagged<C.IdentifierOf<I>, E, A>
968
+ <const I>(identifier: I): Sink.Tagged<C.IdentifierOf<I>, E, A>
969
+ } {
970
+ return <const I>(identifier: I) => new TaggedImpl(C.Tagged<I, Sink<never, E, A>>(identifier))
971
+ }
972
+
973
+ class TaggedImpl<I, E, A> implements Sink.Tagged<I, E, A> {
974
+ constructor(readonly tag: C.Tagged<I, Sink<never, E, A>>) {}
975
+
976
+ onSuccess(value: A): Effect.Effect<I, never, unknown> {
977
+ return this.tag.withEffect((sink) => sink.onSuccess(value))
978
+ }
979
+
980
+ onFailure(cause: Cause.Cause<E>): Effect.Effect<I, never, unknown> {
981
+ return this.tag.withEffect((sink) => sink.onFailure(cause))
982
+ }
983
+
984
+ make: <R>(sink: Sink<R, E, A>) => Layer.Layer<R, never, I> = <R>(sink: Sink<R, E, A>) =>
985
+ Layer.flatMap(Layer.context<R>(), (ctx) => this.tag.layer(provide(sink, ctx)))
986
+ }
987
+
988
+ /**
989
+ * @since 1.20.0
990
+ */
991
+ export const fromTag: {
992
+ <S, R2, E2, B>(f: (s: S) => Sink<R2, E2, B>): <I>(tag: C.Tag<I, S>) => Sink<I | R2, E2, B>
993
+ <I, S, R2, E2, B>(tag: C.Tag<I, S>, f: (s: S) => Sink<R2, E2, B>): Sink<I | R2, E2, B>
994
+ } = dual(2, function fromTag<I, S, R2, E2, B>(
995
+ tag: C.Tag<I, S>,
996
+ f: (s: S) => Sink<R2, E2, B>
997
+ ): Sink<I | R2, E2, B> {
998
+ return new FromTag(tag, f)
999
+ })
1000
+
1001
+ class FromTag<I, S, R2, E2, B> implements Sink<I | R2, E2, B> {
1002
+ readonly get: Effect.Effect<I, never, Sink<R2, E2, B>>
1003
+
1004
+ constructor(readonly tag: C.Tag<I, S>, readonly f: (s: S) => Sink<R2, E2, B>) {
1005
+ this.get = Effect.map(tag, f)
1006
+ }
1007
+
1008
+ onSuccess(value: B): Effect.Effect<I | R2, never, unknown> {
1009
+ return Effect.flatMap(this.get, (sink) => sink.onSuccess(value))
1010
+ }
1011
+
1012
+ onFailure(cause: Cause.Cause<E2>): Effect.Effect<I | R2, never, unknown> {
1013
+ return Effect.flatMap(this.get, (sink) => sink.onFailure(cause))
1014
+ }
1015
+ }
1016
+
1017
+ /**
1018
+ * @since 1.20.0
1019
+ */
1020
+ export function ignoreInterrupt<R, E, A>(sink: Sink<R, E, A>): Sink<R, E, A> {
1021
+ return make(
1022
+ (cause) => Cause.isInterruptedOnly(cause) ? Effect.unit : sink.onFailure(cause),
1023
+ sink.onSuccess
1024
+ )
1025
+ }