effect 3.9.2 → 3.10.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 (207) hide show
  1. package/Arbitrary/package.json +6 -0
  2. package/FastCheck/package.json +6 -0
  3. package/JSONSchema/package.json +6 -0
  4. package/ParseResult/package.json +6 -0
  5. package/Pretty/package.json +6 -0
  6. package/Schema/package.json +6 -0
  7. package/SchemaAST/package.json +6 -0
  8. package/TSubscriptionRef/package.json +6 -0
  9. package/dist/cjs/Arbitrary.js +490 -0
  10. package/dist/cjs/Arbitrary.js.map +1 -0
  11. package/dist/cjs/Effect.js +247 -16
  12. package/dist/cjs/Effect.js.map +1 -1
  13. package/dist/cjs/FastCheck.js +17 -0
  14. package/dist/cjs/FastCheck.js.map +1 -0
  15. package/dist/cjs/Inspectable.js +43 -3
  16. package/dist/cjs/Inspectable.js.map +1 -1
  17. package/dist/cjs/JSONSchema.js +418 -0
  18. package/dist/cjs/JSONSchema.js.map +1 -0
  19. package/dist/cjs/ParseResult.js +1539 -0
  20. package/dist/cjs/ParseResult.js.map +1 -0
  21. package/dist/cjs/Predicate.js +3 -1
  22. package/dist/cjs/Predicate.js.map +1 -1
  23. package/dist/cjs/Pretty.js +183 -0
  24. package/dist/cjs/Pretty.js.map +1 -0
  25. package/dist/cjs/Schema.js +5529 -0
  26. package/dist/cjs/Schema.js.map +1 -0
  27. package/dist/cjs/SchemaAST.js +2365 -0
  28. package/dist/cjs/SchemaAST.js.map +1 -0
  29. package/dist/cjs/Stream.js +17 -3
  30. package/dist/cjs/Stream.js.map +1 -1
  31. package/dist/cjs/TPubSub.js +9 -1
  32. package/dist/cjs/TPubSub.js.map +1 -1
  33. package/dist/cjs/TQueue.js.map +1 -1
  34. package/dist/cjs/TRef.js.map +1 -1
  35. package/dist/cjs/TSubscriptionRef.js +96 -0
  36. package/dist/cjs/TSubscriptionRef.js.map +1 -0
  37. package/dist/cjs/index.js +18 -2
  38. package/dist/cjs/index.js.map +1 -1
  39. package/dist/cjs/internal/cause.js +2 -2
  40. package/dist/cjs/internal/cause.js.map +1 -1
  41. package/dist/cjs/internal/channel/channelExecutor.js +160 -161
  42. package/dist/cjs/internal/channel/channelExecutor.js.map +1 -1
  43. package/dist/cjs/internal/core.js +4 -4
  44. package/dist/cjs/internal/core.js.map +1 -1
  45. package/dist/cjs/internal/fiberRuntime.js +14 -12
  46. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  47. package/dist/cjs/internal/logger.js +7 -6
  48. package/dist/cjs/internal/logger.js.map +1 -1
  49. package/dist/cjs/internal/redacted.js +4 -0
  50. package/dist/cjs/internal/redacted.js.map +1 -1
  51. package/dist/cjs/internal/schema/errors.js +116 -0
  52. package/dist/cjs/internal/schema/errors.js.map +1 -0
  53. package/dist/cjs/internal/schema/filters.js +41 -0
  54. package/dist/cjs/internal/schema/filters.js.map +1 -0
  55. package/dist/cjs/internal/schema/util.js +96 -0
  56. package/dist/cjs/internal/schema/util.js.map +1 -0
  57. package/dist/cjs/internal/stm/core.js +2 -3
  58. package/dist/cjs/internal/stm/core.js.map +1 -1
  59. package/dist/cjs/internal/stm/tPubSub.js.map +1 -1
  60. package/dist/cjs/internal/stm/tQueue.js +1 -2
  61. package/dist/cjs/internal/stm/tQueue.js.map +1 -1
  62. package/dist/cjs/internal/stm/tRef.js +6 -2
  63. package/dist/cjs/internal/stm/tRef.js.map +1 -1
  64. package/dist/cjs/internal/stm/tSubscriptionRef.js +178 -0
  65. package/dist/cjs/internal/stm/tSubscriptionRef.js.map +1 -0
  66. package/dist/cjs/internal/stream.js +36 -16
  67. package/dist/cjs/internal/stream.js.map +1 -1
  68. package/dist/cjs/internal/version.js +1 -1
  69. package/dist/cjs/internal/version.js.map +1 -1
  70. package/dist/dts/Arbitrary.d.ts +45 -0
  71. package/dist/dts/Arbitrary.d.ts.map +1 -0
  72. package/dist/dts/Effect.d.ts +298 -30
  73. package/dist/dts/Effect.d.ts.map +1 -1
  74. package/dist/dts/FastCheck.d.ts +9 -0
  75. package/dist/dts/FastCheck.d.ts.map +1 -0
  76. package/dist/dts/Inspectable.d.ts +28 -0
  77. package/dist/dts/Inspectable.d.ts.map +1 -1
  78. package/dist/dts/JSONSchema.d.ts +181 -0
  79. package/dist/dts/JSONSchema.d.ts.map +1 -0
  80. package/dist/dts/ParseResult.d.ts +551 -0
  81. package/dist/dts/ParseResult.d.ts.map +1 -0
  82. package/dist/dts/Predicate.d.ts.map +1 -1
  83. package/dist/dts/Pretty.d.ts +26 -0
  84. package/dist/dts/Pretty.d.ts.map +1 -0
  85. package/dist/dts/Schema.d.ts +4562 -0
  86. package/dist/dts/Schema.d.ts.map +1 -0
  87. package/dist/dts/SchemaAST.d.ts +1321 -0
  88. package/dist/dts/SchemaAST.d.ts.map +1 -0
  89. package/dist/dts/Stream.d.ts +67 -2
  90. package/dist/dts/Stream.d.ts.map +1 -1
  91. package/dist/dts/TPubSub.d.ts +8 -0
  92. package/dist/dts/TPubSub.d.ts.map +1 -1
  93. package/dist/dts/TQueue.d.ts +7 -7
  94. package/dist/dts/TQueue.d.ts.map +1 -1
  95. package/dist/dts/TRef.d.ts +2 -1
  96. package/dist/dts/TRef.d.ts.map +1 -1
  97. package/dist/dts/TSubscriptionRef.d.ts +251 -0
  98. package/dist/dts/TSubscriptionRef.d.ts.map +1 -0
  99. package/dist/dts/index.d.ts +32 -0
  100. package/dist/dts/index.d.ts.map +1 -1
  101. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  102. package/dist/dts/internal/schema/errors.d.ts +2 -0
  103. package/dist/dts/internal/schema/errors.d.ts.map +1 -0
  104. package/dist/dts/internal/schema/filters.d.ts +2 -0
  105. package/dist/dts/internal/schema/filters.d.ts.map +1 -0
  106. package/dist/dts/internal/schema/util.d.ts +2 -0
  107. package/dist/dts/internal/schema/util.d.ts.map +1 -0
  108. package/dist/dts/internal/stm/tRef.d.ts +3 -1
  109. package/dist/dts/internal/stm/tRef.d.ts.map +1 -1
  110. package/dist/dts/internal/stm/tSubscriptionRef.d.ts +2 -0
  111. package/dist/dts/internal/stm/tSubscriptionRef.d.ts.map +1 -0
  112. package/dist/dts/internal/stream.d.ts.map +1 -1
  113. package/dist/esm/Arbitrary.js +472 -0
  114. package/dist/esm/Arbitrary.js.map +1 -0
  115. package/dist/esm/Effect.js +256 -18
  116. package/dist/esm/Effect.js.map +1 -1
  117. package/dist/esm/FastCheck.js +9 -0
  118. package/dist/esm/FastCheck.js.map +1 -0
  119. package/dist/esm/Inspectable.js +39 -2
  120. package/dist/esm/Inspectable.js.map +1 -1
  121. package/dist/esm/JSONSchema.js +408 -0
  122. package/dist/esm/JSONSchema.js.map +1 -0
  123. package/dist/esm/ParseResult.js +1503 -0
  124. package/dist/esm/ParseResult.js.map +1 -0
  125. package/dist/esm/Predicate.js +2 -1
  126. package/dist/esm/Predicate.js.map +1 -1
  127. package/dist/esm/Pretty.js +173 -0
  128. package/dist/esm/Pretty.js.map +1 -0
  129. package/dist/esm/Schema.js +5328 -0
  130. package/dist/esm/Schema.js.map +1 -0
  131. package/dist/esm/SchemaAST.js +2300 -0
  132. package/dist/esm/SchemaAST.js.map +1 -0
  133. package/dist/esm/Stream.js +14 -0
  134. package/dist/esm/Stream.js.map +1 -1
  135. package/dist/esm/TPubSub.js +8 -0
  136. package/dist/esm/TPubSub.js.map +1 -1
  137. package/dist/esm/TQueue.js.map +1 -1
  138. package/dist/esm/TRef.js.map +1 -1
  139. package/dist/esm/TSubscriptionRef.js +87 -0
  140. package/dist/esm/TSubscriptionRef.js.map +1 -0
  141. package/dist/esm/index.js +32 -0
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/internal/cause.js +3 -3
  144. package/dist/esm/internal/cause.js.map +1 -1
  145. package/dist/esm/internal/channel/channelExecutor.js +160 -161
  146. package/dist/esm/internal/channel/channelExecutor.js.map +1 -1
  147. package/dist/esm/internal/core.js +4 -4
  148. package/dist/esm/internal/core.js.map +1 -1
  149. package/dist/esm/internal/fiberRuntime.js +14 -12
  150. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  151. package/dist/esm/internal/logger.js +7 -6
  152. package/dist/esm/internal/logger.js.map +1 -1
  153. package/dist/esm/internal/redacted.js +4 -0
  154. package/dist/esm/internal/redacted.js.map +1 -1
  155. package/dist/esm/internal/schema/errors.js +87 -0
  156. package/dist/esm/internal/schema/errors.js.map +1 -0
  157. package/dist/esm/internal/schema/filters.js +35 -0
  158. package/dist/esm/internal/schema/filters.js.map +1 -0
  159. package/dist/esm/internal/schema/util.js +78 -0
  160. package/dist/esm/internal/schema/util.js.map +1 -0
  161. package/dist/esm/internal/stm/core.js +1 -2
  162. package/dist/esm/internal/stm/core.js.map +1 -1
  163. package/dist/esm/internal/stm/tPubSub.js.map +1 -1
  164. package/dist/esm/internal/stm/tQueue.js +1 -2
  165. package/dist/esm/internal/stm/tQueue.js.map +1 -1
  166. package/dist/esm/internal/stm/tRef.js +5 -1
  167. package/dist/esm/internal/stm/tRef.js.map +1 -1
  168. package/dist/esm/internal/stm/tSubscriptionRef.js +166 -0
  169. package/dist/esm/internal/stm/tSubscriptionRef.js.map +1 -0
  170. package/dist/esm/internal/stream.js +33 -15
  171. package/dist/esm/internal/stream.js.map +1 -1
  172. package/dist/esm/internal/version.js +1 -1
  173. package/dist/esm/internal/version.js.map +1 -1
  174. package/package.json +68 -1
  175. package/src/Arbitrary.ts +563 -0
  176. package/src/Effect.ts +302 -31
  177. package/src/FastCheck.ts +9 -0
  178. package/src/Inspectable.ts +56 -2
  179. package/src/JSONSchema.ts +601 -0
  180. package/src/ParseResult.ts +2027 -0
  181. package/src/Predicate.ts +3 -1
  182. package/src/Pretty.ts +204 -0
  183. package/src/Schema.ts +10388 -0
  184. package/src/SchemaAST.ts +2827 -0
  185. package/src/Stream.ts +77 -9
  186. package/src/TPubSub.ts +9 -0
  187. package/src/TQueue.ts +7 -7
  188. package/src/TRef.ts +2 -1
  189. package/src/TSubscriptionRef.ts +284 -0
  190. package/src/index.ts +40 -0
  191. package/src/internal/cause.ts +3 -3
  192. package/src/internal/channel/channelExecutor.ts +213 -214
  193. package/src/internal/core-effect.ts +2 -2
  194. package/src/internal/core.ts +4 -4
  195. package/src/internal/fiberRuntime.ts +14 -12
  196. package/src/internal/logger.ts +7 -6
  197. package/src/internal/redacted.ts +4 -0
  198. package/src/internal/schema/errors.ts +189 -0
  199. package/src/internal/schema/filters.ts +86 -0
  200. package/src/internal/schema/util.ts +113 -0
  201. package/src/internal/stm/core.ts +1 -2
  202. package/src/internal/stm/tPubSub.ts +1 -0
  203. package/src/internal/stm/tQueue.ts +2 -2
  204. package/src/internal/stm/tRef.ts +7 -2
  205. package/src/internal/stm/tSubscriptionRef.ts +286 -0
  206. package/src/internal/stream.ts +97 -20
  207. package/src/internal/version.ts +1 -1
