@livestore/utils 0.4.0-dev.9 → 0.5.0-dev.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 (316) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/NoopTracer.d.ts +7 -8
  3. package/dist/NoopTracer.d.ts.map +1 -1
  4. package/dist/NoopTracer.js +13 -15
  5. package/dist/NoopTracer.js.map +1 -1
  6. package/dist/NoopTracer.test.d.ts +2 -0
  7. package/dist/NoopTracer.test.d.ts.map +1 -0
  8. package/dist/NoopTracer.test.js +17 -0
  9. package/dist/NoopTracer.test.js.map +1 -0
  10. package/dist/binary.js +1 -1
  11. package/dist/binary.js.map +1 -1
  12. package/dist/browser/Opfs/Opfs.d.ts +201 -0
  13. package/dist/browser/Opfs/Opfs.d.ts.map +1 -0
  14. package/dist/browser/Opfs/Opfs.js +170 -0
  15. package/dist/browser/Opfs/Opfs.js.map +1 -0
  16. package/dist/browser/Opfs/debug-utils.d.ts +20 -0
  17. package/dist/browser/Opfs/debug-utils.d.ts.map +1 -0
  18. package/dist/browser/Opfs/debug-utils.js +95 -0
  19. package/dist/browser/Opfs/debug-utils.js.map +1 -0
  20. package/dist/browser/Opfs/mod.d.ts +4 -0
  21. package/dist/browser/Opfs/mod.d.ts.map +1 -0
  22. package/dist/browser/Opfs/mod.js +4 -0
  23. package/dist/browser/Opfs/mod.js.map +1 -0
  24. package/dist/browser/Opfs/utils.d.ts +71 -0
  25. package/dist/browser/Opfs/utils.d.ts.map +1 -0
  26. package/dist/browser/Opfs/utils.js +227 -0
  27. package/dist/browser/Opfs/utils.js.map +1 -0
  28. package/dist/browser/QuotaExceededError.d.ts +60 -0
  29. package/dist/browser/QuotaExceededError.d.ts.map +1 -0
  30. package/dist/browser/QuotaExceededError.js +2 -0
  31. package/dist/browser/QuotaExceededError.js.map +1 -0
  32. package/dist/browser/WebChannelBrowser.d.ts +22 -0
  33. package/dist/browser/WebChannelBrowser.d.ts.map +1 -0
  34. package/dist/browser/WebChannelBrowser.js +87 -0
  35. package/dist/browser/WebChannelBrowser.js.map +1 -0
  36. package/dist/browser/WebError.d.ts +389 -0
  37. package/dist/browser/WebError.d.ts.map +1 -0
  38. package/dist/browser/WebError.js +423 -0
  39. package/dist/browser/WebError.js.map +1 -0
  40. package/dist/browser/WebError.test.d.ts +2 -0
  41. package/dist/browser/WebError.test.d.ts.map +1 -0
  42. package/dist/browser/WebError.test.js +46 -0
  43. package/dist/browser/WebError.test.js.map +1 -0
  44. package/dist/browser/WebLock.d.ts.map +1 -0
  45. package/dist/{effect → browser}/WebLock.js +21 -21
  46. package/dist/browser/WebLock.js.map +1 -0
  47. package/dist/{browser.d.ts → browser/detect.d.ts} +1 -1
  48. package/dist/browser/detect.d.ts.map +1 -0
  49. package/dist/{browser.js → browser/detect.js} +7 -7
  50. package/dist/browser/detect.js.map +1 -0
  51. package/dist/browser/mod.d.ts +8 -0
  52. package/dist/browser/mod.d.ts.map +1 -0
  53. package/dist/browser/mod.js +8 -0
  54. package/dist/browser/mod.js.map +1 -0
  55. package/dist/cuid/cuid.browser.js +1 -1
  56. package/dist/cuid/cuid.browser.js.map +1 -1
  57. package/dist/cuid/cuid.node.js +1 -1
  58. package/dist/cuid/cuid.node.js.map +1 -1
  59. package/dist/effect/Debug.d.ts +38 -0
  60. package/dist/effect/Debug.d.ts.map +1 -0
  61. package/dist/effect/Debug.js +350 -0
  62. package/dist/effect/Debug.js.map +1 -0
  63. package/dist/effect/Effect.d.ts +91 -22
  64. package/dist/effect/Effect.d.ts.map +1 -1
  65. package/dist/effect/Effect.js +126 -38
  66. package/dist/effect/Effect.js.map +1 -1
  67. package/dist/effect/Effect.test.d.ts +2 -0
  68. package/dist/effect/Effect.test.d.ts.map +1 -0
  69. package/dist/effect/Effect.test.js +72 -0
  70. package/dist/effect/Effect.test.js.map +1 -0
  71. package/dist/effect/Error.d.ts +4 -6
  72. package/dist/effect/Error.d.ts.map +1 -1
  73. package/dist/effect/Error.js +1 -1
  74. package/dist/effect/Error.js.map +1 -1
  75. package/dist/effect/Logger.d.ts +0 -6
  76. package/dist/effect/Logger.d.ts.map +1 -1
  77. package/dist/effect/Logger.js +0 -32
  78. package/dist/effect/Logger.js.map +1 -1
  79. package/dist/effect/OtelTracer.d.ts +1 -1
  80. package/dist/effect/OtelTracer.d.ts.map +1 -1
  81. package/dist/effect/OtelTracer.js +2 -3
  82. package/dist/effect/OtelTracer.js.map +1 -1
  83. package/dist/effect/RpcClient.d.ts +7 -7
  84. package/dist/effect/RpcClient.d.ts.map +1 -1
  85. package/dist/effect/RpcClient.js +74 -54
  86. package/dist/effect/RpcClient.js.map +1 -1
  87. package/dist/effect/Schedule.d.ts +1 -1
  88. package/dist/effect/Schedule.d.ts.map +1 -1
  89. package/dist/effect/Schedule.js +2 -2
  90. package/dist/effect/Schedule.js.map +1 -1
  91. package/dist/effect/Schema/debug-diff.d.ts +1 -1
  92. package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
  93. package/dist/effect/Schema/debug-diff.js +9 -10
  94. package/dist/effect/Schema/debug-diff.js.map +1 -1
  95. package/dist/effect/Schema/debug-diff.test.js +7 -4
  96. package/dist/effect/Schema/debug-diff.test.js.map +1 -1
  97. package/dist/effect/Schema/index.d.ts +28 -18
  98. package/dist/effect/Schema/index.d.ts.map +1 -1
  99. package/dist/effect/Schema/index.js +55 -28
  100. package/dist/effect/Schema/index.js.map +1 -1
  101. package/dist/effect/Stream.d.ts +13 -5
  102. package/dist/effect/Stream.d.ts.map +1 -1
  103. package/dist/effect/Stream.js +19 -12
  104. package/dist/effect/Stream.js.map +1 -1
  105. package/dist/effect/Stream.test.js +12 -12
  106. package/dist/effect/Stream.test.js.map +1 -1
  107. package/dist/effect/Subscribable.d.ts +9 -3
  108. package/dist/effect/Subscribable.d.ts.map +1 -1
  109. package/dist/effect/Subscribable.js +20 -35
  110. package/dist/effect/Subscribable.js.map +1 -1
  111. package/dist/effect/SubscriptionRef.d.ts +5 -6
  112. package/dist/effect/SubscriptionRef.d.ts.map +1 -1
  113. package/dist/effect/SubscriptionRef.js +2 -3
  114. package/dist/effect/SubscriptionRef.js.map +1 -1
  115. package/dist/effect/TaskTracing.d.ts +1 -1
  116. package/dist/effect/TaskTracing.d.ts.map +1 -1
  117. package/dist/effect/TaskTracing.js +12 -16
  118. package/dist/effect/TaskTracing.js.map +1 -1
  119. package/dist/effect/WebChannel/WebChannel.d.ts +11 -30
  120. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
  121. package/dist/effect/WebChannel/WebChannel.js +70 -125
  122. package/dist/effect/WebChannel/WebChannel.js.map +1 -1
  123. package/dist/effect/WebChannel/WebChannel.test.js +16 -16
  124. package/dist/effect/WebChannel/WebChannel.test.js.map +1 -1
  125. package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
  126. package/dist/effect/WebChannel/broadcastChannelWithAck.js +20 -13
  127. package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
  128. package/dist/effect/WebChannel/common.d.ts +17 -18
  129. package/dist/effect/WebChannel/common.d.ts.map +1 -1
  130. package/dist/effect/WebChannel/common.js +7 -7
  131. package/dist/effect/WebChannel/common.js.map +1 -1
  132. package/dist/effect/WebSocket.d.ts +4 -6
  133. package/dist/effect/WebSocket.d.ts.map +1 -1
  134. package/dist/effect/WebSocket.js +17 -17
  135. package/dist/effect/WebSocket.js.map +1 -1
  136. package/dist/effect/WebSocket.test.js +2 -2
  137. package/dist/effect/WebSocket.test.js.map +1 -1
  138. package/dist/effect/mod.browser-build.test.d.ts +2 -0
  139. package/dist/effect/mod.browser-build.test.d.ts.map +1 -0
  140. package/dist/effect/mod.browser-build.test.js +18 -0
  141. package/dist/effect/mod.browser-build.test.js.map +1 -0
  142. package/dist/effect/mod.d.ts +30 -0
  143. package/dist/effect/mod.d.ts.map +1 -0
  144. package/dist/effect/mod.js +30 -0
  145. package/dist/effect/mod.js.map +1 -0
  146. package/dist/effect/spanEvent.d.ts +12 -0
  147. package/dist/effect/spanEvent.d.ts.map +1 -0
  148. package/dist/effect/spanEvent.js +12 -0
  149. package/dist/effect/spanEvent.js.map +1 -0
  150. package/dist/effect/spanEvent.test.d.ts +2 -0
  151. package/dist/effect/spanEvent.test.d.ts.map +1 -0
  152. package/dist/effect/spanEvent.test.js +79 -0
  153. package/dist/effect/spanEvent.test.js.map +1 -0
  154. package/dist/env.d.ts.map +1 -1
  155. package/dist/env.js +1 -1
  156. package/dist/env.js.map +1 -1
  157. package/dist/fast-deep-equal.d.ts.map +1 -1
  158. package/dist/fast-deep-equal.js +9 -10
  159. package/dist/fast-deep-equal.js.map +1 -1
  160. package/dist/global.d.ts +3 -0
  161. package/dist/global.d.ts.map +1 -1
  162. package/dist/global.js.map +1 -1
  163. package/dist/misc.d.ts +9 -1
  164. package/dist/misc.d.ts.map +1 -1
  165. package/dist/misc.js +12 -4
  166. package/dist/misc.js.map +1 -1
  167. package/dist/mod.d.ts +177 -20
  168. package/dist/mod.d.ts.map +1 -1
  169. package/dist/mod.js +159 -22
  170. package/dist/mod.js.map +1 -1
  171. package/dist/node/mod.d.ts +45 -6
  172. package/dist/node/mod.d.ts.map +1 -1
  173. package/dist/node/mod.js +51 -9
  174. package/dist/node/mod.js.map +1 -1
  175. package/dist/object/index.d.ts +0 -9
  176. package/dist/object/index.d.ts.map +1 -1
  177. package/dist/object/index.js +0 -9
  178. package/dist/object/index.js.map +1 -1
  179. package/dist/object/stringify-object.js +2 -2
  180. package/dist/object/stringify-object.js.map +1 -1
  181. package/dist/object/stringify-object.test.js.map +1 -1
  182. package/dist/qr.d.ts +38 -0
  183. package/dist/qr.d.ts.map +1 -0
  184. package/dist/qr.js +109 -0
  185. package/dist/qr.js.map +1 -0
  186. package/dist/set.js +1 -1
  187. package/dist/set.js.map +1 -1
  188. package/dist/string.d.ts +0 -2
  189. package/dist/string.d.ts.map +1 -1
  190. package/dist/string.js +0 -2
  191. package/dist/string.js.map +1 -1
  192. package/package.json +61 -55
  193. package/src/NoopTracer.test.ts +20 -0
  194. package/src/NoopTracer.ts +28 -37
  195. package/src/binary.ts +1 -1
  196. package/src/browser/Opfs/Opfs.ts +463 -0
  197. package/src/browser/Opfs/debug-utils.ts +154 -0
  198. package/src/browser/Opfs/mod.ts +3 -0
  199. package/src/browser/Opfs/utils.ts +297 -0
  200. package/src/browser/QuotaExceededError.ts +60 -0
  201. package/src/browser/WebChannelBrowser.ts +145 -0
  202. package/src/browser/WebError.test.ts +66 -0
  203. package/src/browser/WebError.ts +587 -0
  204. package/src/{effect → browser}/WebLock.ts +27 -28
  205. package/src/{browser.ts → browser/detect.ts} +6 -6
  206. package/src/browser/mod.ts +8 -0
  207. package/src/cuid/cuid.browser.ts +1 -1
  208. package/src/cuid/cuid.node.ts +1 -1
  209. package/src/effect/Debug.ts +477 -0
  210. package/src/effect/Effect.test.ts +117 -0
  211. package/src/effect/Effect.ts +174 -79
  212. package/src/effect/Error.ts +1 -1
  213. package/src/effect/Logger.ts +0 -48
  214. package/src/effect/OtelTracer.ts +2 -3
  215. package/src/effect/RpcClient.ts +85 -65
  216. package/src/effect/Schedule.ts +4 -5
  217. package/src/effect/Schema/debug-diff.test.ts +7 -7
  218. package/src/effect/Schema/debug-diff.ts +11 -12
  219. package/src/effect/Schema/index.ts +121 -57
  220. package/src/effect/Stream.test.ts +14 -13
  221. package/src/effect/Stream.ts +23 -16
  222. package/src/effect/Subscribable.ts +31 -42
  223. package/src/effect/SubscriptionRef.ts +9 -13
  224. package/src/effect/TaskTracing.ts +13 -16
  225. package/src/effect/WebChannel/WebChannel.test.ts +24 -24
  226. package/src/effect/WebChannel/WebChannel.ts +102 -192
  227. package/src/effect/WebChannel/broadcastChannelWithAck.ts +25 -15
  228. package/src/effect/WebChannel/common.ts +16 -17
  229. package/src/effect/WebSocket.test.ts +2 -2
  230. package/src/effect/WebSocket.ts +20 -16
  231. package/src/effect/mod.browser-build.test.ts +19 -0
  232. package/src/effect/{index.ts → mod.ts} +43 -69
  233. package/src/effect/spanEvent.test.ts +92 -0
  234. package/src/effect/spanEvent.ts +17 -0
  235. package/src/env.ts +2 -1
  236. package/src/fast-deep-equal.ts +9 -10
  237. package/src/global.ts +4 -2
  238. package/src/misc.ts +13 -5
  239. package/src/mod.ts +188 -32
  240. package/src/node/mod.ts +57 -12
  241. package/src/object/index.ts +0 -24
  242. package/src/object/stringify-object.test.ts +1 -0
  243. package/src/object/stringify-object.ts +2 -2
  244. package/src/qr.ts +125 -0
  245. package/src/set.ts +1 -1
  246. package/src/string.ts +0 -3
  247. package/dist/.tsbuildinfo.json +0 -1
  248. package/dist/browser.d.ts.map +0 -1
  249. package/dist/browser.js.map +0 -1
  250. package/dist/effect/BucketQueue.d.ts +0 -20
  251. package/dist/effect/BucketQueue.d.ts.map +0 -1
  252. package/dist/effect/BucketQueue.js +0 -34
  253. package/dist/effect/BucketQueue.js.map +0 -1
  254. package/dist/effect/Scheduler.d.ts +0 -4
  255. package/dist/effect/Scheduler.d.ts.map +0 -1
  256. package/dist/effect/Scheduler.js +0 -9
  257. package/dist/effect/Scheduler.js.map +0 -1
  258. package/dist/effect/ServiceContext.d.ts +0 -37
  259. package/dist/effect/ServiceContext.d.ts.map +0 -1
  260. package/dist/effect/ServiceContext.js +0 -55
  261. package/dist/effect/ServiceContext.js.map +0 -1
  262. package/dist/effect/WebLock.d.ts.map +0 -1
  263. package/dist/effect/WebLock.js.map +0 -1
  264. package/dist/effect/index.d.ts +0 -32
  265. package/dist/effect/index.d.ts.map +0 -1
  266. package/dist/effect/index.js +0 -35
  267. package/dist/effect/index.js.map +0 -1
  268. package/dist/guards.d.ts +0 -6
  269. package/dist/guards.d.ts.map +0 -1
  270. package/dist/guards.js +0 -6
  271. package/dist/guards.js.map +0 -1
  272. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -4
  273. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +0 -1
  274. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +0 -122
  275. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +0 -1
  276. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +0 -2
  277. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +0 -1
  278. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +0 -218
  279. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +0 -1
  280. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +0 -84
  281. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +0 -1
  282. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +0 -68
  283. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +0 -1
  284. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +0 -2
  285. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +0 -1
  286. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +0 -52
  287. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +0 -1
  288. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +0 -23
  289. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +0 -1
  290. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -138
  291. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +0 -1
  292. package/dist/object/omit.d.ts +0 -3
  293. package/dist/object/omit.d.ts.map +0 -1
  294. package/dist/object/omit.js +0 -14
  295. package/dist/object/omit.js.map +0 -1
  296. package/dist/object/pick.d.ts +0 -14
  297. package/dist/object/pick.d.ts.map +0 -1
  298. package/dist/object/pick.js +0 -17
  299. package/dist/object/pick.js.map +0 -1
  300. package/dist/time.d.ts +0 -12
  301. package/dist/time.d.ts.map +0 -1
  302. package/dist/time.js +0 -22
  303. package/dist/time.js.map +0 -1
  304. package/src/effect/BucketQueue.ts +0 -49
  305. package/src/effect/Scheduler.ts +0 -13
  306. package/src/effect/ServiceContext.ts +0 -108
  307. package/src/guards.ts +0 -8
  308. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +0 -135
  309. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +0 -302
  310. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +0 -78
  311. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +0 -66
  312. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +0 -168
  313. package/src/object/omit.ts +0 -17
  314. package/src/object/pick.ts +0 -27
  315. package/src/time.ts +0 -25
  316. /package/dist/{effect → browser}/WebLock.d.ts +0 -0
