@typed/fx 1.13.0 → 1.14.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 (398) hide show
  1. package/dist/Computed.d.ts +42 -0
  2. package/dist/Computed.d.ts.map +1 -0
  3. package/dist/Computed.js +39 -0
  4. package/dist/Computed.js.map +1 -0
  5. package/dist/Filtered.d.ts +34 -0
  6. package/dist/Filtered.d.ts.map +1 -0
  7. package/dist/Filtered.js +40 -0
  8. package/dist/Filtered.js.map +1 -0
  9. package/dist/Fx.d.ts +2 -3
  10. package/dist/Fx.d.ts.map +1 -1
  11. package/dist/Fx.js +11 -26
  12. package/dist/Fx.js.map +1 -1
  13. package/dist/RefArray.d.ts +116 -0
  14. package/dist/RefArray.d.ts.map +1 -0
  15. package/dist/RefArray.js +67 -0
  16. package/dist/RefArray.js.map +1 -0
  17. package/dist/RefSubject.d.ts +23 -20
  18. package/dist/RefSubject.d.ts.map +1 -1
  19. package/dist/RefSubject.js +352 -247
  20. package/dist/RefSubject.js.map +1 -1
  21. package/dist/RefTransform.d.ts +51 -0
  22. package/dist/RefTransform.d.ts.map +1 -0
  23. package/dist/RefTransform.js +69 -0
  24. package/dist/RefTransform.js.map +1 -0
  25. package/dist/Subject.d.ts.map +1 -1
  26. package/dist/Subject.js +2 -3
  27. package/dist/Subject.js.map +1 -1
  28. package/dist/catchAllCause.d.ts +6 -0
  29. package/dist/catchAllCause.d.ts.map +1 -1
  30. package/dist/catchAllCause.js +21 -2
  31. package/dist/catchAllCause.js.map +1 -1
  32. package/dist/cjs/Computed.d.ts +42 -0
  33. package/dist/cjs/Computed.d.ts.map +1 -0
  34. package/dist/cjs/Computed.js +66 -0
  35. package/dist/cjs/Computed.js.map +1 -0
  36. package/dist/cjs/Filtered.d.ts +34 -0
  37. package/dist/cjs/Filtered.d.ts.map +1 -0
  38. package/dist/cjs/Filtered.js +67 -0
  39. package/dist/cjs/Filtered.js.map +1 -0
  40. package/dist/cjs/Fx.d.ts +2 -3
  41. package/dist/cjs/Fx.d.ts.map +1 -1
  42. package/dist/cjs/Fx.js +13 -28
  43. package/dist/cjs/Fx.js.map +1 -1
  44. package/dist/cjs/RefArray.d.ts +116 -0
  45. package/dist/cjs/RefArray.d.ts.map +1 -0
  46. package/dist/cjs/RefArray.js +97 -0
  47. package/dist/cjs/RefArray.js.map +1 -0
  48. package/dist/cjs/RefSubject.d.ts +23 -20
  49. package/dist/cjs/RefSubject.d.ts.map +1 -1
  50. package/dist/cjs/RefSubject.js +358 -249
  51. package/dist/cjs/RefSubject.js.map +1 -1
  52. package/dist/cjs/RefTransform.d.ts +51 -0
  53. package/dist/cjs/RefTransform.d.ts.map +1 -0
  54. package/dist/cjs/RefTransform.js +96 -0
  55. package/dist/cjs/RefTransform.js.map +1 -0
  56. package/dist/cjs/Subject.d.ts.map +1 -1
  57. package/dist/cjs/Subject.js +2 -3
  58. package/dist/cjs/Subject.js.map +1 -1
  59. package/dist/cjs/catchAllCause.d.ts +6 -0
  60. package/dist/cjs/catchAllCause.d.ts.map +1 -1
  61. package/dist/cjs/catchAllCause.js +23 -2
  62. package/dist/cjs/catchAllCause.js.map +1 -1
  63. package/dist/cjs/combineAll.d.ts.map +1 -1
  64. package/dist/cjs/combineAll.js +4 -4
  65. package/dist/cjs/combineAll.js.map +1 -1
  66. package/dist/cjs/combineAllDiscard.d.ts.map +1 -1
  67. package/dist/cjs/combineAllDiscard.js +4 -4
  68. package/dist/cjs/combineAllDiscard.js.map +1 -1
  69. package/dist/cjs/data-first.d.ts +10 -0
  70. package/dist/cjs/data-first.d.ts.map +1 -1
  71. package/dist/cjs/data-first.js +10 -0
  72. package/dist/cjs/data-first.js.map +1 -1
  73. package/dist/cjs/empty.js +1 -1
  74. package/dist/cjs/empty.js.map +1 -1
  75. package/dist/cjs/exhaustMapCause.js +1 -1
  76. package/dist/cjs/exhaustMapCause.js.map +1 -1
  77. package/dist/cjs/exhaustMapLatestCause.js +1 -1
  78. package/dist/cjs/exhaustMapLatestCause.js.map +1 -1
  79. package/dist/cjs/failCause.d.ts +1 -0
  80. package/dist/cjs/failCause.d.ts.map +1 -1
  81. package/dist/cjs/failCause.js +5 -1
  82. package/dist/cjs/failCause.js.map +1 -1
  83. package/dist/cjs/filter.d.ts.map +1 -1
  84. package/dist/cjs/filter.js +1 -1
  85. package/dist/cjs/filter.js.map +1 -1
  86. package/dist/cjs/filterMap.d.ts.map +1 -1
  87. package/dist/cjs/filterMap.js +1 -1
  88. package/dist/cjs/filterMap.js.map +1 -1
  89. package/dist/cjs/fromArray.js +1 -1
  90. package/dist/cjs/fromArray.js.map +1 -1
  91. package/dist/cjs/fromDequeue.d.ts +5 -0
  92. package/dist/cjs/fromDequeue.d.ts.map +1 -0
  93. package/dist/cjs/fromDequeue.js +49 -0
  94. package/dist/cjs/fromDequeue.js.map +1 -0
  95. package/dist/cjs/fromEffect.d.ts.map +1 -1
  96. package/dist/cjs/fromEffect.js +9 -1
  97. package/dist/cjs/fromEffect.js.map +1 -1
  98. package/dist/cjs/fromEmitter.d.ts.map +1 -1
  99. package/dist/cjs/fromEmitter.js +4 -5
  100. package/dist/cjs/fromEmitter.js.map +1 -1
  101. package/dist/cjs/fromFxEffect.d.ts.map +1 -1
  102. package/dist/cjs/fromFxEffect.js +1 -1
  103. package/dist/cjs/fromFxEffect.js.map +1 -1
  104. package/dist/cjs/fromHub.d.ts +5 -0
  105. package/dist/cjs/fromHub.d.ts.map +1 -0
  106. package/dist/cjs/fromHub.js +34 -0
  107. package/dist/cjs/fromHub.js.map +1 -0
  108. package/dist/cjs/fromIterable.js +1 -1
  109. package/dist/cjs/fromIterable.js.map +1 -1
  110. package/dist/cjs/fromStream.d.ts +4 -0
  111. package/dist/cjs/fromStream.d.ts.map +1 -0
  112. package/dist/cjs/fromStream.js +34 -0
  113. package/dist/cjs/fromStream.js.map +1 -0
  114. package/dist/cjs/helpers.d.ts +3 -2
  115. package/dist/cjs/helpers.d.ts.map +1 -1
  116. package/dist/cjs/helpers.js +28 -69
  117. package/dist/cjs/helpers.js.map +1 -1
  118. package/dist/cjs/hold.d.ts +2 -4
  119. package/dist/cjs/hold.d.ts.map +1 -1
  120. package/dist/cjs/hold.js +0 -4
  121. package/dist/cjs/hold.js.map +1 -1
  122. package/dist/cjs/index.d.ts +36 -1
  123. package/dist/cjs/index.d.ts.map +1 -1
  124. package/dist/cjs/index.js +185 -119
  125. package/dist/cjs/index.js.map +1 -1
  126. package/dist/cjs/keyed.d.ts.map +1 -1
  127. package/dist/cjs/keyed.js +23 -12
  128. package/dist/cjs/keyed.js.map +1 -1
  129. package/dist/cjs/mergeAll.d.ts.map +1 -1
  130. package/dist/cjs/mergeAll.js +1 -1
  131. package/dist/cjs/mergeAll.js.map +1 -1
  132. package/dist/cjs/mergeBufferConcurrently.d.ts +8 -0
  133. package/dist/cjs/mergeBufferConcurrently.d.ts.map +1 -0
  134. package/dist/cjs/mergeBufferConcurrently.js +95 -0
  135. package/dist/cjs/mergeBufferConcurrently.js.map +1 -0
  136. package/dist/cjs/mergeConcurrently.d.ts +3 -0
  137. package/dist/cjs/mergeConcurrently.d.ts.map +1 -0
  138. package/dist/cjs/mergeConcurrently.js +69 -0
  139. package/dist/cjs/mergeConcurrently.js.map +1 -0
  140. package/dist/cjs/multicast.d.ts +5 -5
  141. package/dist/cjs/multicast.d.ts.map +1 -1
  142. package/dist/cjs/multicast.js +14 -14
  143. package/dist/cjs/multicast.js.map +1 -1
  144. package/dist/cjs/never.js +1 -1
  145. package/dist/cjs/never.js.map +1 -1
  146. package/dist/cjs/observe.d.ts +3 -0
  147. package/dist/cjs/observe.d.ts.map +1 -1
  148. package/dist/cjs/observe.js +12 -7
  149. package/dist/cjs/observe.js.map +1 -1
  150. package/dist/cjs/onExit.d.ts +5 -0
  151. package/dist/cjs/onExit.d.ts.map +1 -0
  152. package/dist/cjs/onExit.js +33 -0
  153. package/dist/cjs/onExit.js.map +1 -0
  154. package/dist/cjs/orElse.d.ts +4 -0
  155. package/dist/cjs/orElse.d.ts.map +1 -0
  156. package/dist/cjs/orElse.js +34 -0
  157. package/dist/cjs/orElse.js.map +1 -0
  158. package/dist/cjs/promise.js +4 -4
  159. package/dist/cjs/promise.js.map +1 -1
  160. package/dist/cjs/provide.d.ts.map +1 -1
  161. package/dist/cjs/provide.js +6 -3
  162. package/dist/cjs/provide.js.map +1 -1
  163. package/dist/cjs/skipRepeats.d.ts +1 -1
  164. package/dist/cjs/skipRepeats.d.ts.map +1 -1
  165. package/dist/cjs/skipRepeats.js +7 -6
  166. package/dist/cjs/skipRepeats.js.map +1 -1
  167. package/dist/cjs/skipWhile.js +1 -1
  168. package/dist/cjs/skipWhile.js.map +1 -1
  169. package/dist/cjs/slice.js +3 -3
  170. package/dist/cjs/slice.js.map +1 -1
  171. package/dist/cjs/struct.d.ts +5 -0
  172. package/dist/cjs/struct.d.ts.map +1 -0
  173. package/dist/cjs/struct.js +10 -0
  174. package/dist/cjs/struct.js.map +1 -0
  175. package/dist/cjs/switchMapCause.d.ts +1 -0
  176. package/dist/cjs/switchMapCause.d.ts.map +1 -1
  177. package/dist/cjs/switchMapCause.js +13 -2
  178. package/dist/cjs/switchMapCause.js.map +1 -1
  179. package/dist/cjs/switchMatch.js +1 -1
  180. package/dist/cjs/switchMatch.js.map +1 -1
  181. package/dist/cjs/takeWhile.js +1 -1
  182. package/dist/cjs/takeWhile.js.map +1 -1
  183. package/dist/cjs/tap.d.ts.map +1 -1
  184. package/dist/cjs/tap.js +1 -1
  185. package/dist/cjs/tap.js.map +1 -1
  186. package/dist/cjs/tapCause.d.ts.map +1 -1
  187. package/dist/cjs/tapCause.js +5 -2
  188. package/dist/cjs/tapCause.js.map +1 -1
  189. package/dist/cjs/test-utils.js +2 -2
  190. package/dist/cjs/test-utils.js.map +1 -1
  191. package/dist/cjs/toArray.d.ts.map +1 -1
  192. package/dist/cjs/toArray.js +2 -3
  193. package/dist/cjs/toArray.js.map +1 -1
  194. package/dist/cjs/toEnqueue.d.ts +6 -0
  195. package/dist/cjs/toEnqueue.d.ts.map +1 -0
  196. package/dist/cjs/toEnqueue.js +9 -0
  197. package/dist/cjs/toEnqueue.js.map +1 -0
  198. package/dist/cjs/toStream.d.ts +4 -0
  199. package/dist/cjs/toStream.d.ts.map +1 -0
  200. package/dist/cjs/toStream.js +35 -0
  201. package/dist/cjs/toStream.js.map +1 -0
  202. package/dist/combineAll.d.ts.map +1 -1
  203. package/dist/combineAll.js +4 -4
  204. package/dist/combineAll.js.map +1 -1
  205. package/dist/combineAllDiscard.d.ts.map +1 -1
  206. package/dist/combineAllDiscard.js +4 -4
  207. package/dist/combineAllDiscard.js.map +1 -1
  208. package/dist/data-first.d.ts +10 -0
  209. package/dist/data-first.d.ts.map +1 -1
  210. package/dist/data-first.js +10 -0
  211. package/dist/data-first.js.map +1 -1
  212. package/dist/empty.js +1 -1
  213. package/dist/empty.js.map +1 -1
  214. package/dist/exhaustMapCause.js +1 -1
  215. package/dist/exhaustMapCause.js.map +1 -1
  216. package/dist/exhaustMapLatestCause.js +1 -1
  217. package/dist/exhaustMapLatestCause.js.map +1 -1
  218. package/dist/failCause.d.ts +1 -0
  219. package/dist/failCause.d.ts.map +1 -1
  220. package/dist/failCause.js +3 -0
  221. package/dist/failCause.js.map +1 -1
  222. package/dist/filter.d.ts.map +1 -1
  223. package/dist/filter.js +1 -1
  224. package/dist/filter.js.map +1 -1
  225. package/dist/filterMap.d.ts.map +1 -1
  226. package/dist/filterMap.js +1 -1
  227. package/dist/filterMap.js.map +1 -1
  228. package/dist/fromArray.js +1 -1
  229. package/dist/fromArray.js.map +1 -1
  230. package/dist/fromDequeue.d.ts +5 -0
  231. package/dist/fromDequeue.d.ts.map +1 -0
  232. package/dist/fromDequeue.js +21 -0
  233. package/dist/fromDequeue.js.map +1 -0
  234. package/dist/fromEffect.d.ts.map +1 -1
  235. package/dist/fromEffect.js +10 -2
  236. package/dist/fromEffect.js.map +1 -1
  237. package/dist/fromEmitter.d.ts.map +1 -1
  238. package/dist/fromEmitter.js +4 -5
  239. package/dist/fromEmitter.js.map +1 -1
  240. package/dist/fromFxEffect.d.ts.map +1 -1
  241. package/dist/fromFxEffect.js +1 -1
  242. package/dist/fromFxEffect.js.map +1 -1
  243. package/dist/fromHub.d.ts +5 -0
  244. package/dist/fromHub.d.ts.map +1 -0
  245. package/dist/fromHub.js +7 -0
  246. package/dist/fromHub.js.map +1 -0
  247. package/dist/fromIterable.js +1 -1
  248. package/dist/fromIterable.js.map +1 -1
  249. package/dist/fromStream.d.ts +4 -0
  250. package/dist/fromStream.d.ts.map +1 -0
  251. package/dist/fromStream.js +7 -0
  252. package/dist/fromStream.js.map +1 -0
  253. package/dist/helpers.d.ts +3 -2
  254. package/dist/helpers.d.ts.map +1 -1
  255. package/dist/helpers.js +28 -69
  256. package/dist/helpers.js.map +1 -1
  257. package/dist/hold.d.ts +2 -4
  258. package/dist/hold.d.ts.map +1 -1
  259. package/dist/hold.js +0 -4
  260. package/dist/hold.js.map +1 -1
  261. package/dist/index.d.ts +36 -1
  262. package/dist/index.d.ts.map +1 -1
  263. package/dist/index.js +132 -116
  264. package/dist/index.js.map +1 -1
  265. package/dist/keyed.d.ts.map +1 -1
  266. package/dist/keyed.js +24 -13
  267. package/dist/keyed.js.map +1 -1
  268. package/dist/mergeAll.d.ts.map +1 -1
  269. package/dist/mergeAll.js +1 -1
  270. package/dist/mergeAll.js.map +1 -1
  271. package/dist/mergeBufferConcurrently.d.ts +8 -0
  272. package/dist/mergeBufferConcurrently.d.ts.map +1 -0
  273. package/dist/mergeBufferConcurrently.js +68 -0
  274. package/dist/mergeBufferConcurrently.js.map +1 -0
  275. package/dist/mergeConcurrently.d.ts +3 -0
  276. package/dist/mergeConcurrently.d.ts.map +1 -0
  277. package/dist/mergeConcurrently.js +42 -0
  278. package/dist/mergeConcurrently.js.map +1 -0
  279. package/dist/multicast.d.ts +5 -5
  280. package/dist/multicast.d.ts.map +1 -1
  281. package/dist/multicast.js +15 -15
  282. package/dist/multicast.js.map +1 -1
  283. package/dist/never.js +1 -1
  284. package/dist/never.js.map +1 -1
  285. package/dist/observe.d.ts +3 -0
  286. package/dist/observe.d.ts.map +1 -1
  287. package/dist/observe.js +9 -6
  288. package/dist/observe.js.map +1 -1
  289. package/dist/onExit.d.ts +5 -0
  290. package/dist/onExit.d.ts.map +1 -0
  291. package/dist/onExit.js +6 -0
  292. package/dist/onExit.js.map +1 -0
  293. package/dist/orElse.d.ts +4 -0
  294. package/dist/orElse.d.ts.map +1 -0
  295. package/dist/orElse.js +7 -0
  296. package/dist/orElse.js.map +1 -0
  297. package/dist/promise.js +4 -4
  298. package/dist/promise.js.map +1 -1
  299. package/dist/provide.d.ts.map +1 -1
  300. package/dist/provide.js +6 -3
  301. package/dist/provide.js.map +1 -1
  302. package/dist/skipRepeats.d.ts +1 -1
  303. package/dist/skipRepeats.d.ts.map +1 -1
  304. package/dist/skipRepeats.js +4 -6
  305. package/dist/skipRepeats.js.map +1 -1
  306. package/dist/skipWhile.js +1 -1
  307. package/dist/skipWhile.js.map +1 -1
  308. package/dist/slice.js +3 -3
  309. package/dist/slice.js.map +1 -1
  310. package/dist/struct.d.ts +5 -0
  311. package/dist/struct.d.ts.map +1 -0
  312. package/dist/struct.js +6 -0
  313. package/dist/struct.js.map +1 -0
  314. package/dist/switchMapCause.d.ts +1 -0
  315. package/dist/switchMapCause.d.ts.map +1 -1
  316. package/dist/switchMapCause.js +11 -1
  317. package/dist/switchMapCause.js.map +1 -1
  318. package/dist/switchMatch.js +1 -1
  319. package/dist/switchMatch.js.map +1 -1
  320. package/dist/takeWhile.js +1 -1
  321. package/dist/takeWhile.js.map +1 -1
  322. package/dist/tap.d.ts.map +1 -1
  323. package/dist/tap.js +1 -1
  324. package/dist/tap.js.map +1 -1
  325. package/dist/tapCause.d.ts.map +1 -1
  326. package/dist/tapCause.js +5 -2
  327. package/dist/tapCause.js.map +1 -1
  328. package/dist/test-utils.js +2 -2
  329. package/dist/test-utils.js.map +1 -1
  330. package/dist/toArray.d.ts.map +1 -1
  331. package/dist/toArray.js +2 -3
  332. package/dist/toArray.js.map +1 -1
  333. package/dist/toEnqueue.d.ts +6 -0
  334. package/dist/toEnqueue.d.ts.map +1 -0
  335. package/dist/toEnqueue.js +5 -0
  336. package/dist/toEnqueue.js.map +1 -0
  337. package/dist/toStream.d.ts +4 -0
  338. package/dist/toStream.d.ts.map +1 -0
  339. package/dist/toStream.js +8 -0
  340. package/dist/toStream.js.map +1 -0
  341. package/dist/tsconfig.cjs.build.tsbuildinfo +1 -1
  342. package/package.json +5 -5
  343. package/src/Computed.ts +114 -0
  344. package/src/Filtered.ts +112 -0
  345. package/src/Fx.ts +17 -42
  346. package/src/RefArray.ts +226 -0
  347. package/src/RefSubject.test.ts +67 -6
  348. package/src/RefSubject.ts +601 -581
  349. package/src/RefTransform.ts +134 -0
  350. package/src/Subject.ts +4 -13
  351. package/src/catchAllCause.ts +43 -2
  352. package/src/combineAll.ts +16 -13
  353. package/src/combineAllDiscard.ts +16 -13
  354. package/src/data-first.ts +10 -0
  355. package/src/empty.ts +1 -1
  356. package/src/exhaustMapCause.ts +1 -1
  357. package/src/exhaustMapLatestCause.ts +1 -1
  358. package/src/failCause.ts +4 -0
  359. package/src/filter.ts +1 -3
  360. package/src/filterMap.ts +8 -1
  361. package/src/fromArray.ts +1 -1
  362. package/src/fromDequeue.ts +39 -0
  363. package/src/fromEffect.ts +12 -2
  364. package/src/fromEmitter.ts +4 -10
  365. package/src/fromFxEffect.ts +3 -1
  366. package/src/fromHub.ts +10 -0
  367. package/src/fromIterable.ts +1 -1
  368. package/src/helpers.ts +73 -106
  369. package/src/hold.ts +1 -7
  370. package/src/index.ts +573 -607
  371. package/src/keyed.ts +45 -28
  372. package/src/mergeAll.ts +8 -5
  373. package/src/mergeBufferConcurrently.test.ts +37 -0
  374. package/src/mergeBufferConcurrently.ts +105 -0
  375. package/src/mergeConcurrently.test.ts +20 -0
  376. package/src/mergeConcurrently.ts +57 -0
  377. package/src/multicast.ts +30 -22
  378. package/src/never.ts +1 -1
  379. package/src/observe.ts +16 -7
  380. package/src/onExit.ts +13 -0
  381. package/src/orElse.ts +16 -0
  382. package/src/promise.ts +4 -4
  383. package/src/provide.ts +9 -7
  384. package/src/skipRepeats.ts +5 -7
  385. package/src/skipWhile.ts +1 -1
  386. package/src/slice.ts +3 -3
  387. package/src/struct.ts +18 -0
  388. package/src/switchMapCause.ts +17 -1
  389. package/src/switchMatch.ts +1 -1
  390. package/src/takeWhile.ts +1 -1
  391. package/src/tap.ts +5 -1
  392. package/src/tapCause.ts +8 -6
  393. package/src/test-utils.ts +2 -2
  394. package/src/toArray.ts +5 -4
  395. package/src/toEnqueue.ts +13 -0
  396. package/tsconfig.build.json +2 -1
  397. package/tsconfig.build.tsbuildinfo +1 -1
  398. package/vite.config.js +3 -0