@@ -0,0 +1,286 @@
1
+ import * as Effect from "../../Effect.js"
2
+ import { dual, pipe } from "../../Function.js"
3
+ import * as Option from "../../Option.js"
4
+ import { pipeArguments } from "../../Pipeable.js"
5
+ import * as STM from "../../STM.js"
6
+ import * as TPubSub from "../../TPubSub.js"
7
+ import * as TQueue from "../../TQueue.js"
8
+ import * as TRef from "../../TRef.js"
9
+ import type * as TSubscriptionRef from "../../TSubscriptionRef.js"
10
+ import * as stream from "../stream.js"
11
+ import { tDequeueVariance } from "./tQueue.js"
12
+ import { tRefVariance } from "./tRef.js"
13
+
14
+ /** @internal */
15
+ const TSubscriptionRefSymbolKey = "effect/TSubscriptionRef"
16
+
17
+ /** @internal */
18
+ export const TSubscriptionRefTypeId: TSubscriptionRef.TSubscriptionRefTypeId = Symbol.for(
19
+ TSubscriptionRefSymbolKey
20
+ ) as TSubscriptionRef.TSubscriptionRefTypeId
21
+
22
+ const TSubscriptionRefVariance = {
23
+ /* c8 ignore next */
24
+ _A: (_: any) => _
25
+ }
26
+
27
+ class TDequeueMerge<A> implements TQueue.TDequeue<A> {
28
+ [TQueue.TDequeueTypeId] = tDequeueVariance
29
+
30
+ constructor(
31
+ readonly first: TQueue.TDequeue<A>,
32
+ readonly second: TQueue.TDequeue<A>
33
+ ) {}
34
+
35
+ peek: STM.STM<A> = STM.gen(this, function*() {
36
+ const first = yield* this.peekOption
37
+ if (first._tag === "Some") {
38
+ return first.value
39
+ }
40
+ return yield* STM.retry
41
+ })
42
+
43
+ peekOption: STM.STM<Option.Option<A>> = STM.gen(this, function*() {
44
+ const first = yield* this.first.peekOption
45
+ if (first._tag === "Some") {
46
+ return first
47
+ }
48
+ const second = yield* this.second.peekOption
49
+ if (second._tag === "Some") {
50
+ return second
51
+ }
52
+ return Option.none()
53
+ })
54
+
55
+ take: STM.STM<A> = STM.gen(this, function*() {
56
+ if (!(yield* this.first.isEmpty)) {
57
+ return yield* this.first.take
58
+ }
59
+ if (!(yield* this.second.isEmpty)) {
60
+ return yield* this.second.take
61
+ }
62
+ return yield* STM.retry
63
+ })
64
+
65
+ takeAll: STM.STM<Array<A>> = STM.gen(this, function*() {
66
+ return [...yield* this.first.takeAll, ...yield* this.second.takeAll]
67
+ })
68
+
69
+ takeUpTo(max: number): STM.STM<Array<A>> {
70
+ return STM.gen(this, function*() {
71
+ const first = yield* this.first.takeUpTo(max)
72
+ if (first.length >= max) {
73
+ return first
74
+ }
75
+ return [...first, ...yield* this.second.takeUpTo(max - first.length)]
76
+ })
77
+ }
78
+
79
+ capacity(): number {
80
+ return this.first.capacity() + this.second.capacity()
81
+ }
82
+
83
+ size: STM.STM<number> = STM.gen(this, function*() {
84
+ return (yield* this.first.size) + (yield* this.second.size)
85
+ })
86
+
87
+ isFull: STM.STM<boolean> = STM.gen(this, function*() {
88
+ return (yield* this.first.isFull) && (yield* this.second.isFull)
89
+ })
90
+
91
+ isEmpty: STM.STM<boolean> = STM.gen(this, function*() {
92
+ return (yield* this.first.isEmpty) && (yield* this.second.isEmpty)
93
+ })
94
+
95
+ shutdown: STM.STM<void> = STM.gen(this, function*() {
96
+ yield* this.first.shutdown
97
+ yield* this.second.shutdown
98
+ })
99
+
100
+ isShutdown: STM.STM<boolean> = STM.gen(this, function*() {
101
+ return (yield* this.first.isShutdown) && (yield* this.second.isShutdown)
102
+ })
103
+
104
+ awaitShutdown: STM.STM<void> = STM.gen(this, function*() {
105
+ yield* this.first.awaitShutdown
106
+ yield* this.second.awaitShutdown
107
+ })
108
+ }
109
+
110
+ /** @internal */
111
+ class TSubscriptionRefImpl<in out A> implements TSubscriptionRef.TSubscriptionRef<A> {
112
+ readonly [TSubscriptionRefTypeId] = TSubscriptionRefVariance
113
+ readonly [TRef.TRefTypeId] = tRefVariance
114
+
115
+ constructor(
116
+ readonly ref: TRef.TRef<A>,
117
+ readonly pubsub: TPubSub.TPubSub<A>
118
+ ) {}
119
+
120
+ get todos() {
121
+ return this.ref.todos
122
+ }
123
+
124
+ get versioned() {
125
+ return this.ref.versioned
126
+ }
127
+
128
+ pipe() {
129
+ return pipeArguments(this, arguments)
130
+ }
131
+
132
+ get changes(): STM.STM<TQueue.TDequeue<A>> {
133
+ return STM.gen(this, function*() {
134
+ const first = yield* TQueue.unbounded<A>()
135
+ yield* TQueue.offer(first, yield* TRef.get(this.ref))
136
+ return new TDequeueMerge(first, yield* TPubSub.subscribe(this.pubsub))
137
+ })
138
+ }
139
+
140
+ modify<B>(f: (a: A) => readonly [B, A]): STM.STM<B> {
141
+ return pipe(
142
+ TRef.get(this.ref),
143
+ STM.map(f),
144
+ STM.flatMap(([b, a]) =>
145
+ pipe(
146
+ TRef.set(this.ref, a),
147
+ STM.as(b),
148
+ STM.zipLeft(TPubSub.publish(this.pubsub, a))
149
+ )
150
+ )
151
+ )
152
+ }
153
+ }
154
+
155
+ /** @internal */
156
+ export const make = <A>(value: A): STM.STM<TSubscriptionRef.TSubscriptionRef<A>> =>
157
+ pipe(
158
+ STM.all([
159
+ TPubSub.unbounded<A>(),
160
+ TRef.make(value)
161
+ ]),
162
+ STM.map(([pubsub, ref]) => new TSubscriptionRefImpl(ref, pubsub))
163
+ )
164
+
165
+ /** @internal */
166
+ export const get = <A>(self: TSubscriptionRef.TSubscriptionRef<A>) => TRef.get(self.ref)
167
+
168
+ /** @internal */
169
+ export const set = dual<
170
+ <A>(value: A) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<void>,
171
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, value: A) => STM.STM<void>
172
+ >(
173
+ 2,
174
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, value: A): STM.STM<void> =>
175
+ self.modify((): [void, A] => [void 0, value])
176
+ )
177
+
178
+ /** @internal */
179
+ export const getAndSet = dual<
180
+ <A>(value: A) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<A>,
181
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, value: A) => STM.STM<A>
182
+ >(2, (self, value) => self.modify((a) => [a, value]))
183
+
184
+ /** @internal */
185
+ export const getAndUpdate = dual<
186
+ <A>(f: (a: A) => A) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<A>,
187
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, f: (a: A) => A) => STM.STM<A>
188
+ >(2, (self, f) => self.modify((a) => [a, f(a)]))
189
+
190
+ /** @internal */
191
+ export const getAndUpdateSome = dual<
192
+ <A>(f: (a: A) => Option.Option<A>) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<A>,
193
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, f: (a: A) => Option.Option<A>) => STM.STM<A>
194
+ >(2, (self, f) =>
195
+ self.modify((a) =>
196
+ Option.match(f(a), {
197
+ onNone: () => [a, a],
198
+ onSome: (b) => [a, b]
199
+ })
200
+ ))
201
+
202
+ /** @internal */
203
+ export const setAndGet = dual<
204
+ <A>(value: A) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<A>,
205
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, value: A) => STM.STM<A>
206
+ >(2, (self, value) => self.modify(() => [value, value]))
207
+
208
+ /** @internal */
209
+ export const modify = dual<
210
+ <A, B>(f: (a: A) => readonly [B, A]) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<B>,
211
+ <A, B>(self: TSubscriptionRef.TSubscriptionRef<A>, f: (a: A) => readonly [B, A]) => STM.STM<B>
212
+ >(2, (self, f) => self.modify(f))
213
+
214
+ /** @internal */
215
+ export const modifySome = dual<
216
+ <A, B>(
217
+ fallback: B,
218
+ f: (a: A) => Option.Option<readonly [B, A]>
219
+ ) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<B>,
220
+ <A, B>(
221
+ self: TSubscriptionRef.TSubscriptionRef<A>,
222
+ fallback: B,
223
+ f: (a: A) => Option.Option<readonly [B, A]>
224
+ ) => STM.STM<B>
225
+ >(3, (self, fallback, f) =>
226
+ self.modify((a) =>
227
+ Option.match(f(a), {
228
+ onNone: () => [fallback, a],
229
+ onSome: (b) => b
230
+ })
231
+ ))
232
+
233
+ /** @internal */
234
+ export const update = dual<
235
+ <A>(f: (a: A) => A) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<void>,
236
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, f: (a: A) => A) => STM.STM<void>
237
+ >(2, (self, f) => self.modify((a) => [void 0, f(a)]))
238
+
239
+ /** @internal */
240
+ export const updateAndGet = dual<
241
+ <A>(f: (a: A) => A) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<A>,
242
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, f: (a: A) => A) => STM.STM<A>
243
+ >(2, (self, f) =>
244
+ self.modify((a) => {
245
+ const b = f(a)
246
+ return [b, b]
247
+ }))
248
+
249
+ /** @internal */
250
+ export const updateSome = dual<
251
+ <A>(f: (a: A) => Option.Option<A>) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<void>,
252
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, f: (a: A) => Option.Option<A>) => STM.STM<void>
253
+ >(
254
+ 2,
255
+ (self, f) =>
256
+ self.modify((a) => [
257
+ void 0,
258
+ Option.match(f(a), {
259
+ onNone: () => a,
260
+ onSome: (b) => b
261
+ })
262
+ ])
263
+ )
264
+
265
+ /** @internal */
266
+ export const updateSomeAndGet = dual<
267
+ <A>(f: (a: A) => Option.Option<A>) => (self: TSubscriptionRef.TSubscriptionRef<A>) => STM.STM<A>,
268
+ <A>(self: TSubscriptionRef.TSubscriptionRef<A>, f: (a: A) => Option.Option<A>) => STM.STM<A>
269
+ >(
270
+ 2,
271
+ (self, f) =>
272
+ self.modify((a) =>
273
+ Option.match(f(a), {
274
+ onNone: () => [a, a],
275
+ onSome: (b) => [b, b]
276
+ })
277
+ )
278
+ )
279
+
280
+ /** @internal */
281
+ export const changesScoped = <A>(self: TSubscriptionRef.TSubscriptionRef<A>) =>
282
+ Effect.acquireRelease(self.changes, TQueue.shutdown)
283
+
284
+ /** @internal */
285
+ export const changesStream = <A>(self: TSubscriptionRef.TSubscriptionRef<A>) =>
286
+ stream.unwrap(Effect.map(self.changes, stream.fromTQueue))
@@ -18,7 +18,7 @@ import * as MergeDecision from "../MergeDecision.js"
18
18
  import * as Option from "../Option.js"