@@ -1,11 +1,9 @@
1
- /** biome-ignore-all lint/suspicious/useIterableCallbackReturn: Biome bug */
2
1
  export * from 'effect/Stream'
3
2
 
4
- import { type Cause, Chunk, Effect, Option, pipe, Ref, Stream } from 'effect'
5
- import { dual } from 'effect/Function'
3
+ import { type Cause, Array, Effect, Function, Option, pipe, Ref, Stream } from 'effect'
6
4
 
7
5
  export const tapLog = <R, E, A>(stream: Stream.Stream<A, E, R>): Stream.Stream<A, E, R> =>
8
- tapChunk<never, never, A, void>(Effect.forEach((_) => Effect.succeed(console.log(_))))(stream)
6
+ tapArray<never, never, A, void>(Effect.forEach((_) => Effect.succeed(console.log(_))))(stream)
9
7
 
10
8
  export const tapSync =
11
9
  <A>(tapFn: (a: A) => unknown) =>
@@ -15,15 +13,24 @@ export const tapSync =
15
13
  export const tapLogWithLabel =
16
14
  (label: string) =>
17
15
  <R, E, A>(stream: Stream.Stream<A, E, R>): Stream.Stream<A, E, R> =>
18
- tapChunk<never, never, A, void>(Effect.forEach((_) => Effect.succeed(console.log(label, _))))(stream)
16
+ tapArray<never, never, A, void>(Effect.forEach((_) => Effect.succeed(console.log(label, _))))(stream)
19
17
 
