@typed/fx 1.19.0 → 1.20.1

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 (411) hide show
  1. package/AsyncData/package.json +6 -0
  2. package/Push/package.json +6 -0
  3. package/dist/cjs/AsyncData.js +177 -0
  4. package/dist/cjs/AsyncData.js.map +1 -0
  5. package/dist/cjs/Emitter.js +24 -21
  6. package/dist/cjs/Emitter.js.map +1 -1
  7. package/dist/cjs/Form.js +78 -21
  8. package/dist/cjs/Form.js.map +1 -1
  9. package/dist/cjs/FormEntry.js +75 -48
  10. package/dist/cjs/FormEntry.js.map +1 -1
  11. package/dist/cjs/Fx.js +517 -872
  12. package/dist/cjs/Fx.js.map +1 -1
  13. package/dist/cjs/Guard.js +21 -13
  14. package/dist/cjs/Guard.js.map +1 -1
  15. package/dist/cjs/Idle.js +49 -37
  16. package/dist/cjs/Idle.js.map +1 -1
  17. package/dist/cjs/Match.js +99 -61
  18. package/dist/cjs/Match.js.map +1 -1
  19. package/dist/cjs/Pull.js.map +1 -1
  20. package/dist/cjs/Push.js +168 -0
  21. package/dist/cjs/Push.js.map +1 -0
  22. package/dist/cjs/RefArray.js +32 -30
  23. package/dist/cjs/RefArray.js.map +1 -1
  24. package/dist/cjs/RefChunk.js +26 -24
  25. package/dist/cjs/RefChunk.js.map +1 -1
  26. package/dist/cjs/RefHashMap.js +20 -20
  27. package/dist/cjs/RefHashMap.js.map +1 -1
  28. package/dist/cjs/RefHashSet.js +11 -8
  29. package/dist/cjs/RefHashSet.js.map +1 -1
  30. package/dist/cjs/RefSubject.js +904 -158
  31. package/dist/cjs/RefSubject.js.map +1 -1
  32. package/dist/cjs/Sink.js +588 -62
  33. package/dist/cjs/Sink.js.map +1 -1
  34. package/dist/cjs/Stream.js +15 -10
  35. package/dist/cjs/Stream.js.map +1 -1
  36. package/dist/cjs/Subject.js +156 -55
  37. package/dist/cjs/Subject.js.map +1 -1
  38. package/dist/cjs/TypeId.js +10 -5
  39. package/dist/cjs/TypeId.js.map +1 -1
  40. package/dist/cjs/Typeclass.js +28 -31
  41. package/dist/cjs/Typeclass.js.map +1 -1
  42. package/dist/cjs/Versioned.js +118 -57
  43. package/dist/cjs/Versioned.js.map +1 -1
  44. package/dist/cjs/index.js +44 -8
  45. package/dist/cjs/index.js.map +1 -1
  46. package/dist/cjs/internal/{deferred-ref.js → DeferredRef.js} +45 -13
  47. package/dist/cjs/internal/DeferredRef.js.map +1 -0
  48. package/dist/cjs/internal/UnionToTuple.js +6 -0
  49. package/dist/cjs/internal/UnionToTuple.js.map +1 -0
  50. package/dist/cjs/internal/core.js +1590 -779
  51. package/dist/cjs/internal/core.js.map +1 -1
  52. package/dist/cjs/internal/diff.js +114 -0
  53. package/dist/cjs/internal/diff.js.map +1 -0
  54. package/dist/cjs/internal/effect-loop-operator.js +288 -0
  55. package/dist/cjs/internal/effect-loop-operator.js.map +1 -0
  56. package/dist/cjs/internal/effect-operator.js +46 -37
  57. package/dist/cjs/internal/effect-operator.js.map +1 -1
  58. package/dist/cjs/internal/effect-producer.js +74 -0
  59. package/dist/cjs/internal/effect-producer.js.map +1 -0
  60. package/dist/cjs/internal/helpers.js +158 -128
  61. package/dist/cjs/internal/helpers.js.map +1 -1
  62. package/dist/cjs/internal/keyed.js +136 -173
  63. package/dist/cjs/internal/keyed.js.map +1 -1
  64. package/dist/cjs/internal/loop-operator.js +213 -0
  65. package/dist/cjs/internal/loop-operator.js.map +1 -0
  66. package/dist/cjs/internal/operator.js +79 -0
  67. package/dist/cjs/internal/operator.js.map +1 -0
  68. package/dist/cjs/internal/protos.js +19 -81
  69. package/dist/cjs/internal/protos.js.map +1 -1
  70. package/dist/cjs/internal/provide.js +47 -25
  71. package/dist/cjs/internal/provide.js.map +1 -1
  72. package/dist/cjs/internal/requestIdleCallback.js +5 -5
  73. package/dist/cjs/internal/requestIdleCallback.js.map +1 -1
  74. package/dist/cjs/internal/share.js +12 -15
  75. package/dist/cjs/internal/share.js.map +1 -1
  76. package/dist/cjs/internal/sync-operator.js +50 -22
  77. package/dist/cjs/internal/sync-operator.js.map +1 -1
  78. package/dist/cjs/internal/sync-producer.js +114 -0
  79. package/dist/cjs/internal/sync-producer.js.map +1 -0
  80. package/dist/cjs/internal/withKey.js +45 -51
  81. package/dist/cjs/internal/withKey.js.map +1 -1
  82. package/dist/dts/AsyncData.d.ts +185 -0
  83. package/dist/dts/AsyncData.d.ts.map +1 -0
  84. package/dist/dts/Emitter.d.ts +13 -20
  85. package/dist/dts/Emitter.d.ts.map +1 -1
  86. package/dist/dts/Form.d.ts +45 -28
  87. package/dist/dts/Form.d.ts.map +1 -1
  88. package/dist/dts/FormEntry.d.ts +25 -13
  89. package/dist/dts/FormEntry.d.ts.map +1 -1
  90. package/dist/dts/Fx.d.ts +980 -1390
  91. package/dist/dts/Fx.d.ts.map +1 -1
  92. package/dist/dts/Guard.d.ts +8 -1
  93. package/dist/dts/Guard.d.ts.map +1 -1
  94. package/dist/dts/Idle.d.ts +3 -3
  95. package/dist/dts/Idle.d.ts.map +1 -1
  96. package/dist/dts/Match.d.ts +8 -8
  97. package/dist/dts/Match.d.ts.map +1 -1
  98. package/dist/dts/Pull.d.ts +5 -5
  99. package/dist/dts/Pull.d.ts.map +1 -1
  100. package/dist/dts/Push.d.ts +170 -0
  101. package/dist/dts/Push.d.ts.map +1 -0
  102. package/dist/dts/RefArray.d.ts +21 -23
  103. package/dist/dts/RefArray.d.ts.map +1 -1
  104. package/dist/dts/RefChunk.d.ts +17 -19
  105. package/dist/dts/RefChunk.d.ts.map +1 -1
  106. package/dist/dts/RefHashMap.d.ts +19 -20
  107. package/dist/dts/RefHashMap.d.ts.map +1 -1
  108. package/dist/dts/RefHashSet.d.ts +12 -16
  109. package/dist/dts/RefHashSet.d.ts.map +1 -1
  110. package/dist/dts/RefSubject.d.ts +413 -184
  111. package/dist/dts/RefSubject.d.ts.map +1 -1
  112. package/dist/dts/Sink.d.ts +193 -93
  113. package/dist/dts/Sink.d.ts.map +1 -1
  114. package/dist/dts/Stream.d.ts +7 -1
  115. package/dist/dts/Stream.d.ts.map +1 -1
  116. package/dist/dts/Subject.d.ts +27 -36
  117. package/dist/dts/Subject.d.ts.map +1 -1
  118. package/dist/dts/TypeId.d.ts +10 -0
  119. package/dist/dts/TypeId.d.ts.map +1 -1
  120. package/dist/dts/Typeclass.d.ts +2 -2
  121. package/dist/dts/Typeclass.d.ts.map +1 -1
  122. package/dist/dts/Versioned.d.ts +50 -78
  123. package/dist/dts/Versioned.d.ts.map +1 -1
  124. package/dist/dts/index.d.ts +66 -6
  125. package/dist/dts/index.d.ts.map +1 -1
  126. package/dist/dts/internal/DeferredRef.d.ts +20 -0
  127. package/dist/dts/internal/DeferredRef.d.ts.map +1 -0
  128. package/dist/dts/internal/UnionToTuple.d.ts +6 -0
  129. package/dist/dts/internal/UnionToTuple.d.ts.map +1 -0
  130. package/dist/dts/internal/core.d.ts +218 -450
  131. package/dist/dts/internal/core.d.ts.map +1 -1
  132. package/dist/dts/internal/diff.d.ts +38 -0
  133. package/dist/dts/internal/diff.d.ts.map +1 -0
  134. package/dist/dts/internal/effect-loop-operator.d.ts +34 -0
  135. package/dist/dts/internal/effect-loop-operator.d.ts.map +1 -0
  136. package/dist/dts/internal/effect-operator.d.ts +8 -5
  137. package/dist/dts/internal/effect-operator.d.ts.map +1 -1
  138. package/dist/dts/internal/effect-producer.d.ts +25 -0
  139. package/dist/dts/internal/effect-producer.d.ts.map +1 -0
  140. package/dist/dts/internal/helpers.d.ts +33 -24
  141. package/dist/dts/internal/helpers.d.ts.map +1 -1
  142. package/dist/dts/internal/keyed.d.ts +3 -3
  143. package/dist/dts/internal/keyed.d.ts.map +1 -1
  144. package/dist/dts/internal/loop-operator.d.ts +40 -0
  145. package/dist/dts/internal/loop-operator.d.ts.map +1 -0
  146. package/dist/dts/internal/operator.d.ts +16 -0
  147. package/dist/dts/internal/operator.d.ts.map +1 -0
  148. package/dist/dts/internal/protos.d.ts +16 -43
  149. package/dist/dts/internal/protos.d.ts.map +1 -1
  150. package/dist/dts/internal/provide.d.ts +7 -1
  151. package/dist/dts/internal/provide.d.ts.map +1 -1
  152. package/dist/dts/internal/share.d.ts +12 -9
  153. package/dist/dts/internal/share.d.ts.map +1 -1
  154. package/dist/dts/internal/sync-operator.d.ts +7 -3
  155. package/dist/dts/internal/sync-operator.d.ts.map +1 -1
  156. package/dist/dts/internal/sync-producer.d.ts +36 -0
  157. package/dist/dts/internal/sync-producer.d.ts.map +1 -0
  158. package/dist/dts/internal/withKey.d.ts +3 -3
  159. package/dist/dts/internal/withKey.d.ts.map +1 -1
  160. package/dist/esm/AsyncData.js +151 -0
  161. package/dist/esm/AsyncData.js.map +1 -0
  162. package/dist/esm/Emitter.js +24 -21
  163. package/dist/esm/Emitter.js.map +1 -1
  164. package/dist/esm/Form.js +69 -14
  165. package/dist/esm/Form.js.map +1 -1
  166. package/dist/esm/FormEntry.js +77 -52
  167. package/dist/esm/FormEntry.js.map +1 -1
  168. package/dist/esm/Fx.js +509 -874
  169. package/dist/esm/Fx.js.map +1 -1
  170. package/dist/esm/Guard.js +5 -1
  171. package/dist/esm/Guard.js.map +1 -1
  172. package/dist/esm/Idle.js +49 -39
  173. package/dist/esm/Idle.js.map +1 -1
  174. package/dist/esm/Match.js +103 -63
  175. package/dist/esm/Match.js.map +1 -1
  176. package/dist/esm/Pull.js.map +1 -1
  177. package/dist/esm/Push.js +159 -0
  178. package/dist/esm/Push.js.map +1 -0
  179. package/dist/esm/RefArray.js +32 -30
  180. package/dist/esm/RefArray.js.map +1 -1
  181. package/dist/esm/RefChunk.js +26 -24
  182. package/dist/esm/RefChunk.js.map +1 -1
  183. package/dist/esm/RefHashMap.js +20 -20
  184. package/dist/esm/RefHashMap.js.map +1 -1
  185. package/dist/esm/RefHashSet.js +11 -8
  186. package/dist/esm/RefHashSet.js.map +1 -1
  187. package/dist/esm/RefSubject.js +876 -150
  188. package/dist/esm/RefSubject.js.map +1 -1
  189. package/dist/esm/Sink.js +608 -57
  190. package/dist/esm/Sink.js.map +1 -1
  191. package/dist/esm/Stream.js +13 -9
  192. package/dist/esm/Stream.js.map +1 -1
  193. package/dist/esm/Subject.js +154 -56
  194. package/dist/esm/Subject.js.map +1 -1
  195. package/dist/esm/TypeId.js +9 -4
  196. package/dist/esm/TypeId.js.map +1 -1
  197. package/dist/esm/Typeclass.js +29 -29
  198. package/dist/esm/Typeclass.js.map +1 -1
  199. package/dist/esm/Versioned.js +110 -53
  200. package/dist/esm/Versioned.js.map +1 -1
  201. package/dist/esm/index.js +66 -6
  202. package/dist/esm/index.js.map +1 -1
  203. package/dist/esm/internal/DeferredRef.js +54 -0
  204. package/dist/esm/internal/DeferredRef.js.map +1 -0
  205. package/dist/esm/internal/UnionToTuple.js +2 -0
  206. package/dist/esm/internal/UnionToTuple.js.map +1 -0
  207. package/dist/esm/internal/core.js +1439 -719
  208. package/dist/esm/internal/core.js.map +1 -1
  209. package/dist/esm/internal/diff.js +82 -0
  210. package/dist/esm/internal/diff.js.map +1 -0
  211. package/dist/esm/internal/effect-loop-operator.js +269 -0
  212. package/dist/esm/internal/effect-loop-operator.js.map +1 -0
  213. package/dist/esm/internal/effect-operator.js +44 -37
  214. package/dist/esm/internal/effect-operator.js.map +1 -1
  215. package/dist/esm/internal/effect-producer.js +47 -0
  216. package/dist/esm/internal/effect-producer.js.map +1 -0
  217. package/dist/esm/internal/helpers.js +157 -129
  218. package/dist/esm/internal/helpers.js.map +1 -1
  219. package/dist/esm/internal/keyed.js +128 -139
  220. package/dist/esm/internal/keyed.js.map +1 -1
  221. package/dist/esm/internal/loop-operator.js +186 -0
  222. package/dist/esm/internal/loop-operator.js.map +1 -0
  223. package/dist/esm/internal/operator.js +68 -0
  224. package/dist/esm/internal/operator.js.map +1 -0
  225. package/dist/esm/internal/protos.js +16 -75
  226. package/dist/esm/internal/protos.js.map +1 -1
  227. package/dist/esm/internal/provide.js +33 -25
  228. package/dist/esm/internal/provide.js.map +1 -1
  229. package/dist/esm/internal/requestIdleCallback.js +5 -5
  230. package/dist/esm/internal/requestIdleCallback.js.map +1 -1
  231. package/dist/esm/internal/share.js +12 -12
  232. package/dist/esm/internal/share.js.map +1 -1
  233. package/dist/esm/internal/sync-operator.js +49 -21
  234. package/dist/esm/internal/sync-operator.js.map +1 -1
  235. package/dist/esm/internal/sync-producer.js +88 -0
  236. package/dist/esm/internal/sync-producer.js.map +1 -0
  237. package/dist/esm/internal/withKey.js +46 -47
  238. package/dist/esm/internal/withKey.js.map +1 -1
  239. package/package.json +22 -62
  240. package/src/AsyncData.ts +447 -0
  241. package/src/Emitter.ts +47 -38
  242. package/src/Form.ts +185 -65
  243. package/src/FormEntry.ts +142 -109
  244. package/src/Fx.ts +1682 -1854
  245. package/src/Guard.ts +12 -1
  246. package/src/Idle.ts +76 -62
  247. package/src/Match.ts +149 -93
  248. package/src/Pull.ts +8 -8
  249. package/src/Push.ts +472 -0
  250. package/src/RefArray.ts +53 -51
  251. package/src/RefChunk.ts +44 -41
  252. package/src/RefHashMap.ts +57 -43
  253. package/src/RefHashSet.ts +21 -31
  254. package/src/RefSubject.ts +2003 -446
  255. package/src/Sink.ts +922 -171
  256. package/src/Stream.ts +32 -20
  257. package/src/Subject.ts +236 -87
  258. package/src/TypeId.ts +16 -4
  259. package/src/Typeclass.ts +31 -32
  260. package/src/Versioned.ts +220 -168
  261. package/src/index.ts +78 -6
  262. package/src/internal/DeferredRef.ts +62 -0
  263. package/src/internal/UnionToTuple.ts +11 -0
  264. package/src/internal/core.ts +2491 -1950
  265. package/src/internal/diff.ts +157 -0
  266. package/src/internal/effect-loop-operator.ts +466 -0
  267. package/src/internal/effect-operator.ts +89 -54
  268. package/src/internal/effect-producer.ts +125 -0
  269. package/src/internal/helpers.ts +275 -205
  270. package/src/internal/keyed.ts +192 -241
  271. package/src/internal/loop-operator.ts +266 -0
  272. package/src/internal/operator.ts +87 -0
  273. package/src/internal/protos.ts +29 -104
  274. package/src/internal/provide.ts +48 -40
  275. package/src/internal/requestIdleCallback.ts +5 -6
  276. package/src/internal/share.ts +26 -24
  277. package/src/internal/sync-operator.ts +68 -27
  278. package/src/internal/sync-producer.ts +146 -0
  279. package/src/internal/withKey.ts +64 -74
  280. package/Computed/package.json +0 -6
  281. package/Filtered/package.json +0 -6
  282. package/Model/package.json +0 -6
  283. package/RefAsyncData/package.json +0 -6
  284. package/RefAsyncDataArray/package.json +0 -6
  285. package/RefBoolean/package.json +0 -6
  286. package/RefNumber/package.json +0 -6
  287. package/dist/cjs/Computed.js +0 -115
  288. package/dist/cjs/Computed.js.map +0 -1
  289. package/dist/cjs/Filtered.js +0 -95
  290. package/dist/cjs/Filtered.js.map +0 -1
  291. package/dist/cjs/Model.js +0 -119
  292. package/dist/cjs/Model.js.map +0 -1
  293. package/dist/cjs/RefAsyncData.js +0 -187
  294. package/dist/cjs/RefAsyncData.js.map +0 -1
  295. package/dist/cjs/RefAsyncDataArray.js +0 -38
  296. package/dist/cjs/RefAsyncDataArray.js.map +0 -1
  297. package/dist/cjs/RefBoolean.js +0 -45
  298. package/dist/cjs/RefBoolean.js.map +0 -1
  299. package/dist/cjs/RefNumber.js +0 -49
  300. package/dist/cjs/RefNumber.js.map +0 -1
  301. package/dist/cjs/internal/core-ref-subject.js +0 -254
  302. package/dist/cjs/internal/core-ref-subject.js.map +0 -1
  303. package/dist/cjs/internal/core-subject.js +0 -108
  304. package/dist/cjs/internal/core-subject.js.map +0 -1
  305. package/dist/cjs/internal/deferred-ref.js.map +0 -1
  306. package/dist/cjs/internal/effect-primitive.js +0 -47
  307. package/dist/cjs/internal/effect-primitive.js.map +0 -1
  308. package/dist/cjs/internal/fx-effect-proto.js +0 -58
  309. package/dist/cjs/internal/fx-effect-proto.js.map +0 -1
  310. package/dist/cjs/internal/fx-primitive.js +0 -193
  311. package/dist/cjs/internal/fx-primitive.js.map +0 -1
  312. package/dist/cjs/internal/fx.js +0 -240
  313. package/dist/cjs/internal/fx.js.map +0 -1
  314. package/dist/cjs/internal/matchers.js +0 -34
  315. package/dist/cjs/internal/matchers.js.map +0 -1
  316. package/dist/cjs/internal/run.js +0 -54
  317. package/dist/cjs/internal/run.js.map +0 -1
  318. package/dist/cjs/internal/schema-ref-subject.js +0 -132
  319. package/dist/cjs/internal/schema-ref-subject.js.map +0 -1
  320. package/dist/cjs/internal/versioned-transform.js +0 -46
  321. package/dist/cjs/internal/versioned-transform.js.map +0 -1
  322. package/dist/dts/Computed.d.ts +0 -106
  323. package/dist/dts/Computed.d.ts.map +0 -1
  324. package/dist/dts/Filtered.d.ts +0 -97
  325. package/dist/dts/Filtered.d.ts.map +0 -1
  326. package/dist/dts/Model.d.ts +0 -200
  327. package/dist/dts/Model.d.ts.map +0 -1
  328. package/dist/dts/RefAsyncData.d.ts +0 -236
  329. package/dist/dts/RefAsyncData.d.ts.map +0 -1
  330. package/dist/dts/RefAsyncDataArray.d.ts +0 -56
  331. package/dist/dts/RefAsyncDataArray.d.ts.map +0 -1
  332. package/dist/dts/RefBoolean.d.ts +0 -47
  333. package/dist/dts/RefBoolean.d.ts.map +0 -1
  334. package/dist/dts/RefNumber.d.ts +0 -48
  335. package/dist/dts/RefNumber.d.ts.map +0 -1
  336. package/dist/dts/internal/core-ref-subject.d.ts +0 -100
  337. package/dist/dts/internal/core-ref-subject.d.ts.map +0 -1
  338. package/dist/dts/internal/core-subject.d.ts +0 -5
  339. package/dist/dts/internal/core-subject.d.ts.map +0 -1
  340. package/dist/dts/internal/deferred-ref.d.ts +0 -12
  341. package/dist/dts/internal/deferred-ref.d.ts.map +0 -1
  342. package/dist/dts/internal/effect-primitive.d.ts +0 -6
  343. package/dist/dts/internal/effect-primitive.d.ts.map +0 -1
  344. package/dist/dts/internal/fx-effect-proto.d.ts +0 -30
  345. package/dist/dts/internal/fx-effect-proto.d.ts.map +0 -1
  346. package/dist/dts/internal/fx-primitive.d.ts +0 -109
  347. package/dist/dts/internal/fx-primitive.d.ts.map +0 -1
  348. package/dist/dts/internal/fx.d.ts +0 -245
  349. package/dist/dts/internal/fx.d.ts.map +0 -1
  350. package/dist/dts/internal/matchers.d.ts +0 -33
  351. package/dist/dts/internal/matchers.d.ts.map +0 -1
  352. package/dist/dts/internal/run.d.ts +0 -8
  353. package/dist/dts/internal/run.d.ts.map +0 -1
  354. package/dist/dts/internal/schema-ref-subject.d.ts +0 -5
  355. package/dist/dts/internal/schema-ref-subject.d.ts.map +0 -1
  356. package/dist/dts/internal/versioned-transform.d.ts +0 -17
  357. package/dist/dts/internal/versioned-transform.d.ts.map +0 -1
  358. package/dist/esm/Computed.js +0 -103
  359. package/dist/esm/Computed.js.map +0 -1
  360. package/dist/esm/Filtered.js +0 -83
  361. package/dist/esm/Filtered.js.map +0 -1
  362. package/dist/esm/Model.js +0 -100
  363. package/dist/esm/Model.js.map +0 -1
  364. package/dist/esm/RefAsyncData.js +0 -163
  365. package/dist/esm/RefAsyncData.js.map +0 -1
  366. package/dist/esm/RefAsyncDataArray.js +0 -27
  367. package/dist/esm/RefAsyncDataArray.js.map +0 -1
  368. package/dist/esm/RefBoolean.js +0 -31
  369. package/dist/esm/RefBoolean.js.map +0 -1
  370. package/dist/esm/RefNumber.js +0 -35
  371. package/dist/esm/RefNumber.js.map +0 -1
  372. package/dist/esm/internal/core-ref-subject.js +0 -242
  373. package/dist/esm/internal/core-ref-subject.js.map +0 -1
  374. package/dist/esm/internal/core-subject.js +0 -90
  375. package/dist/esm/internal/core-subject.js.map +0 -1
  376. package/dist/esm/internal/deferred-ref.js +0 -23
  377. package/dist/esm/internal/deferred-ref.js.map +0 -1
  378. package/dist/esm/internal/effect-primitive.js +0 -41
  379. package/dist/esm/internal/effect-primitive.js.map +0 -1
  380. package/dist/esm/internal/fx-effect-proto.js +0 -43
  381. package/dist/esm/internal/fx-effect-proto.js.map +0 -1
  382. package/dist/esm/internal/fx-primitive.js +0 -175
  383. package/dist/esm/internal/fx-primitive.js.map +0 -1
  384. package/dist/esm/internal/fx.js +0 -216
  385. package/dist/esm/internal/fx.js.map +0 -1
  386. package/dist/esm/internal/matchers.js +0 -38
  387. package/dist/esm/internal/matchers.js.map +0 -1
  388. package/dist/esm/internal/run.js +0 -32
  389. package/dist/esm/internal/run.js.map +0 -1
  390. package/dist/esm/internal/schema-ref-subject.js +0 -121
  391. package/dist/esm/internal/schema-ref-subject.js.map +0 -1
  392. package/dist/esm/internal/versioned-transform.js +0 -37
  393. package/dist/esm/internal/versioned-transform.js.map +0 -1
  394. package/src/Computed.ts +0 -289
  395. package/src/Filtered.ts +0 -274
  396. package/src/Model.ts +0 -483
  397. package/src/RefAsyncData.ts +0 -547
  398. package/src/RefAsyncDataArray.ts +0 -135
  399. package/src/RefBoolean.ts +0 -71
  400. package/src/RefNumber.ts +0 -77
  401. package/src/internal/core-ref-subject.ts +0 -528
  402. package/src/internal/core-subject.ts +0 -143
  403. package/src/internal/deferred-ref.ts +0 -26
  404. package/src/internal/effect-primitive.ts +0 -230
  405. package/src/internal/fx-effect-proto.ts +0 -56
  406. package/src/internal/fx-primitive.ts +0 -223
  407. package/src/internal/fx.ts +0 -619
  408. package/src/internal/matchers.ts +0 -83
  409. package/src/internal/run.ts +0 -51
  410. package/src/internal/schema-ref-subject.ts +0 -163
  411. package/src/internal/versioned-transform.ts +0 -48