@@ -0,0 +1,112 @@
1
+ import { pipe } from '@effect/data/Function'
2
+ import * as Option from '@effect/data/Option'
3
+ import * as Cause from '@effect/io/Cause'
4
+ import * as Effect from '@effect/io/Effect'
5
+
6
+ import { RefTransform, RefTransformImpl, RefTransformInput } from './RefTransform.js'
7
+ import { compact } from './filterMap.js'
8
+ import { switchMapEffect } from './switchMap.js'
9
+
10
+ export const FilteredTypeId = Symbol.for('@typed/fx/Filtered')
11
+ export type FilteredTypeId = typeof FilteredTypeId
12
+
13
+ export interface Filtered<R, E, A>
14
+ extends RefTransform<R, E, A, R, E | Cause.NoSuchElementException, A> {
15
+ readonly [FilteredTypeId]: FilteredTypeId
16
+
17
+ filterMapEffect<R2, E2, B>(
18
+ f: (a: A) => Effect.Effect<R2, E2, Option.Option<B>>,
19
+ ): Filtered<R | R2, E | E2, B>
20
+
21
+ filterMap<R2, E2, B>(f: (a: A) => Option.Option<B>): Filtered<R | R2, E | E2, B>
22
+
23
+ filter<R2, E2>(f: (a: A) => boolean): Filtered<R | R2, E | E2, A>
24
+
25
+ filterEffect<R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>): Filtered<R | R2, E | E2, A>
26
+
27
+ filterNot<R2, E2>(f: (a: A) => boolean): Filtered<R | R2, E | E2, A>
28
+
29
+ filterNotEffect<R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>): Filtered<R | R2, E | E2, A>
30
+
31
+ mapEffect<R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, B>): Filtered<R | R2, E | E2, B>
32
+
33
+ map<B>(f: (a: A) => B): Filtered<R, E, B>
34
+
35
+ /**
36
+ * @internal
37
+ */
38
+ version(): number
39
+ }
40
+
41
+ export class FilteredImpl<R, E, A, R2, E2, R3, E3, C>
42
+ extends RefTransformImpl<
43
+ R,
44
+ E,
45
+ A,
46
+ R2,
47
+ E2,
48
+ A,
49
+ R | R2 | R3,
50
+ E | E2 | E3,
51
+ C,
52
+ R | R2 | R3,
53
+ E | E2 | E3 | Cause.NoSuchElementException,
54
+ C
55
+ >
56
+ implements Filtered<R | R2 | R3, E | E2 | E3, C>
57
+ {
58
+ readonly [FilteredTypeId]: FilteredTypeId = FilteredTypeId
59
+
60
+ constructor(
61
+ input: RefTransformInput<R, E, A, R2, E2, A>,
62
+ f: (a: A) => Effect.Effect<R3, E3, Option.Option<C>>,
63
+ ) {
64
+ super(
65
+ input,
66
+ (fx) => compact(switchMapEffect(fx, f)),
67
+ (eff) => Effect.flatten(Effect.flatMap(eff, f)),
68
+ )
69
+ }
70
+
71
+ filterMapEffect<R4, E4, D>(
72
+ f: (a: C) => Effect.Effect<R4, E4, Option.Option<D>>,
73
+ ): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, D> {
74
+ return new FilteredImpl(this, f) as Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, D>
75
+ }
76
+
77
+ filterMap<D>(f: (a: C) => Option.Option<D>) {
78
+ return this.filterMapEffect((a) => Effect.sync(() => f(a)))
79
+ }
80
+
81
+ filterEffect<R4, E4>(
82
+ f: (a: C) => Effect.Effect<R4, E4, boolean>,
83
+ ): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, C> {
84
+ return this.filterMapEffect((a) =>
85
+ Effect.map(f(a), (b) => (b ? Option.some<C>(a) : Option.none<C>())),
86
+ )
87
+ }
88
+
89
+ filter(f: (a: C) => boolean) {
90
+ return this.filterEffect((a) => Effect.sync(() => f(a)))
91
+ }
92
+
93
+ filterNotEffect<R4, E4>(
94
+ f: (a: C) => Effect.Effect<R4, E4, boolean>,
95
+ ): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, C> {
96
+ return this.filterEffect((a) => Effect.map(f(a), (b) => !b))
97
+ }
98
+
99
+ filterNot(f: (a: C) => boolean) {
100
+ return this.filterNotEffect((a) => Effect.sync(() => f(a)))
101
+ }
102
+
103
+ mapEffect<R4, E4, D>(
104
+ f: (a: C) => Effect.Effect<R4, E4, D>,
105
+ ): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, D> {
106
+ return this.filterMapEffect((a) => pipe(a, f, Effect.map(Option.some)))
107
+ }
108
+
109
+ map<D>(f: (a: C) => D) {
110
+ return this.mapEffect((a) => Effect.sync(() => f(a)))
111
+ }
112
+ }
package/src/Fx.ts CHANGED
@@ -1,5 +1,3 @@
1
- import type { Trace } from '@effect/data/Debug'
2
- import { methodWithTrace } from '@effect/data/Debug'
3
1
  import { identity } from '@effect/data/Function'