19
19
  import type * as Order from "../Order.js"
20
20
  import { pipeArguments } from "../Pipeable.js"
21
- import { hasProperty, isTagged, type Predicate, type Refinement } from "../Predicate.js"
21
+ import { hasProperty, type Predicate, type Refinement } from "../Predicate.js"
22
22
  import * as PubSub from "../PubSub.js"
23
23
  import * as Queue from "../Queue.js"
24
24
  import * as RcRef from "../RcRef.js"
@@ -31,6 +31,8 @@ import type * as Stream from "../Stream.js"
31
31
  import type * as Emit from "../StreamEmit.js"
32
32
  import * as HaltStrategy from "../StreamHaltStrategy.js"
33
33
  import type * as Take from "../Take.js"
34
+ import * as TPubSub from "../TPubSub.js"
35
+ import * as TQueue from "../TQueue.js"
34
36
  import type * as Tracer from "../Tracer.js"
35
37
  import * as Tuple from "../Tuple.js"
36
38
  import type { NoInfer, TupleOf } from "../Types.js"
@@ -3133,6 +3135,14 @@ export const fromPubSub: {
3133
3135
  return options?.shutdown ? ensuring(stream, PubSub.shutdown(pubsub)) : stream
3134
3136
  }
3135
3137
 
3138
+ /** @internal */
3139
+ export const fromTPubSub = <A>(pubsub: TPubSub.TPubSub<A>): Stream.Stream<A> => {
3140
+ return unwrapScoped(Effect.map(
3141
+ TPubSub.subscribeScoped(pubsub),
3142
+ (queue) => fromTQueue(queue)
3143
+ ))
3144
+ }
3145
+
3136
3146
  /** @internal */