20
- export const tapChunk =
21
- <R1, E1, A, Z>(f: (a: Chunk.Chunk<A>) => Effect.Effect<Z, E1, R1>) =>
18
+ /**
19
+ * Runs an effect once for each array batch emitted by the stream, preserving
20
+ * the original stream elements.
21
+ *
22
+ * Use this for batch-oriented side effects such as `Queue.offerAll`. For
23
+ * element-wise side effects, prefer `Stream.tap`.
24
+ *
25
+ * @see {@link Stream.tap} for running an effect once per element.
26
+ */
27
+ export const tapArray =
28
+ <R1, E1, A, Z>(f: (a: ReadonlyArray<A>) => Effect.Effect<Z, E1, R1>) =>
22
29
  <R, E>(self: Stream.Stream<A, E, R>): Stream.Stream<A, E1 | E, R1 | R> =>
23
- Stream.mapChunksEffect(self, (chunks) =>
30
+ Stream.mapArrayEffect(self, (array) =>
24
31
  pipe(
25
- f(chunks),
26
- Effect.map(() => chunks),
32
+ f(array),
33
+ Effect.map(() => array),
27
34
  ),
28
35
  )
29
36
 
@@ -68,18 +75,18 @@ export const skipRepeated_ = <R, E, A>(
68
75
  * It's different than `Stream.runHead` which runs the stream to completion.
69
76
  * */
70
77
  export const runFirst = <A, E, R>(stream: Stream.Stream<A, E, R>): Effect.Effect<Option.Option<A>, E, R> =>
71
- stream.pipe(Stream.take(1), Stream.runCollect, Effect.map(Chunk.head))
78
+ stream.pipe(Stream.take(1), Stream.runCollect, Effect.map(Array.head))
72
79
 
73
80
  /**
74
- * Returns the first element of the stream or throws a `NoSuchElementException` if the stream is empty.
81
+ * Returns the first element of the stream or throws a `NoSuchElementError` if the stream is empty.
75
82
  * It's different than `Stream.runHead` which runs the stream to completion.
76
83
  * */
77
84
  export const runFirstUnsafe = <A, E, R>(
78
85
  stream: Stream.Stream<A, E, R>,
79
- ): Effect.Effect<A, Cause.NoSuchElementException | E, R> => runFirst(stream).pipe(Effect.flatten)
86
+ ): Effect.Effect<A, Cause.NoSuchElementError | E, R> => runFirst(stream).pipe(Effect.flatMap(Effect.fromOption))
80
87
 
81
88
  export const runCollectReadonlyArray = <A, E, R>(stream: Stream.Stream<A, E, R>): Effect.Effect<readonly A[], E, R> =>
82
- stream.pipe(Stream.runCollect, Effect.map(Chunk.toReadonlyArray))
89
+ stream.pipe(Stream.runCollect)
83
90
 
84
91
  /**
85
92
  * Concatenates two streams where the second stream has access to the last element
@@ -120,7 +127,7 @@ export const concatWithLastElement: {
120
127
  stream: Stream.Stream<A1, E1, R1>,
121
128
  getStream2: (lastElement: Option.Option<A1>) => Stream.Stream<A2, E2, R2>,
122
129
  ): Stream.Stream<A1 | A2, E1 | E2, R1 | R2>
123
- } = dual(
130
+ } = Function.dual(
124
131
  2,
125
132
  <A1, E1, R1, A2, E2, R2>(
126
133
  stream1: Stream.Stream<A1, E1, R1>,
@@ -163,7 +170,7 @@ export const concatWithLastElement: {
163
170
  export const emitIfEmpty: {
164
171
  <A>(fallbackValue: A): <E, R>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>
165
172
  <A, E, R>(stream: Stream.Stream<A, E, R>, fallbackValue: A): Stream.Stream<A, E, R>
166
- } = dual(
173
+ } = Function.dual(
167
174
  2,
168
175
  <A, E, R>(stream: Stream.Stream<A, E, R>, fallbackValue: A): Stream.Stream<A, E, R> =>
169
176
  concatWithLastElement(stream, (lastElement) =>
@@ -4,10 +4,15 @@
4
4
  * @since 2.0.0
5
5
  */
6
6
 
7
- import type { SubscriptionRef } from 'effect'
8
- import { Effect, Effectable, Readable, Stream } from 'effect'
9
- import { dual } from 'effect/Function'
10
- import { hasProperty } from 'effect/Predicate'
7
+ import { Effect, Effectable, Function, Predicate, Stream, SubscriptionRef } from 'effect'
8
+
9
+ const ReadableTypeId: unique symbol = Symbol.for('effect/Readable')
10
+ type ReadableTypeId = typeof ReadableTypeId
11
+
12
+ interface Readable<A, E = never, R = never> {
13
+ readonly [ReadableTypeId]: ReadableTypeId
14
+ readonly get: Effect.Effect<A, E, R>
15
+ }
11
16
 
12
17
  /**
13
18
  * @since 2.0.0
@@ -25,7 +30,7 @@ export type TypeId = typeof TypeId
25
30
  * @since 2.0.0
26
31
  * @category models
27
32
  */
28
- export interface Subscribable<A, E = never, R = never> extends Readable.Readable<A, E, R>, Effect.Effect<A, E, R> {
33
+ export interface Subscribable<A, E = never, R = never> extends Readable<A, E, R>, Effect.Effect<A, E, R> {
29
34
  readonly [TypeId]: TypeId
30
35
  readonly changes: Stream.Stream<A, E, R>
31
36
  }
@@ -34,52 +39,36 @@ export interface Subscribable<A, E = never, R = never> extends Readable.Readable
34
39
  * @since 2.0.0
35
40
  * @category refinements
36
41
  */
37
- export const isSubscribable = (u: unknown): u is Subscribable<unknown, unknown, unknown> => hasProperty(u, TypeId)
38
-
39
- // const Proto: Omit<Subscribable<any>, 'get' | 'changes'> = {
40
- // [Readable.TypeId]: Readable.TypeId,
41
- // [TypeId]: TypeId,
42
- // pipe() {
43
- // return pipeArguments(this, arguments)
44
- // },
45
- // }
46
-
47
- class SubscribableImpl<in out A> extends Effectable.Class<A> implements Subscribable<A> {
48
- // @ts-expect-error type symbol
49
- readonly [TypeId] = TypeId
50
- // @ts-expect-error type symbol
51
- readonly [Readable.TypeId] = Readable.TypeId
52
- readonly get: Effect.Effect<A>
53
- readonly changes: Stream.Stream<A>
54
- constructor(get: Effect.Effect<A>, changes: Stream.Stream<A>) {
55
- super()
56
- this.get = get
57
- this.changes = changes
58
- }
59
-
60
- commit() {
61
- return this.get
62
- }
63
- }
42
+ export const isSubscribable = (u: unknown): u is Subscribable<unknown, unknown, unknown> =>
43
+ Predicate.hasProperty(u, TypeId)
44
+
45
+ const Proto: Omit<Subscribable<unknown, unknown, unknown>, 'get' | 'changes'> = Object.assign(
46
+ Effectable.Prototype<Subscribable<unknown, unknown, unknown>>({
47
+ label: 'Subscribable',
48
+ evaluate() {
49
+ // @effect-diagnostics-next-line anyUnknownInErrorContext:off -- vendored fork; this shared prototype is generic over all A, E, R, so `unknown` in the error/requirements channels is structural, not a real error type
50
+ return this.get
51
+ },
52
+ }),
53
+ {
54
+ [ReadableTypeId]: ReadableTypeId,
55
+ [TypeId]: TypeId,
56
+ } as const,
57
+ )
64
58
 
65
59
  /**
66
60
  * @since 2.0.0
67
61
  * @category constructors
68
62
  */
69
- // export const make = <A, E, R>(options: {
70
- // readonly get: Effect.Effect<A, E, R>
71
- // readonly changes: Stream.Stream<A, E, R>
72
- // }): Subscribable<A, E, R> => Object.assign(Object.create(Proto), options)
73
-
74
63
  export const make = <A, E, R>(options: {
75
64
  readonly get: Effect.Effect<A, E, R>
76
65
  readonly changes: Stream.Stream<A, E, R>
77
- }): Subscribable<A, E, R> => new SubscribableImpl(options.get as any, options.changes as any) as Subscribable<A, E, R>
66
+ }): Subscribable<A, E, R> => Object.assign(Object.create(Proto), options)
78
67
 