4
2
  import type { Cause } from '@effect/io/Cause'
5
3
  import type { Effect } from '@effect/io/Effect'
@@ -16,28 +14,24 @@ export interface Fx<out R, out E, out A> {
16
14
  }
17
15
 
18
16
  readonly run: <R2>(sink: Sink<R2, E, A>) => Effect<R | R2, never, void>
17
+ }
19
18
 
20
- readonly addTrace: (trace: Trace) => Fx<R, E, A>
19
+ const fxVariance = {
20
+ _R: identity,
21
+ _E: identity,
22
+ _A: identity,
21
23
  }
22
24
 
23
25
  export const make: <R, E, A>(
24
26
  run: <R2>(sink: Sink<R2, E, A>) => Effect<R | R2, never, void>,
25
- ) => Fx<R, E, A> = methodWithTrace(
26
- (trace) =>
27
- function Fx<R, E, A>(run: Fx<R, E, A>['run']): Fx<R, E, A> {
28
- const fx: Fx<R, E, A> = {
29
- [FxTypeId]: {
30
- _R: identity,
31
- _E: identity,
32
- _A: identity,
33
- },
34
- run: methodWithTrace((inner) => (sink) => run(sink).traced(inner).traced(trace)),
35
- addTrace: (inner) => Traced(Traced(fx, inner), trace),
36
- }
27
+ ) => Fx<R, E, A> = function Fx<R, E, A>(run: Fx<R, E, A>['run']): Fx<R, E, A> {
28
+ const fx: Fx<R, E, A> = {
29
+ [FxTypeId]: fxVariance,
30
+ run,
31
+ }
37
32
 
38
- return fx
39
- },
40
- )
33
+ return fx
34
+ }
41
35
 