@@ -0,0 +1,266 @@
1
+ import type { Either } from "effect"
2
+ import * as Option from "effect/Option"
3
+ import * as Sink from "../Sink.js"
4
+ import type { Bounds } from "./bounds.js"
5
+ import * as SyncOp from "./sync-operator.js"
6
+
7
+ export type SyncLoopOperator<B = any, A = any, C = any> =
8
+ | LoopOperator<B, A, C>
9
+ | FilterMapLoopOperator<B, A, C>
10
+
11
+ export interface LoopOperator<B, A, C> {
12
+ readonly _tag: "Loop"
13
+ readonly seed: B
14
+ readonly f: (acc: B, a: A) => readonly [C, B]
15
+ }
16
+
17
+ export function LoopOperator<const B, A, C>(seed: B, f: (acc: B, a: A) => readonly [C, B]): LoopOperator<B, A, C> {
18
+ return { _tag: "Loop", seed, f }
19
+ }
20
+
21
+ export interface FilterMapLoopOperator<B, A, C> {
22
+ readonly _tag: "FilterMapLoop"
23
+ readonly seed: B
24
+ readonly f: (acc: B, a: A) => readonly [Option.Option<C>, B]
25
+ }
26
+
27
+ export function FilterMapLoopOperator<const B, A, C>(
28
+ seed: B,
29
+ f: (acc: B, a: A) => readonly [Option.Option<C>, B]
30
+ ): FilterMapLoopOperator<B, A, C> {
31
+ return { _tag: "FilterMapLoop", seed, f }
32
+ }
33
+
34
+ export interface SliceOperator {
35
+ readonly _tag: "Slice"
36
+ readonly bounds: Bounds
37
+ }
38
+
39
+ export function SliceOperator(bounds: Bounds): SliceOperator {
40
+ return { _tag: "Slice", bounds }
41
+ }
42
+
43
+ export interface FilterMapSliceOperator<A, B, C> {
44
+ readonly _tag: "FilterMapSlice"
45
+ readonly seed: B
46
+ readonly f: (acc: B, a: A) => Either.Either<Option.Option<C>, readonly [Option.Option<C>, B]>
47
+ }
48
+
49
+ export function FilterMapSliceOperator<const B, A, C>(
50
+ seed: B,
51
+ f: (acc: B, a: A) => Either.Either<Option.Option<C>, readonly [Option.Option<C>, B]>
52
+ ): FilterMapSliceOperator<A, B, C> {
53
+ return { _tag: "FilterMapSlice", seed, f }
54
+ }
55
+
56
+ export function matchSyncLoopOperator<A, B, C, D>(operator: SyncLoopOperator<A, B, C>, matchers: {
57
+ Loop: (op: LoopOperator<A, B, C>) => D
58
+ FilterMapLoop: (op: FilterMapLoopOperator<A, B, C>) => D
59
+ }): D {
60
+ if (operator._tag === "Loop") {
61
+ return matchers.Loop(operator)
62
+ } else {
63
+ return matchers.FilterMapLoop(operator)
64
+ }
65
+ }
66
+
67
+ export function fuseSyncOperatorBefore(
68
+ syncOp: SyncOp.SyncOperator,
69
+ loopOp: SyncLoopOperator
70
+ ): SyncLoopOperator {
71
+ return SyncOp.matchSyncOperator(syncOp, {
72
+ Map: (op): SyncLoopOperator =>
73
+ matchSyncLoopOperator(loopOp, {
74
+ Loop: (lOp): SyncLoopOperator => LoopOperator(lOp.seed, (acc, a) => lOp.f(acc, op.f(a))),
75
+ FilterMapLoop: (lOp) => FilterMapLoopOperator(lOp.seed, (acc, a) => lOp.f(acc, op.f(a)))
76
+ }),
77
+ Filter: (op) =>
78
+ matchSyncLoopOperator(loopOp, {
79
+ Loop: (lOp): SyncLoopOperator =>
80
+ FilterMapLoopOperator(lOp.seed, (acc, a) => {
81
+ const [b, c] = lOp.f(acc, a)
82
+ if (op.f(b)) {
83
+ return [Option.some(b), c]
84
+ } else {
85
+ return [Option.none(), c]
86
+ }
87
+ }),
88
+ FilterMapLoop: (lOp) =>
89
+ FilterMapLoopOperator(lOp.seed, (acc, a) => {
90
+ if (op.f(a)) {
91
+ return [Option.none(), acc]
92
+ } else {
93
+ return lOp.f(acc, a)
94
+ }
95
+ })
96
+ }),
97
+ FilterMap: (op) =>
98
+ matchSyncLoopOperator(loopOp, {
99
+ Loop: (lOp): SyncLoopOperator =>
100
+ FilterMapLoopOperator(lOp.seed, (acc, a) => {
101
+ const x = op.f(a)
102
+
103
+ if (Option.isNone(x)) {
104
+ return [Option.none(), acc]
105
+ } else {
106
+ const [b, c] = lOp.f(acc, x.value)
107
+ return [Option.some(b), c]
108
+ }
109
+ }),
110
+ FilterMapLoop: (lOp) =>
111
+ FilterMapLoopOperator(lOp.seed, (acc, a) => {
112
+ const x = op.f(a)
113
+
114
+ if (Option.isNone(x)) {
115
+ return [Option.none(), acc]
116
+ } else {
117
+ return lOp.f(acc, x.value)
118
+ }
119
+ })
120
+ })
121
+ })
122
+ }
123
+
124
+ export function fuseSyncOperatorAfter(
125
+ loopOp: SyncLoopOperator,
126
+ syncOp: SyncOp.SyncOperator
127
+ ): SyncLoopOperator {
128
+ return matchSyncLoopOperator(loopOp, {
129
+ Loop: (loopOp) =>
130
+ SyncOp.matchSyncOperator(syncOp, {
131
+ Map: (op): SyncLoopOperator =>
132
+ LoopOperator(loopOp.seed, (acc, a) => {
133
+ const [b, c] = loopOp.f(acc, a)
134
+ return [op.f(b), c]
135
+ }),
136
+ Filter: (op) =>
137
+ FilterMapLoopOperator(loopOp.seed, (acc, a) => {
138
+ const [b, c] = loopOp.f(acc, a)
139
+ if (op.f(b)) {
140
+ return [Option.some(b), c]
141
+ } else {
142
+ return [Option.none(), c]
143
+ }
144
+ }),
145
+ FilterMap: (op) =>
146
+ FilterMapLoopOperator(loopOp.seed, (acc, a) => {
147
+ const [b, c] = loopOp.f(acc, a)
148
+ return Option.match(op.f(b), {
149
+ onNone: () => [Option.none(), c],
150
+ onSome: (d) => [Option.some(d), c]
151
+ })
152
+ })
153
+ }),
154
+ FilterMapLoop: (loopOp) =>
155
+ SyncOp.matchSyncOperator(syncOp, {
156
+ Map: (op): SyncLoopOperator =>
157
+ FilterMapLoopOperator(loopOp.seed, (acc, a) => {
158
+ const [b, c] = loopOp.f(acc, a)
159
+ return [Option.map(b, op.f), c]
160
+ }),
161
+ Filter: (op) =>
162
+ FilterMapLoopOperator(loopOp.seed, (acc, a) => {
163
+ const [b, c] = loopOp.f(acc, a)
164
+ return [Option.filter(b, op.f), c]
165
+ }),
166
+ FilterMap: (op) =>
167
+ FilterMapLoopOperator(loopOp.seed, (acc, a) => {
168
+ const [b, c] = loopOp.f(acc, a)
169
+ return [Option.flatMap(b, op.f), c]
170
+ })
171
+ })
172
+ })
173
+ }
174
+
175
+ export function fuseLoopOperators<A, B, C, D, E>(
176
+ first: SyncLoopOperator<A, B, C>,
177
+ second: SyncLoopOperator<D, C, E>
178
+ ): SyncLoopOperator<readonly [A, D], B, E> {
179
+ return matchSyncLoopOperator(first, {
180
+ Loop: (op1) =>
181
+ matchSyncLoopOperator(second, {
182
+ Loop: (op2): SyncLoopOperator<readonly [A, D], B, E> =>
183
+ LoopOperator([op1.seed, op2.seed], ([accA, accB], a: B) => {
184
+ const [c, b] = op1.f(accA, a)
185
+ const [e, d] = op2.f(accB, c)
186
+ return [e, [b, d]]
187
+ }),
188
+ FilterMapLoop: (op2) =>
189
+ FilterMapLoopOperator([op1.seed, op2.seed], ([accA, accB], a) => {
190
+ const [c, b] = op1.f(accA, a)
191
+ const [e, d] = op2.f(accB, c)
192
+ return [e, [b, d]]
193
+ })
194
+ }),
195
+ FilterMapLoop: (op1) =>
196
+ matchSyncLoopOperator(second, {
197
+ Loop: (op2): SyncLoopOperator<readonly [A, D], B, E> =>
198
+ FilterMapLoopOperator([op1.seed, op2.seed], ([accA, accB], a: B) => {
199
+ const [c, b] = op1.f(accA, a)
200
+ if (Option.isNone(c)) {
201
+ return [Option.none(), [b, accB]] as const
202
+ }
203
+ const [e, d] = op2.f(accB, c.value)
204
+ return [Option.some(e), [b, d]] as const
205
+ }),
206
+ FilterMapLoop: (op2) =>
207
+ FilterMapLoopOperator([op1.seed, op2.seed], ([accA, accB], a) => {
208
+ const [c, b] = op1.f(accA, a)
209
+ if (Option.isNone(c)) {
210
+ return [Option.none(), [b, accB]]
211
+ }
212
+ const [e, d] = op2.f(accB, c.value)
213
+ return [e, [b, d]]
214
+ })
215
+ })
216
+ })
217
+ }
218
+
219
+ export function compileLoopOperatorSink<R>(operator: SyncLoopOperator, sink: Sink.Sink<R, any, any>) {
220
+ return matchSyncLoopOperator(operator, {
221
+ Loop: (op) => Sink.loop(sink, op.seed, op.f),
222
+ FilterMapLoop: (op) => Sink.filterMapLoop(sink, op.seed, op.f)
223
+ })
224
+ }
225
+
226
+ export function compileCauseLoopOperatorSink<R>(operator: SyncLoopOperator, sink: Sink.Sink<R, any, any>) {
227
+ return matchSyncLoopOperator(operator, {
228
+ Loop: (op) => Sink.loopCause(sink, op.seed, op.f),
229
+ FilterMapLoop: (op) => Sink.filterMapLoopCause(sink, op.seed, op.f)
230
+ })
231
+ }
232
+
233
+ export function applyArray<A, B>(array: ReadonlyArray<A>, operator: SyncLoopOperator): ReadonlyArray<B> {
234
+ return matchSyncLoopOperator(operator, {
235
+ Loop: (op) => loopArray(array, op.seed, op.f),
236
+ FilterMapLoop: (op) => filterMapLoopArray(array, op.seed, op.f)
237
+ })
238
+ }
239
+
240
+ function loopArray<A, B, C>(array: ReadonlyArray<A>, seed: B, f: (acc: B, a: A) => readonly [C, B]): ReadonlyArray<C> {
241
+ const result = new Array<C>(array.length)
242
+ let acc = seed
243
+ for (let i = 0; i < array.length; i++) {
244
+ const [c, b] = f(acc, array[i])
245
+ result[i] = c
246
+ acc = b
247
+ }
248
+ return result
249
+ }
250
+
251
+ function filterMapLoopArray<A, B, C>(
252
+ array: ReadonlyArray<A>,
253
+ seed: B,
254
+ f: (acc: B, a: A) => readonly [Option.Option<C>, B]
255
+ ): ReadonlyArray<C> {
256
+ const result = new Array<C>()
257
+ let acc = seed
258
+ for (let i = 0; i < array.length; i++) {
259
+ const [option, b] = f(acc, array[i])
260
+ if (Option.isSome(option)) {
261
+ result.push(option.value)
262
+ }
263
+ acc = b
264
+ }
265
+ return result
266
+ }
@@ -0,0 +1,87 @@
1
+ import type { Sink } from "../Sink"
2
+ import * as EffectLoopOp from "./effect-loop-operator.js"
3
+ import * as EffectOp from "./effect-operator.js"
4
+ import * as LoopOp from "./loop-operator.js"
5
+ import * as SyncOp from "./sync-operator.js"
6
+
7
+ export type Operator =
8
+ | SyncOp.SyncOperator
9
+ | EffectOp.EffectOperator
10
+ | LoopOp.SyncLoopOperator
11
+ | EffectLoopOp.EffectLoopOperator
12
+
13
+ export function matchOperator<A>(operator: Operator, matchers: {
14
+ SyncOperator: (op: SyncOp.SyncOperator) => A
15
+ EffectOperator: (op: EffectOp.EffectOperator) => A
16
+ SyncLoopOperator: (op: LoopOp.SyncLoopOperator) => A
17
+ EffectLoopOperator: (op: EffectLoopOp.EffectLoopOperator) => A
18
+ }): A {
19
+ switch (operator._tag) {
20
+ case "Map":
21
+ case "Filter":
22
+ case "FilterMap":
23
+ return matchers.SyncOperator(operator)
24
+ case "MapEffect":
25
+ case "TapEffect":
26
+ case "FilterEffect":
27
+ case "FilterMapEffect":
28
+ return matchers.EffectOperator(operator)
29
+ case "Loop":
30
+ case "FilterMapLoop":
31
+ return matchers.SyncLoopOperator(operator)
32
+ case "LoopEffect":
33
+ case "FilterMapLoopEffect":
34
+ return matchers.EffectLoopOperator(operator)
35
+ }
36
+ }
37
+
38
+ export function fuseOperators(first: Operator, second: Operator): Operator {
39
+ return matchOperator(first, {
40
+ SyncOperator: (op1) =>
41
+ matchOperator(second, {
42
+ SyncOperator: (op2): Operator => SyncOp.fuseSyncOperators(op1, op2),
43
+ EffectOperator: (op2) => EffectOp.fuseEffectOperators(EffectOp.liftSyncOperator(op1), op2),
44
+ SyncLoopOperator: (op2) => LoopOp.fuseSyncOperatorBefore(op1, op2),
45
+ EffectLoopOperator: (op2) => EffectLoopOp.fuseSyncOperatorBefore(op1, op2)
46
+ }),
47
+ EffectOperator: (op1) =>
48
+ matchOperator(second, {
49
+ SyncOperator: (op2): Operator => EffectOp.fuseEffectOperators(op1, EffectOp.liftSyncOperator(op2)),
50
+ EffectOperator: (op2) => EffectOp.fuseEffectOperators(op1, op2),
51
+ SyncLoopOperator: (op2) => EffectLoopOp.fuseEffectOperatorBefore(op1, EffectLoopOp.liftLoopOperator(op2)),
52
+ EffectLoopOperator: (op2) => EffectLoopOp.fuseEffectOperatorBefore(op1, op2)
53
+ }),
54
+ SyncLoopOperator: (op1) =>
55
+ matchOperator(second, {
56
+ SyncOperator: (op2): Operator => LoopOp.fuseSyncOperatorAfter(op1, op2),
57
+ EffectOperator: (op2) => EffectLoopOp.fuseEffectOperatorAfter(EffectLoopOp.liftLoopOperator(op1), op2),
58
+ SyncLoopOperator: (op2) => LoopOp.fuseLoopOperators(op1, op2),
59
+ EffectLoopOperator: (op2) => EffectLoopOp.fuseSyncLoopOperatorBefore(op1, op2)
60
+ }),
61
+ EffectLoopOperator: (op1) =>
62
+ matchOperator(second, {
63
+ SyncOperator: (op2): Operator => EffectLoopOp.fuseSyncOperatorAfter(op1, op2),
64
+ EffectOperator: (op2) => EffectLoopOp.fuseEffectOperatorAfter(op1, op2),
65
+ SyncLoopOperator: (op2) => EffectLoopOp.fuseSyncLoopOperatorAfter(op1, op2),
66
+ EffectLoopOperator: (op2) => EffectLoopOp.fuseLoopEffectOperators(op1, op2)
67
+ })
68
+ })
69
+ }
70
+
71
+ export function compileOperatorSink<R, R2>(operator: Operator, sink: Sink<R, any, any>): Sink<R | R2, any, any> {
72
+ return matchOperator(operator, {
73
+ SyncOperator: (op) => SyncOp.compileSyncOperatorSink(op, sink),
74
+ EffectOperator: (op) => EffectOp.compileEffectOperatorSink(op, sink),
75
+ SyncLoopOperator: (op) => LoopOp.compileLoopOperatorSink(op, sink),
76
+ EffectLoopOperator: (op) => EffectLoopOp.compileLoopEffectOperatorSink(op, sink)
77
+ })
78
+ }
79
+
80
+ export function compileOperatorSinkCause<R, R2>(operator: Operator, sink: Sink<R, any, any>): Sink<R | R2, any, any> {
81
+ return matchOperator(operator, {
82
+ SyncOperator: (op) => SyncOp.compileCauseSyncOperatorSink(op, sink),
83
+ EffectOperator: (op) => EffectOp.compileCauseEffectOperatorSink(op, sink),
84
+ SyncLoopOperator: (op) => LoopOp.compileCauseLoopOperatorSink(op, sink),
85
+ EffectLoopOperator: (op) => EffectLoopOp.compileCauseLoopEffectOperatorSinkCause(op, sink)
86
+ })
87
+ }
@@ -1,132 +1,57 @@
1
- import * as Effect from "effect/Effect"
2
- import * as Equal from "effect/Equal"
1
+ import type { Effect } from "effect"
2
+ import * as Effectable from "effect/Effectable"
3
3
  import { identity } from "effect/Function"