79
68
  export const fromSubscriptionRef = <A>(ref: SubscriptionRef.SubscriptionRef<A>): Subscribable<A> =>
80
69
  make({
81
- get: ref.get,
82
- changes: ref.changes,
70
+ get: SubscriptionRef.get(ref),
71
+ changes: SubscriptionRef.changes(ref),
83
72
  })
84
73
 
85
74
  /**
@@ -97,7 +86,7 @@ export const map: {
97
86
  * @category combinators
98
87
  */
99
88
  <A, E, R, B>(self: Subscribable<A, E, R>, f: (a: NoInfer<A>) => B): Subscribable<B, E, R>
100
- } = dual(
89
+ } = Function.dual(
101
90
  2,
102
91
  <A, E, R, B>(self: Subscribable<A, E, R>, f: (a: NoInfer<A>) => B): Subscribable<B, E, R> =>
103
92
  make({
@@ -126,7 +115,7 @@ export const mapEffect: {
126
115
  self: Subscribable<A, E, R>,
127
116
  f: (a: NoInfer<A>) => Effect.Effect<B, E2, R2>,
128
117
  ): Subscribable<B, E | E2, R | R2>
129
- } = dual(
118
+ } = Function.dual(
130
119
  2,
131
120
  <A, E, R, B, E2, R2>(
132
121
  self: Subscribable<A, E, R>,
@@ -1,23 +1,19 @@
1
- import { Chunk, Effect, pipe, Stream, SubscriptionRef } from 'effect'
2
- import { dual } from 'effect/Function'
3
- import type { Predicate, Refinement } from 'effect/Predicate'
1
+ import { Effect, Function, pipe, Stream, SubscriptionRef, type Predicate } from 'effect'
4
2
 
5
3
  export * from 'effect/SubscriptionRef'
6
4
 
7
5
  export const waitUntil: {
8
6
  <A, B extends A>(
9
- refinement: Refinement<NoInfer<A>, B>,
10
- ): (sref: SubscriptionRef.SubscriptionRef<A>) => Effect.Effect<B, never, never>
11
- <A, B extends A>(
12
- predicate: Predicate<B>,
13
- ): (sref: SubscriptionRef.SubscriptionRef<A>) => Effect.Effect<A, never, never>
7
+ refinement: Predicate.Refinement<NoInfer<A>, B>,
8
+ ): (sref: SubscriptionRef.SubscriptionRef<A>) => Effect.Effect<B>
9
+ <A, B extends A>(predicate: Predicate.Predicate<B>): (sref: SubscriptionRef.SubscriptionRef<A>) => Effect.Effect<A>
14
10
  <A, B extends A>(
15
11
  sref: SubscriptionRef.SubscriptionRef<A>,
16
- refinement: Refinement<NoInfer<A>, B>,
17
- ): Effect.Effect<B, never, never>
18
- <A, B extends A>(sref: SubscriptionRef.SubscriptionRef<A>, predicate: Predicate<B>): Effect.Effect<A, never, never>
19
- } = dual(2, <A>(sref: SubscriptionRef.SubscriptionRef<A>, predicate: (a: A) => boolean) =>
20
- pipe(sref.changes, Stream.filter(predicate), Stream.take(1), Stream.runCollect, Effect.map(Chunk.unsafeHead)),
12
+ refinement: Predicate.Refinement<NoInfer<A>, B>,
13
+ ): Effect.Effect<B>
14
+ <A, B extends A>(sref: SubscriptionRef.SubscriptionRef<A>, predicate: Predicate.Predicate<B>): Effect.Effect<A>
15
+ } = Function.dual(2, <A>(sref: SubscriptionRef.SubscriptionRef<A>, predicate: (a: A) => boolean) =>
16
+ pipe(SubscriptionRef.changes(sref), Stream.filter(predicate), Stream.runHead, Effect.flatMap(Effect.fromOption)),
21
17
  )
22
18
 
23
19
  export const fromStream = <A>(stream: Stream.Stream<A>, initialValue: A) =>
@@ -1,9 +1,4 @@
1
- import { Predicate } from 'effect'
2
- import * as Context from 'effect/Context'
3
- import * as Effect from 'effect/Effect'
4
- import { pipe } from 'effect/Function'
5
- import * as Layer from 'effect/Layer'
6
- import * as Tracer from 'effect/Tracer'
1
+ import { Context, Effect, Layer, Predicate, Tracer } from 'effect'
7
2
 
8
3
  export const withAsyncTaggingTracing =
9
4
  (makeTrace: (name: string) => { run: (fn: any) => any }) =>
@@ -14,30 +9,32 @@ export const withAsyncTaggingTracing =
14
9
 
15
10
  const makeTracer = Effect.gen(function* () {
16
11
  const oldTracer = yield* Effect.tracer
12
+ const evaluate = <X>(primitive: Tracer.EffectPrimitive<X>, fiber: any) =>
13
+ oldTracer.context?.(primitive, fiber) ?? primitive['~effect/Effect/evaluate'](fiber)
17
14
  return Tracer.make({
18
- span: (name, ...args) => {
19
- const span = oldTracer.span(name, ...args)
20
- const trace = makeTrace(name)
15
+ span: (options) => {
16
+ const span = oldTracer.span(options)
17
+ const trace = makeTrace(options.name)
21
18
  ;(span as any).runInTask = (f: any) => trace.run(f)
22
19
  return span
23
20
  },
24
- context: (f, fiber) => {
25
- const maybeParentSpan = Context.getOption(Tracer.ParentSpan)(fiber.currentContext)
21
+ context: (primitive, fiber) => {
22
+ const maybeParentSpan = Context.getOption(fiber.context, Tracer.ParentSpan)
26
23
 
27
- if (maybeParentSpan._tag === 'None') return oldTracer.context(f, fiber)
24
+ if (maybeParentSpan._tag === 'None') return evaluate(primitive, fiber)
28
25
  const parentSpan = maybeParentSpan.value
29
- if (parentSpan._tag === 'ExternalSpan') return oldTracer.context(f, fiber)
26
+ if (parentSpan._tag === 'ExternalSpan') return evaluate(primitive, fiber)
30
27
  const span = parentSpan
31
28
  if ('runInTask' in span && typeof span.runInTask === 'function') {
32
- return span.runInTask(() => oldTracer.context(f, fiber))
29
+ return span.runInTask(() => evaluate(primitive, fiber))
33
30
  }
34
31
 
35
- return oldTracer.context(f, fiber)
32
+ return evaluate(primitive, fiber)
36
33
  },
37
34
  })
38
35
  })
39
36
 
40
- const withTracerLayer = pipe(makeTracer, Effect.map(Layer.setTracer), Layer.unwrapEffect)
37
+ const withTracerLayer = Layer.effect(Tracer.Tracer, makeTracer)
41
38
 
42
39
  return Effect.provide(eff, withTracerLayer)
43
40
  }
@@ -1,12 +1,12 @@
1
1
  import * as Vitest from '@effect/vitest'
2
- import { Effect, Schema, Stream } from 'effect'
2
+ import { Effect, Fiber, Schema, Stream } from 'effect'
3
3
  import { JSDOM } from 'jsdom'
4
4
 
5
- import * as WebChannel from './WebChannel.ts'
5
+ import * as WebChannel from '../../browser/WebChannelBrowser.ts'
6
6
 
7
7
  Vitest.describe('WebChannel', () => {
8
8
  Vitest.describe('windowChannel', () => {
9
- Vitest.scopedLive('should work with 2 windows', () =>
9
+ Vitest.live('should work with 2 windows', () =>
10
10
  Effect.gen(function* () {
11
11
  const windowA = new JSDOM().window as unknown as globalThis.Window
12
12
  const windowB = new JSDOM().window as unknown as globalThis.Window
@@ -16,19 +16,19 @@ Vitest.describe('WebChannel', () => {
16
16
  listenWindow: windowA,
17
17
  sendWindow: windowB,
18
18
  ids: { own: 'a', other: 'b' },
19
- schema: Schema.Number,
19
+ schema: Schema.Finite,
20
20
  })
21
21
 
22
22
  const msgFromBFiber = yield* channelToB.listen.pipe(
23
- Stream.flatten(),
24
23
  Stream.runHead,
25
- Effect.flatten,
26
- Effect.fork,
24
+ Effect.flatMap(Effect.fromOption),
25
+ Effect.flatMap(Effect.fromResult),
26
+ Effect.forkChild,
27
27
  )
28
28
 
29
29
  yield* channelToB.send(1)
30
30
 
31
- Vitest.expect(yield* msgFromBFiber).toEqual(2)
31
+ Vitest.expect(yield* Fiber.join(msgFromBFiber)).toEqual(2)
32
32
  })
33
33
 
34
34
  const codeSideB = Effect.gen(function* () {
@@ -36,26 +36,26 @@ Vitest.describe('WebChannel', () => {
36
36
  listenWindow: windowB,
37
37
  sendWindow: windowA,
38
38
  ids: { own: 'b', other: 'a' },
39
- schema: Schema.Number,
39
+ schema: Schema.Finite,
40
40
  })
41
41
 
42
42
  const msgFromAFiber = yield* channelToA.listen.pipe(
43
- Stream.flatten(),
44
43
  Stream.runHead,
45
- Effect.flatten,
46
- Effect.fork,
44
+ Effect.flatMap(Effect.fromOption),
45
+ Effect.flatMap(Effect.fromResult),
46
+ Effect.forkChild,
47
47
  )
48
48
 
49
49
  yield* channelToA.send(2)
50
50
 
51
- Vitest.expect(yield* msgFromAFiber).toEqual(1)
51
+ Vitest.expect(yield* Fiber.join(msgFromAFiber)).toEqual(1)
52
52
  })
53
53
 
54
54
  yield* Effect.all([codeSideA, codeSideB], { concurrency: 'unbounded' })
55
55
  }),
56
56
  )
57
57
 
58
- Vitest.scopedLive('should work with the same window', () =>
58
+ Vitest.live('should work with the same window', () =>
59
59
  Effect.gen(function* () {
60
60
  const window = new JSDOM().window as unknown as globalThis.Window
61
61
 
@@ -64,19 +64,19 @@ Vitest.describe('WebChannel', () => {
64
64
  listenWindow: window,
65
65
  sendWindow: window,
66
66
  ids: { own: 'a', other: 'b' },
67
- schema: Schema.Number,
67
+ schema: Schema.Finite,
68
68
  })
69
69
 
70
70
  const msgFromBFiber = yield* channelToB.listen.pipe(
71
- Stream.flatten(),
72
71
  Stream.runHead,
73
- Effect.flatten,
74
- Effect.fork,
72
+ Effect.flatMap(Effect.fromOption),
73
+ Effect.flatMap(Effect.fromResult),
74
+ Effect.forkChild,
75
75
  )
76
76
 
77
77
  yield* channelToB.send(1)
78
78
 
79
- Vitest.expect(yield* msgFromBFiber).toEqual(2)
79
+ Vitest.expect(yield* Fiber.join(msgFromBFiber)).toEqual(2)
80
80
  })
81
81
 
82
82
  const codeSideB = Effect.gen(function* () {
@@ -84,19 +84,19 @@ Vitest.describe('WebChannel', () => {
84
84
  listenWindow: window,
85
85
  sendWindow: window,
86
86
  ids: { own: 'b', other: 'a' },
87
- schema: Schema.Number,
87
+ schema: Schema.Finite,
88
88
  })
89
89
 
90
90
  const msgFromAFiber = yield* channelToA.listen.pipe(
91
- Stream.flatten(),
92
91
  Stream.runHead,
93
- Effect.flatten,
94
- Effect.fork,
92
+ Effect.flatMap(Effect.fromOption),
93
+ Effect.flatMap(Effect.fromResult),
94
+ Effect.forkChild,
95
95
  )
96
96
 
97
97
  yield* channelToA.send(2)
98
98
 
99
- Vitest.expect(yield* msgFromAFiber).toEqual(1)
99
+ Vitest.expect(yield* Fiber.join(msgFromAFiber)).toEqual(1)
100
100
  })
101
101
 
102
102
  yield* Effect.all([codeSideA, codeSideB], { concurrency: 'unbounded' })