42
36
  export function Fx<R, E, A>(
43
37
  run: <R2>(sink: Sink<R2, E, A>) => Effect<R | R2, never, void>,
@@ -45,29 +39,10 @@ export function Fx<R, E, A>(
45
39
  return make(run)
46
40
  }
47
41
 
48
- export function Traced<R, E, A>(fx: Fx<R, E, A>, trace: Trace): Fx<R, E, A> {
49
- const traced: Fx<R, E, A> = {
50
- [FxTypeId]: {
51
- _R: identity,
52
- _E: identity,
53
- _A: identity,
54
- },
55
- run: (sink) =>
56
- fx
57
- .run(
58
- Sink(
59
- (a: A) => sink.event(a).traced(trace),
60
- (cause: Cause<E>) => sink.error(cause).traced(trace),
61
- ),
62
- )
63
- .traced(trace),
64
- addTrace: (trace) => Traced(traced, trace),
65
- }
66
-
67
- return traced
68
- }
69
-
70
42
  export namespace Fx {
43
+ export type Any = Fx<any, any, any>
44
+ export type TupleAny = ReadonlyArray<Any>
45
+
71
46
  export type Cancel = Runtime.Cancel<never, void>
72
47
 
73
48
  export type ResourcesOf<T> = [T] extends [never]
@@ -99,8 +74,8 @@ export function Sink<A, R, E, R2>(
99
74
  error: (e: Cause<E>) => Effect<R2, never, void>,
100
75
  ): Sink<R | R2, E, A> {
101
76
  return {
102
- event: methodWithTrace((trace) => (a: A) => event(a).traced(trace)),
103
- error: methodWithTrace((trace) => (e: Cause<E>) => error(e).traced(trace)),
77
+ event,
78
+ error,
104
79
  }
105
80
  }
106
81
 
@@ -0,0 +1,226 @@
1
+ import { pipe } from '@effect/data/Function'
2
+ import * as Option from '@effect/data/Option'
3
+ import * as Order from '@effect/data/Order'
4
+ import * as ReadonlyArray from '@effect/data/ReadonlyArray'
5
+ import * as Equivalence from '@effect/data/Equivalence'
6
+ import * as Effect from '@effect/io/Effect'
7
+ import * as Scope from '@effect/io/Scope'
8
+ import fastDeepEqual from 'fast-deep-equal/es6'
9
+
10
+ import { Computed } from './Computed.js'
11
+ import { RefSubject, makeRef } from './RefSubject.js'
12
+
13
+ export interface RefArray<E, A> extends RefSubject<E, readonly A[]> {
14
+ /**
15
+ * Append values to the end of the array contained within the RefSubject
16
+ */
17
+ readonly append: (...as: readonly A[]) => Effect.Effect<never, E, readonly A[]>
18
+
19
+ /**
20
+ * Returns true if the array contains the given value.
21
+ */
22
+ readonly contains: (a: A) => Effect.Effect<never, E, boolean>
23
+
24
+ /**
25
+ * Drops the first `n` values from the array contained within the RefSubject
26
+ */
27
+ readonly drop: (n: number) => Effect.Effect<never, E, readonly A[]>
28
+
29
+ /**
30
+ * Drops the last `n` values from the array contained within the RefSubject
31
+ */
32
+ readonly dropRight: (n: number) => Effect.Effect<never, E, readonly A[]>
33
+
34
+ /**
35
+ * Drops values from the array contained within the RefSubject as long as the predicate returns true
36
+ */
37
+ readonly dropWhile: (predicate: (a: A) => boolean) => Effect.Effect<never, E, readonly A[]>
38
+
39
+ /**
40
+ * Filter the values contained within the RefSubject.
41
+ */
42
+ readonly filterValues: (
43
+ predicate: (a: A, index: number) => boolean,
44
+ ) => Effect.Effect<never, E, readonly A[]>
45
+
46
+ /**
47
+ * Retrieve the value at a given index from the array contained within the RefSubject.
48
+ */
49
+ readonly getIndex: (index: number) => Effect.Effect<never, E, Option.Option<A>>
50
+
51
+ /**
52
+ * Creates a computed value which will group the values contained within the RefSubject by the given function.
53
+ */
54
+ readonly groupBy: (f: (a: A) => string) => Computed<never, E, Record<string, readonly A[]>>
55
+
56
+ /**
57
+ * Insert a value at the given index into the array contained within the RefSubject.
58
+ */
59
+ readonly insertAt: (index: number, a: A) => Effect.Effect<never, E, readonly A[]>
60
+
61
+ /**
62
+ * A Computed value which will be true if the array contained within the RefSubject is empty.
63
+ */
64
+ readonly isEmpty: Computed<never, E, boolean>
65
+
66
+ /**
67
+ * A Computed value which will be true if the array contained within the RefSubject is not empty.
68
+ */
69
+ readonly isNonEmpty: Computed<never, E, boolean>
70
+
71
+ /**
72
+ * A Computed value which will be true if the array contained within the RefSubject is not empty.
73
+ */
74
+ readonly length: Computed<never, E, number>
75
+
76
+ /**
77
+ * Map the values of the array contained within the RefSubject into a Computed value which will
78
+ * always be kept up-to-date.
79
+ */
80
+ readonly mapValues: <B>(f: (a: A, index: number) => B) => Computed<never, E, readonly B[]>
81
+
82
+ /**
83
+ * Modify the value at a given index in the array contained within the RefSubject.
84
+ */
85
+ readonly modifyAt: (index: number, f: (a: A) => A) => Effect.Effect<never, E, readonly A[]>
86
+
87
+ /**
88
+ * Split the array contained within the RefSubject into two arrays, one which contains the values
89
+ * which satisfy the predicate and one which contains the values which do not.
90
+ */
91
+ readonly partition: (
92
+ predicate: (a: A, index: number) => boolean,
93
+ ) => Computed<never, E, readonly [readonly A[], readonly A[]]>
94
+
95
+ /**
96
+ * Prepend values to the beginning of the array contained within the RefSubject
97
+ */
98
+ readonly prepend: (...as: readonly A[]) => Effect.Effect<never, E, readonly A[]>
99
+
100
+ /**
101
+ * Reduce the values contained within the RefSubject into a single value returning a Computed
102
+ * which will always be kept up-to-date.
103
+ */
104
+ readonly reduce: <B>(b: B, f: (b: B, a: A, index: number) => B) => Computed<never, E, B>
105
+
106
+ /**
107
+ * Reduce the values, from last index to first, contained within the RefSubject into a single value returning a Computed
108
+ * which will always be kept up-to-date.
109
+ */
110
+ readonly reduceRight: <B>(b: B, f: (b: B, a: A, index: number) => B) => Computed<never, E, B>
111
+
112
+ /**
113
+ * Replace the value at a given index in the array contained within the RefSubject.
114
+ */
115
+ readonly replaceAt: (index: number, a: A) => Effect.Effect<never, E, readonly A[]>
116
+
117
+ /**
118
+ * Rotate the values in the array contained within the RefSubject by the given number of places.
119
+ * Very helpful for carousel-like functionality.
120
+ */
121
+ readonly rotate: (n: number) => Effect.Effect<never, E, readonly A[]>
122
+
123
+ /**
124
+ * Sort the values in the array contained within the RefSubject by the given ordering.
125
+ */
126
+ readonly sortBy: (...orders: Order.Order<A>[]) => Effect.Effect<never, E, readonly A[]>
127
+
128
+ /**
129
+ * Take the first `n` values from the array contained within the RefSubject
130
+ */
131
+ readonly take: (n: number) => Effect.Effect<never, E, readonly A[]>
132
+
133
+ /**
134
+ * Take the last `n` values from the array contained within the RefSubject
135
+ */
136
+ readonly takeRight: (n: number) => Effect.Effect<never, E, readonly A[]>
137
+
138
+ /**
139
+ * Take values from the array contained within the RefSubject as long as the predicate returns true
140
+ */
141
+ readonly takeWhile: (predicate: (a: A) => boolean) => Effect.Effect<never, E, readonly A[]>
142
+
143
+ /**
144
+ * Removes any duplicates held within the array contained within the RefSubject.
145
+ */
146
+ readonly dedupe: Effect.Effect<never, E, readonly A[]>
147
+ }
148
+
149
+ export function makeRefArray<R, E, A>(
150
+ initial: Effect.Effect<R, E, readonly A[]>,
151
+ eq: Equivalence.Equivalence<A> = fastDeepEqual,
152
+ ): Effect.Effect<R | Scope.Scope, never, RefArray<E, A>> {
153
+ return Effect.gen(function* ($) {
154
+ const arrayEq = Equivalence.array(eq)
155
+ const ref = yield* $(makeRef(initial, arrayEq))
156
+ const isEmpty = ref.map(ReadonlyArray.isEmptyReadonlyArray)
157
+ const isNonEmpty = ref.map(ReadonlyArray.isNonEmptyReadonlyArray)
158
+ const length = ref.map(ReadonlyArray.length)
159
+ const getIndex = (index: number) => ref.map(ReadonlyArray.get(index))
160
+ const prepend = (...as: readonly A[]) => ref.update(ReadonlyArray.prependAll(as))
161
+ const append = (...as: readonly A[]) => ref.update(ReadonlyArray.appendAll(as))
162
+ const insertAt = (index: number, a: A) =>
163
+ ref.update((as) =>
164
+ pipe(
165
+ as,
166
+ ReadonlyArray.insertAt(index, a),
167
+ Option.getOrElse(() => as),
168
+ ),
169
+ )
170
+ const replaceAt = (index: number, a: A) =>
171
+ ref.update((as) => pipe(as, ReadonlyArray.replace(index, a)))
172
+ const modifyAt = (index: number, f: (a: A) => A) => ref.update(ReadonlyArray.modify(index, f))
173
+ const take = (n: number) => ref.update(ReadonlyArray.take(n))
174
+ const takeRight = (n: number) => ref.update(ReadonlyArray.takeRight(n))
175
+ const drop = (n: number) => ref.update(ReadonlyArray.drop(n))
176
+ const dropRight = (n: number) => ref.update(ReadonlyArray.dropRight(n))
177
+ const takeWhile = (predicate: (a: A) => boolean) =>
178
+ ref.update(ReadonlyArray.takeWhile(predicate))
179
+ const dropWhile = (predicate: (a: A) => boolean) =>
180
+ ref.update(ReadonlyArray.dropWhile(predicate))
181
+ const sortBy = (...orders: Order.Order<A>[]) => ref.update(ReadonlyArray.sortBy<A>(...orders))
182
+ const rotate = (n: number) => ref.update(ReadonlyArray.rotate(n))
183
+ const contains_ = ReadonlyArray.containsWith(eq)
184
+ const contains = (a: A) => ref.map<boolean>(contains_(a))
185
+ const dedupe = ref.update(ReadonlyArray.dedupeWith(eq))
186
+ const groupBy = (f: (a: A) => string) => ref.map(ReadonlyArray.groupBy(f))
187
+ const filterValues = (predicate: (a: A, index: number) => boolean) =>
188
+ ref.update(ReadonlyArray.filter(predicate))
189
+ const partition = (predicate: (a: A, index: number) => boolean) =>
190
+ ref.map(ReadonlyArray.partition(predicate))
191
+
192
+ const mapValues = <B>(f: (a: A, index: number) => B) => ref.map(ReadonlyArray.map(f))
193
+ const reduce = <B>(b: B, f: (b: B, a: A, index: number) => B) =>
194
+ ref.map(ReadonlyArray.reduce(b, f))
195
+ const reduceRight = <B>(b: B, f: (b: B, a: A, index: number) => B) =>
196
+ ref.map(ReadonlyArray.reduceRight(b, f))
197
+
198
+ return Object.assign(ref, {
199
+ append,
200
+ contains,
201
+ drop,
202
+ dropRight,
203
+ dropWhile,
204
+ filterValues,
205
+ getIndex,
206
+ groupBy,
207
+ insertAt,
208
+ isEmpty,
209
+ isNonEmpty,
210
+ length,
211
+ mapValues,
212
+ modifyAt,
213
+ partition,
214
+ prepend,
215
+ reduce,
216
+ reduceRight,
217
+ replaceAt,
218
+ rotate,
219
+ sortBy,
220
+ take,
221
+ takeRight,
222
+ takeWhile,
223
+ dedupe,
224
+ })
225
+ })
226
+ }
@@ -20,7 +20,7 @@ describe('RefSubject', () => {
20
20
  deepStrictEqual(value, 1)
21
21
  })
22
22
 
23
- await Effect.runPromise(test)
23
+ await Effect.runPromise(Effect.scoped(test))
24
24
  })