3137
3147
  export const fromIterable = <A>(iterable: Iterable<A>): Stream.Stream<A> =>
3138
3148
  suspend(() =>
@@ -3224,6 +3234,24 @@ export const fromQueue = <A>(
3224
3234
  options?.shutdown ? ensuring(Queue.shutdown(queue)) : identity
3225
3235
  )
3226
3236
 
3237
+ /** @internal */
3238
+ export const fromTQueue = <A>(queue: TQueue.TDequeue<A>): Stream.Stream<A> =>
3239
+ pipe(
3240
+ TQueue.take(queue),
3241
+ Effect.map(Chunk.of),
3242
+ Effect.catchAllCause((cause) =>
3243
+ pipe(
3244
+ TQueue.isShutdown(queue),
3245
+ Effect.flatMap((isShutdown) =>
3246
+ isShutdown && Cause.isInterrupted(cause) ?
3247
+ pull.end() :
3248
+ pull.failCause(cause)
3249
+ )
3250
+ )
3251
+ ),
3252
+ repeatEffectChunkOption
3253
+ )
3254
+
3227
3255
  /** @internal */
3228
3256
  export const fromSchedule = <A, R>(schedule: Schedule.Schedule<A, unknown, R>): Stream.Stream<A, never, R> =>
3229
3257
  pipe(
@@ -3233,14 +3261,38 @@ export const fromSchedule = <A, R>(schedule: Schedule.Schedule<A, unknown, R>):
3233
3261
  )
3234
3262
 
3235
3263
  /** @internal */
3236
- export const fromReadableStream = <A, E>(
3237
- evaluate: LazyArg<ReadableStream<A>>,
3238
- onError: (error: unknown) => E
3239
- ): Stream.Stream<A, E> =>
3240
- unwrapScoped(Effect.map(
3264
+ export const fromReadableStream: {
3265
+ <A, E>(
3266
+ options: {
3267
+ readonly evaluate: LazyArg<ReadableStream<A>>
3268
+ readonly onError: (error: unknown) => E
3269
+ readonly releaseLockOnEnd?: boolean | undefined
3270
+ }
3271
+ ): Stream.Stream<A, E>
3272
+ <A, E>(
3273
+ evaluate: LazyArg<ReadableStream<A>>,
3274
+ onError: (error: unknown) => E
3275
+ ): Stream.Stream<A, E>
3276
+ } = <A, E>(
3277
+ ...args: [options: {
3278
+ readonly evaluate: LazyArg<ReadableStream<A>>
3279
+ readonly onError: (error: unknown) => E
3280
+ readonly releaseLockOnEnd?: boolean | undefined
3281
+ }] | [
3282
+ evaluate: LazyArg<ReadableStream<A>>,
3283
+ onError: (error: unknown) => E
3284
+ ]
3285
+ ): Stream.Stream<A, E> => {
3286
+ const evaluate = args.length === 1 ? args[0].evaluate : args[0]
3287
+ const onError = args.length === 1 ? args[0].onError : args[1]
3288
+ const releaseLockOnEnd = args.length === 1 ? args[0].releaseLockOnEnd === true : false
3289
+ return unwrapScoped(Effect.map(
3241
3290
  Effect.acquireRelease(
3242
3291
  Effect.sync(() => evaluate().getReader()),
3243
- (reader) => Effect.promise(() => reader.cancel())
3292
+ (reader) =>
3293
+ releaseLockOnEnd
3294
+ ? Effect.sync(() => reader.releaseLock())
3295
+ : Effect.promise(() => reader.cancel())
3244
3296
  ),
3245
3297
  (reader) =>
3246
3298
  repeatEffectOption(
@@ -3253,34 +3305,59 @@ export const fromReadableStream = <A, E>(
3253
3305
  )
3254
3306
  )
3255
3307
  ))
3308
+ }
3256
3309
 
3257
3310
  /** @internal */
3258
- export const fromReadableStreamByob = <E>(
3259
- evaluate: LazyArg<ReadableStream<Uint8Array>>,
3260
- onError: (error: unknown) => E,
3261
- allocSize = 4096
3262
- ): Stream.Stream<Uint8Array, E> =>
3263
- unwrapScoped(Effect.map(
3311
+ export const fromReadableStreamByob: {
3312
+ <E>(
3313
+ options: {
3314
+ readonly evaluate: LazyArg<ReadableStream<Uint8Array>>
3315
+ readonly onError: (error: unknown) => E
3316
+ readonly bufferSize?: number | undefined
3317
+ readonly releaseLockOnEnd?: boolean | undefined
3318
+ }
3319
+ ): Stream.Stream<Uint8Array, E>
3320
+ <E>(
3321
+ evaluate: LazyArg<ReadableStream<Uint8Array>>,
3322
+ onError: (error: unknown) => E,
3323
+ allocSize?: number
3324
+ ): Stream.Stream<Uint8Array, E>
3325
+ } = <E>(
3326
+ ...args: [options: {
3327
+ readonly evaluate: LazyArg<ReadableStream<Uint8Array>>
3328
+ readonly onError: (error: unknown) => E
3329
+ readonly bufferSize?: number | undefined
3330
+ readonly releaseLockOnEnd?: boolean | undefined
3331
+ }] | [
3332
+ evaluate: LazyArg<ReadableStream<Uint8Array>>,
3333
+ onError: (error: unknown) => E,
3334
+ allocSize?: number | undefined
3335
+ ]
3336
+ ): Stream.Stream<Uint8Array, E> => {
3337
+ const evaluate = args.length === 1 ? args[0].evaluate : args[0]
3338
+ const onError = args.length === 1 ? args[0].onError : args[1]
3339
+ const allocSize = (args.length === 1 ? args[0].bufferSize : args[2]) ?? 4096
3340
+ const releaseLockOnEnd = args.length === 1 ? args[0].releaseLockOnEnd === true : false
3341
+ return unwrapScoped(Effect.map(
3264
3342
  Effect.acquireRelease(
3265
3343
  Effect.sync(() => evaluate().getReader({ mode: "byob" })),
3266
- (reader) => Effect.promise(() => reader.cancel())
3344
+ (reader) => releaseLockOnEnd ? Effect.sync(() => reader.releaseLock()) : Effect.promise(() => reader.cancel())
3267
3345
  ),
3268
3346
  (reader) =>
3269
3347
  catchAll(
3270
3348
  forever(readChunkStreamByobReader(reader, onError, allocSize)),
3271
- (error) => isTagged(error, "EOF") ? empty : fail(error as E)
3349
+ (error) => error === EOF ? empty : fail(error)
3272
3350
  )
3273
3351
  ))
3274
-
3275
- interface EOF {
3276
- readonly _tag: "EOF"
3277
3352
  }
3278
3353
 
3354
+ const EOF = Symbol.for("effect/Stream/EOF")
3355
+
3279
3356
  const readChunkStreamByobReader = <E>(
3280
3357
  reader: ReadableStreamBYOBReader,
3281
3358
  onError: (error: unknown) => E,
3282
3359
  size: number
3283
- ): Stream.Stream<Uint8Array, E | EOF> => {
3360
+ ): Stream.Stream<Uint8Array, E | typeof EOF> => {
3284
3361
  const buffer = new ArrayBuffer(size)
3285
3362
  return paginateEffect(0, (offset) =>
3286
3363
  Effect.flatMap(
@@ -3290,7 +3367,7 @@ const readChunkStreamByobReader = <E>(
3290
3367
  }),
3291
3368
  ({ done, value }) => {
3292
3369
  if (done) {
3293
- return Effect.fail({ _tag: "EOF" })
3370
+ return Effect.fail(EOF)
3294
3371
  }
3295
3372
  const newOffset = offset + value.byteLength
3296
3373
  return Effect.succeed([
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.9.2"
1
+ let moduleVersion = "3.10.1"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4