4
- import * as Hash from "effect/Hash"
5
4
  import { pipeArguments } from "effect/Pipeable"
6
-
7
- import { Effectable } from "effect"
8
- import * as Fiber from "effect/Fiber"
9
- import { NodeInspectSymbol } from "effect/Inspectable"
10
- import type { Inspectable } from "effect/Inspectable"
11
- import type { Fx, ToFx } from "../Fx.js"
5
+ import type { Fx } from "../Fx.js"
6
+ import type { Sink } from "../Sink.js"
12
7
  import { TypeId } from "../TypeId.js"
13
8
 
14
- export const Variance: Fx<any, any, any>[TypeId] = {
9
+ const Variance: Fx.Variance<never, never, never> = {
15
10
  _R: identity,
16
11
  _E: identity,
17
12
  _A: identity
18
13
  }
19
14
 
20
- export abstract class BaseProto implements Equal.Equal, Hash.Hash, Inspectable {
21
- [Equal.symbol](that: unknown) {
22
- return this === that
23
- }
15
+ export abstract class FxBase<R, E, A> implements Fx<R, E, A> {
16
+ readonly [TypeId]: Fx.Variance<R, E, A> = Variance
24
17
 
25
- [Hash.symbol]() {
26
- return Hash.random(this)
27
- }
18
+ abstract run<R2>(sink: Sink<R2, E, A>): Effect.Effect<R | R2, never, unknown>
28
19
 
29
20
  pipe() {
30
21
  return pipeArguments(this, arguments)
31
22
  }
32
-
33
- toJSON(): unknown {
34
- return this
35
- }
36
-
37
- [NodeInspectSymbol]() {
38
- return this.toJSON()
39
- }
40
-
41
- toString() {
42
- return JSON.stringify(this.toJSON())
43
- }
44
23
  }
45
24
 
46
- export abstract class FxProto<R, E, A> extends BaseProto implements Fx<R, E, A> {
47
- abstract readonly _fxTag: string
48
- readonly [TypeId]: Fx<R, E, A>[TypeId] = Variance
49
-
50
- constructor(
51
- readonly i0?: unknown,
52
- readonly i1?: unknown,
53
- readonly i2?: unknown
54
- ) {
55
- super()
56
- }
57
-
58
- [Equal.symbol](that: unknown) {
59
- return this === that
60
- }
61
-
62
- [Hash.symbol]() {
63
- return Hash.random(this)
64
- }
65
-
66
- toJSON(): unknown {
67
- return this
68
- }
69
-
70
- pipe() {
71
- return pipeArguments(this, arguments)
72
- }
73
- }
25
+ export abstract class FxEffectBase<R, E, A, R2, E2, B> extends Effectable.StructuralClass<R2, E2, B>
26
+ implements Fx<R, E, A>, Effect.Effect<R2, E2, B>
27
+ {
28
+ readonly [TypeId]: Fx.Variance<R, E, A> = Variance
74
29
 
75
- export class OnceEffect<R, E, A> extends Effectable.Class<R, E, A> {
76
- #fiber: Fiber.Fiber<E, A> | undefined
30
+ abstract run<R3>(sink: Sink<R3, E, A>): Effect.Effect<R | R3, never, unknown>
77
31
 
78
- constructor(
79
- readonly effect: Effect.Effect<R, E, A>
80
- ) {
81
- super()
82
- }
32
+ abstract toEffect(): Effect.Effect<R2, E2, B>
83
33
 
84
- commit() {
85
- if (this.#fiber) {
86
- return Fiber.join(this.#fiber)
34
+ protected _effect: Effect.Effect<R2, E2, B> | undefined
35
+ commit(): Effect.Effect<R2, E2, B> {
36
+ if (this._effect === undefined) {
37
+ return (this._effect = this.toEffect())
87
38
  } else {
88
- return Effect.forkDaemon(this.effect).pipe(
89
- Effect.tap((fiber) => Effect.sync(() => this.#fiber = fiber)),
90
- Effect.flatMap(Fiber.join)
91
- )
39
+ return this._effect
92
40
  }
93
41
  }
94
42
  }
95
43
 
96
- export const once = <R, E, A>(effect: Effect.Effect<R, E, A>): Effect.Effect<R, E, A> => new OnceEffect(effect)
97
-
98
- // @ts-expect-error private properties don't quite work out
99
- export abstract class FxEffectBase<R, E, A, R2, E2, B> extends Effectable.StructuralClass<R2, E2, B>
100
- implements ToFx<R, E, A>
44
+ export abstract class EffectBase<R, E, A> extends Effectable.StructuralClass<R, E, A>
45
+ implements Effect.Effect<R, E, A>
101
46
  {
102
- _fxTag = "ToFx" as const
103
-
104
- readonly [TypeId] = Variance as any
105
-
106
- protected abstract toFx(): Fx<R, E, A>
107
- protected abstract toEffect(): Effect.Effect<R2, E2, B>
108
-
109
- private _fx: Fx<R, E, A> | undefined
110
-
111
- get fx(): Fx<R, E, A> {
112
- return this._fx ||= this.toFx()
113
- }
47
+ abstract toEffect(): Effect.Effect<R, E, A>
114
48
 
115
- private _effect: Effect.Effect<R2, E2, B> | undefined
116
-
117
- commit(): Effect.Effect<R2, E2, B> {
118
- return this._effect ||= this.toEffect()
119
- }
120
-
121
- toJSON(): unknown {
122
- return this
123
- }
124
-
125
- [NodeInspectSymbol]() {
126
- return this.toJSON()
127
- }
128
-
129
- toString() {
130
- return JSON.stringify(this.toJSON())
49
+ private _effect: Effect.Effect<R, E, A> | undefined
50
+ commit(): Effect.Effect<R, E, A> {
51
+ if (this._effect === undefined) {
52
+ return (this._effect = this.toEffect())
53
+ } else {
54
+ return this._effect
55
+ }
131
56
  }
132
57
  }
@@ -1,5 +1,10 @@
1
1
  import type * as Context from "@typed/context"
2
- import { Effect, FiberRefsPatch, Layer, Runtime, RuntimeFlags } from "effect"
2
+ import * as Effect from "effect/Effect"
3
+ import * as FiberRefsPatch from "effect/FiberRefsPatch"
4
+ import * as Layer from "effect/Layer"
5
+ import * as Runtime from "effect/Runtime"
6
+ import * as RuntimeFlags from "effect/RuntimeFlags"
7
+ import type * as Scope from "effect/Scope"
3
8
 
4
9
  export type Provide<R, E, A> =
5
10
  | ProvideContext<A>
@@ -82,62 +87,65 @@ export function merge<R = never, E = never, A = never, R2 = never, E2 = never, B
82
87
  self: Provide<R, E, A>,
83
88
  that: Provide<R2, E2, B>
84
89
  ): Provide<Exclude<R, B> | R2, E | E2, A | B> {
85
- return matchProvide(self, {
86
- ProvideContext: (a) => mergeLayer(Layer.succeedContext(a), that),
87
- ProvideLayer: (a) => mergeLayer(a, that),
88
- ProvideRuntime: (a) => mergeLayer(runtimeToLayer(a), that),
89
- ProvideService: (tag, service) => mergeLayer(Layer.succeed(tag, service), that),
90
- ProvideServiceEffect: (tag, service) => mergeLayer(Layer.effect(tag, service), that)
91
- })
90
+ return ProvideLayer(Layer.provideMerge(toLayer(self), toLayer(that)))
92
91
  }
93
92
 
94
- function mergeLayer<R, E, A, R2, E2, B>(
95
- layer: Layer.Layer<R, E, A>,
96
- provide: Provide<R2, E2, B>
97
- ): Provide<Exclude<R, B> | R2, E | E2, A | B> {
98
- return matchProvide(provide, {
99
- ProvideContext: (ctx) => ProvideLayer(Layer.provideMerge(layer, Layer.succeedContext(ctx))),
100
- ProvideLayer: (layerB) => ProvideLayer(Layer.provideMerge(layer, layerB)),
101
- ProvideRuntime: (runtime) => ProvideLayer(Layer.provideMerge(layer, runtimeToLayer(runtime))),
102
- ProvideService: (tag, service) => ProvideLayer(Layer.provideMerge(layer, Layer.succeed(tag, service))),
103
- ProvideServiceEffect: (tag, service) => ProvideLayer(Layer.provideMerge(layer, Layer.effect(tag, service)))
104
- })
93
+ export function buildWithScope<R, E, A>(
94
+ provide: Provide<R, E, A>,
95
+ scope: Scope.Scope
96
+ ) {
97
+ return Layer.buildWithScope(toLayer(provide), scope)
105
98
  }
106
99
 
107
- export function provideToEffect<R, E, A, R2 = never, E2 = never, S = never>(
108
- effect: Effect.Effect<R, E, A>,
109
- provide: Provide<R2, E2, S>
110
- ): Effect.Effect<Exclude<R, S> | R2, E | E2, A> {
100
+ export function toLayer<R, E, A>(provide: Provide<R, E, A>): Layer.Layer<R, E, A> {
111
101
  switch (provide._tag) {
112
102
  case "ProvideContext":
103
+ return Layer.succeedContext(provide.i0)
113
104
  case "ProvideLayer":
105
+ return provide.i0
114
106
  case "ProvideRuntime":
115
- return Effect.provide(effect, provide.i0 as Layer.Layer<R2, E2, S>)
107
+ return runtimeToLayer(provide.i0)
116
108
  case "ProvideService":
117
- return Effect.provideService(effect, provide.i0, provide.i1)
109
+ return Layer.succeed(provide.i0, provide.i1)
118
110
  case "ProvideServiceEffect":
119
- return Effect.provideServiceEffect(effect, provide.i0, provide.i1)
111
+ return Layer.effect(provide.i0, provide.i1)
120
112
  }
121
113
  }
122
114
 
123
- function runtimeToLayer<R>(runtime: Runtime.Runtime<R>): Layer.Layer<never, never, R> {
124
- const patchFlags = RuntimeFlags.diff(Runtime.defaultRuntime.runtimeFlags, runtime.runtimeFlags)
125
- const inversePatchFlags = RuntimeFlags.diff(runtime.runtimeFlags, Runtime.defaultRuntime.runtimeFlags)
115
+ export function provideToEffect<R, E, A, R2 = never, E2 = never, S = never>(
116
+ effect: Effect.Effect<R, E, A>,
117
+ provide: Provide<R2, E2, S>
118
+ ): Effect.Effect<Exclude<R, S> | R2, E | E2, A> {
119
+ return Effect.provide(effect, toLayer(provide))
120
+ }
121
+
122
+ export function runtimeToLayer<R>(runtime: Runtime.Runtime<R>): Layer.Layer<never, never, R> {
123
+ // Calculate patch
126
124
  const patchRefs = FiberRefsPatch.diff(Runtime.defaultRuntime.fiberRefs, runtime.fiberRefs)
127
- const inversePatchRefs = FiberRefsPatch.diff(runtime.fiberRefs, Runtime.defaultRuntime.fiberRefs)
125
+ const patchFlags = RuntimeFlags.diff(Runtime.defaultRuntime.runtimeFlags, runtime.runtimeFlags)
128
126
 
129
127
  return Layer.scopedContext(
130
- Effect.acquireUseRelease(
131
- Effect.flatMap(
132
- Effect.patchRuntimeFlags(patchFlags),
133
- () => Effect.patchFiberRefs(patchRefs)
134
- ),
135
- () => Effect.succeed(runtime.context),
136
- () =>
137
- Effect.flatMap(
138
- Effect.patchRuntimeFlags(inversePatchFlags),
139
- () => Effect.patchFiberRefs(inversePatchRefs)
128
+ Effect.Do.pipe(
129
+ // Get Current Refs + Flags
130
+ Effect.bind("oldRefs", () => Effect.getFiberRefs),
131
+ Effect.bind("oldFlags", () => Effect.getRuntimeFlags),
132
+ // Patch Refs + Flags
133
+ Effect.tap(() => Effect.patchFiberRefs(patchRefs)),
134
+ Effect.tap(() => Effect.patchRuntimeFlags(patchFlags)),
135
+ // Get the new Refs + Flags
136
+ Effect.bind("newRefs", () => Effect.getFiberRefs),
137
+ Effect.bind("newFlags", () => Effect.getRuntimeFlags),
138
+ // Calculate rollback patch
139
+ Effect.let("rollbackRefs", ({ newRefs, oldRefs }) => FiberRefsPatch.diff(newRefs, oldRefs)),
140
+ Effect.let("rollbackFlags", ({ newFlags, oldFlags }) => RuntimeFlags.diff(newFlags, oldFlags)),
141
+ // Apply the rollbacks when the current scope is closed
142
+ Effect.tap(({ rollbackFlags, rollbackRefs }) =>
143
+ Effect.addFinalizer(() =>
144
+ Effect.zipRight(Effect.patchFiberRefs(rollbackRefs), Effect.patchRuntimeFlags(rollbackFlags))
140
145
  )
146
+ ),
147
+ // Provide the runtime's context
148
+ Effect.map(() => runtime.context)
141
149
  )
142
150
  )
143
151
  }
@@ -3,17 +3,16 @@ export const requestIdleCallback = globalThis.requestIdleCallback || requestIdle
3
3
  export const cancelIdleCallback = globalThis.cancelIdleCallback || clearTimeout
4
4
 
5
5
  function requestIdleCallbackFallbackToSetTimeout(cb: IdleRequestCallback, options?: IdleRequestOptions) {
6
- return setTimeout(() => cb(makeIdleDeadline(Date.now(), options)))
6
+ return setTimeout(() => cb(makeIdleDeadline(Date.now(), options?.timeout)), 0)
7
7
  }
8
8
 
9
- function makeIdleDeadline(start: number, options?: IdleRequestOptions) {
10
- const timeout = options?.timeout ?? 50
11
-
12
- const timeRemaining = () => Math.max(0, timeout - (Date.now() - start))
9
+ function makeIdleDeadline(start: number, timeout?: number) {
10
+ const end = timeout === undefined ? Infinity : start + timeout
11
+ const timeRemaining = () => Math.max(0, 50 - (Date.now() - start))
13
12
 
14
13
  return {
15
14
  get didTimeout() {
16
- return timeRemaining() < 0
15
+ return Date.now() >= end
17
16
  },
18
17
  timeRemaining
19
18
  }