25
25
  })
26
26
 
@@ -33,7 +33,7 @@ describe('RefSubject', () => {
33
33
  deepStrictEqual(yield* $(ref.get), 2)
34
34
  })
35
35
 
36
- await Effect.runPromise(test)
36
+ await Effect.runPromise(Effect.scoped(test))
37
37
  })
38
38
  })
39
39
 
@@ -46,7 +46,7 @@ describe('RefSubject', () => {
46
46
  deepStrictEqual(yield* $(ref.get), 2)
47
47
  })
48
48
 
49
- await Effect.runPromise(test)
49
+ await Effect.runPromise(Effect.scoped(test))
50
50
  })
51
51
  })
52
52
 
@@ -59,7 +59,7 @@ describe('RefSubject', () => {
59
59
  deepStrictEqual(yield* $(ref.get), 2)
60
60
  })
61
61
 
62
- await Effect.runPromise(test)
62
+ await Effect.runPromise(Effect.scoped(test))
63
63
  })
64
64
  })
65
65
 
@@ -78,7 +78,7 @@ describe('RefSubject', () => {
78
78
  deepStrictEqual(yield* $(ref.delete), Option.some(1))
79
79
  })
80
80
 
81
- await Effect.runPromise(test)
81
+ await Effect.runPromise(Effect.scoped(test))
82
82
  })
