@typed/fx 1.27.2 → 1.27.4
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.
- package/dist/cjs/AsyncData.js +6 -1
- package/dist/cjs/AsyncData.js.map +1 -1
- package/dist/cjs/Emitter.js.map +1 -1
- package/dist/cjs/Form.js.map +1 -1
- package/dist/cjs/FormEntry.js.map +1 -1
- package/dist/cjs/Fx.js +7 -2
- package/dist/cjs/Fx.js.map +1 -1
- package/dist/cjs/Idle.js.map +1 -1
- package/dist/cjs/Match.js.map +1 -1
- package/dist/cjs/Pull.js.map +1 -1
- package/dist/cjs/Push.js.map +1 -1
- package/dist/cjs/RefArray.js.map +1 -1
- package/dist/cjs/RefChunk.js.map +1 -1
- package/dist/cjs/RefHashMap.js.map +1 -1
- package/dist/cjs/RefHashSet.js.map +1 -1
- package/dist/cjs/RefSubject.js +8 -8
- package/dist/cjs/RefSubject.js.map +1 -1
- package/dist/cjs/Sink.js.map +1 -1
- package/dist/cjs/Stream.js.map +1 -1
- package/dist/cjs/Subject.js +26 -19
- package/dist/cjs/Subject.js.map +1 -1
- package/dist/cjs/TypeId.js.map +1 -1
- package/dist/cjs/Typeclass.js.map +1 -1
- package/dist/cjs/Versioned.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/DeferredRef.js.map +1 -1
- package/dist/cjs/internal/UnionToTuple.js.map +1 -1
- package/dist/cjs/internal/bounds.js.map +1 -1
- package/dist/cjs/internal/core.js.map +1 -1
- package/dist/cjs/internal/diff.js.map +1 -1
- package/dist/cjs/internal/effect-loop-operator.js.map +1 -1
- package/dist/cjs/internal/effect-operator.js.map +1 -1
- package/dist/cjs/internal/effect-producer.js.map +1 -1
- package/dist/cjs/internal/helpers.js.map +1 -1
- package/dist/cjs/internal/keyed.js.map +1 -1
- package/dist/cjs/internal/loop-operator.js.map +1 -1
- package/dist/cjs/internal/operator.js.map +1 -1
- package/dist/cjs/internal/protos.js.map +1 -1
- package/dist/cjs/internal/provide.js.map +1 -1
- package/dist/cjs/internal/requestIdleCallback.js.map +1 -1
- package/dist/cjs/internal/share.js.map +1 -1
- package/dist/cjs/internal/strategies.js.map +1 -1
- package/dist/cjs/internal/sync-operator.js.map +1 -1
- package/dist/cjs/internal/sync-producer.js.map +1 -1
- package/dist/cjs/internal/withKey.js.map +1 -1
- package/dist/dts/AsyncData.d.ts +4 -0
- package/dist/dts/AsyncData.d.ts.map +1 -1
- package/dist/dts/Fx.d.ts +5 -1
- package/dist/dts/Fx.d.ts.map +1 -1
- package/dist/dts/RefSubject.d.ts +5 -14
- package/dist/dts/RefSubject.d.ts.map +1 -1
- package/dist/dts/Subject.d.ts.map +1 -1
- package/dist/esm/AsyncData.js +4 -0
- package/dist/esm/AsyncData.js.map +1 -1
- package/dist/esm/Fx.js +4 -0
- package/dist/esm/Fx.js.map +1 -1
- package/dist/esm/RefSubject.js +8 -8
- package/dist/esm/RefSubject.js.map +1 -1
- package/dist/esm/Subject.js +28 -17
- package/dist/esm/Subject.js.map +1 -1
- package/package.json +7 -7
- package/src/AsyncData.ts +6 -0
- package/src/Fx.ts +6 -1
- package/src/RefSubject.ts +30 -32
- package/src/Subject.ts +43 -32
package/src/Subject.ts
CHANGED
|
@@ -78,8 +78,7 @@ const DISCARD = { discard: true } as const
|
|
|
78
78
|
* @internal
|
|
79
79
|
*/
|
|
80
80
|
export class SubjectImpl<A, E> extends FxBase<A, E, Scope.Scope> implements Subject<A, E> {
|
|
81
|
-
protected sinks: Set<readonly [Sink<A, E, any>, Context.Context<any
|
|
82
|
-
protected scopes: Set<Scope.CloseableScope> = new Set()
|
|
81
|
+
protected sinks: Set<readonly [Sink<A, E, any>, Context.Context<any>, Scope.CloseableScope]> = new Set()
|
|
83
82
|
|
|
84
83
|
constructor() {
|
|
85
84
|
super()
|
|
@@ -101,16 +100,17 @@ export class SubjectImpl<A, E> extends FxBase<A, E, Scope.Scope> implements Subj
|
|
|
101
100
|
return this.onEvent(a)
|
|
102
101
|
}
|
|
103
102
|
|
|
104
|
-
|
|
103
|
+
protected interruptScopes = Effect.fiberIdWith((id) =>
|
|
105
104
|
Effect.tap(
|
|
106
|
-
Effect.forEach(this.
|
|
105
|
+
Effect.forEach(this.sinks, ([, , scope]) => Scope.close(scope, Exit.interrupt(id)), DISCARD),
|
|
107
106
|
() => {
|
|
108
107
|
this.sinks.clear()
|
|
109
|
-
this.scopes.clear()
|
|
110
108
|
}
|
|
111
109
|
)
|
|
112
110
|
)
|
|
113
111
|
|
|
112
|
+
readonly interrupt = this.interruptScopes
|
|
113
|
+
|
|
114
114
|
protected addSink<R, B, R2>(
|
|
115
115
|
sink: Sink<A, E, R>,
|
|
116
116
|
f: (scope: Scope.Scope) => Effect.Effect<B, never, R2>
|
|
@@ -118,19 +118,13 @@ export class SubjectImpl<A, E> extends FxBase<A, E, Scope.Scope> implements Subj
|
|
|
118
118
|
return withScope(
|
|
119
119
|
(innerScope) =>
|
|
120
120
|
Effect.contextWithEffect((ctx) => {
|
|
121
|
-
const entry = [sink, ctx] as const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
this.scopes.add(innerScope)
|
|
125
|
-
})
|
|
126
|
-
const remove = Effect.sync(() => {
|
|
127
|
-
this.sinks.delete(entry)
|
|
128
|
-
this.scopes.delete(innerScope)
|
|
129
|
-
})
|
|
121
|
+
const entry = [sink, ctx, innerScope] as const
|
|
122
|
+
this.sinks.add(entry)
|
|
123
|
+
const remove = Effect.sync(() => this.sinks.delete(entry))
|
|
130
124
|
|
|
131
125
|
return Effect.zipRight(
|
|
132
126
|
Scope.addFinalizer(innerScope, remove),
|
|
133
|
-
|
|
127
|
+
f(innerScope)
|
|
134
128
|
)
|
|
135
129
|
}),
|
|
136
130
|
ExecutionStrategy.sequential
|
|
@@ -141,20 +135,41 @@ export class SubjectImpl<A, E> extends FxBase<A, E, Scope.Scope> implements Subj
|
|
|
141
135
|
|
|
142
136
|
protected onEvent(a: A) {
|
|
143
137
|
if (this.sinks.size === 0) return Effect.unit
|
|
144
|
-
else {
|
|
145
|
-
|
|
138
|
+
else if (this.sinks.size === 1) {
|
|
139
|
+
const [sink, ctx] = this.sinks.values().next().value
|
|
140
|
+
return runSinkEvent(sink, ctx, a)
|
|
141
|
+
} else {
|
|
142
|
+
return Effect.forEach(
|
|
143
|
+
this.sinks,
|
|
144
|
+
([sink, ctx]) => runSinkEvent(sink, ctx, a),
|
|
145
|
+
DISCARD
|
|
146
|
+
)
|
|
146
147
|
}
|
|
147
148
|
}
|
|
148
149
|
|
|
149
150
|
protected onCause(cause: Cause.Cause<E>) {
|
|
150
|
-
return Effect.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
if (this.sinks.size === 0) return Effect.unit
|
|
152
|
+
else if (this.sinks.size === 1) {
|
|
153
|
+
const [sink, ctx] = this.sinks.values().next().value
|
|
154
|
+
return runSinkCause(sink, ctx, cause)
|
|
155
|
+
} else {
|
|
156
|
+
return Effect.forEach(
|
|
157
|
+
this.sinks,
|
|
158
|
+
([sink, ctx]) => runSinkCause(sink, ctx, cause),
|
|
159
|
+
DISCARD
|
|
160
|
+
)
|
|
161
|
+
}
|
|
155
162
|
}
|
|
156
163
|
}
|
|
157
164
|
|
|
165
|
+
function runSinkEvent<A, E>(sink: Sink<A, E, any>, ctx: Context.Context<any>, a: A) {
|
|
166
|
+
return Effect.provide(Effect.catchAllCause(sink.onSuccess(a), sink.onFailure), ctx)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function runSinkCause<A, E>(sink: Sink<A, E, any>, ctx: Context.Context<any>, cause: Cause.Cause<E>) {
|
|
170
|
+
return Effect.provide(Effect.catchAllCause(sink.onFailure(cause), () => Effect.unit), ctx)
|
|
171
|
+
}
|
|
172
|
+
|
|
158
173
|
/**
|
|
159
174
|
* @internal
|
|
160
175
|
*/
|
|
@@ -185,11 +200,9 @@ export class HoldSubjectImpl<A, E> extends SubjectImpl<A, E> implements Subject<
|
|
|
185
200
|
}))
|
|
186
201
|
}
|
|
187
202
|
|
|
188
|
-
readonly interrupt = Effect.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
() => MutableRef.set(this.lastValue, Option.none())
|
|
192
|
-
)
|
|
203
|
+
readonly interrupt = Effect.tap(
|
|
204
|
+
this.interruptScopes,
|
|
205
|
+
() => MutableRef.set(this.lastValue, Option.none())
|
|
193
206
|
)
|
|
194
207
|
}
|
|
195
208
|
|
|
@@ -216,11 +229,9 @@ export class ReplaySubjectImpl<A, E> extends SubjectImpl<A, E> {
|
|
|
216
229
|
)
|
|
217
230
|
}
|
|
218
231
|
|
|
219
|
-
readonly interrupt = Effect.
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
() => this.buffer.clear()
|
|
223
|
-
)
|
|
232
|
+
readonly interrupt = Effect.tap(
|
|
233
|
+
this.interruptScopes,
|
|
234
|
+
() => this.buffer.clear()
|
|
224
235
|
)
|
|
225
236
|
}
|
|
226
237
|
|