83
83
  })
84
84
 
@@ -146,6 +146,67 @@ describe('RefSubject', () => {
146
146
 
147
147
  await Effect.runPromise(test)
148
148
  })
149
+
150
+ it('does not recompute value when underlying ref has not changed', async () => {
151
+ const test = Effect.scoped(
152
+ Effect.gen(function* ($) {
153
+ let calls = 0
154
+ const ref = yield* $(makeRef(Effect.succeed(1)))
155
+ const addOne = ref.map((x) => {
156
+ calls++
157
+ return x + 1
158
+ })
159
+
160
+ deepStrictEqual(yield* $(addOne), 2)
161
+ deepStrictEqual(yield* $(addOne), 2)
162
+ deepStrictEqual(yield* $(addOne), 2)
163
+ deepStrictEqual(calls, 1)
164
+
165
+ yield* $(ref.update((x) => x + 1))
166
+
167
+ deepStrictEqual(yield* $(addOne), 3)
168
+ deepStrictEqual(yield* $(addOne), 3)
169
+ deepStrictEqual(yield* $(addOne), 3)
170
+ deepStrictEqual(calls, 2)
171
+ }),
172
+ )
173
+
174
+ await Effect.runPromise(test)
175
+ })
176
+
177
+ it('does not recompute value when underlying ref has not changed with multiple layers', async () => {
178
+ const test = Effect.scoped(
179
+ Effect.gen(function* ($) {
180
+ let addOneCalls = 0
181
+ let multiplyTwoCalls = 0
182
+ const ref = yield* $(makeRef(Effect.succeed(1)))
183
+ const addOne = ref.map((x) => {
184
+ addOneCalls++
185
+ return x + 1
186
+ })
187
+ const multiplyTwo = addOne.map((a) => {
188
+ multiplyTwoCalls++
189
+ return a * 2
190
+ })
191
+
192
+ deepStrictEqual(yield* $(multiplyTwo), 4)
193
+ deepStrictEqual(yield* $(multiplyTwo), 4)
194
+ deepStrictEqual(yield* $(multiplyTwo), 4)
195
+ deepStrictEqual(addOneCalls, 1)
196
+ deepStrictEqual(multiplyTwoCalls, 1)
197
+
198
+ yield* $(ref.update((x) => x + 1))
199
+
200
+ deepStrictEqual(yield* $(multiplyTwo), 6)
201
+ deepStrictEqual(yield* $(multiplyTwo), 6)
202
+ deepStrictEqual(yield* $(multiplyTwo), 6)
203
+ deepStrictEqual(addOneCalls, 2)
204
+ deepStrictEqual(multiplyTwoCalls, 2)
205
+ }),
206
+ )
207
+
208
+ await Effect.runPromise(test)
209
+ })
149
210
  })
150
211
  })
151
212
 
@@ -350,7 +411,7 @@ describe('RefSubject', () => {
350
411
  deepStrictEqual(yield* $(c.get), 4)
351
412
  })
352
413
 
353
- await Effect.runPromise(test)
414
+ await Effect.runPromise(Effect.scoped(test))
354
415
  })
355
416
  })
356
417
  })