@fncts/io 0.0.32 → 0.0.33
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/Fiber/FiberRuntime.d.ts +3 -3
- package/IO/api.d.ts +2 -1
- package/IO/definition.d.ts +34 -24
- package/IO/runtime.d.ts +7 -17
- package/STM/definition.d.ts +1 -1
- package/Stream/api.d.ts +89 -1
- package/_cjs/Channel/api/mapOutConcurrentIO.cjs +1 -1
- package/_cjs/Channel/api/mapOutConcurrentIO.cjs.map +1 -1
- package/_cjs/Channel/api/mergeAllWith.cjs +3 -3
- package/_cjs/Channel/api/mergeAllWith.cjs.map +1 -1
- package/_cjs/Channel/api/mergeWith.cjs +4 -4
- package/_cjs/Channel/api/mergeWith.cjs.map +1 -1
- package/_cjs/Channel/api/toPull.cjs +2 -2
- package/_cjs/Channel/api/toPull.cjs.map +1 -1
- package/_cjs/Channel/api.cjs +6 -6
- package/_cjs/Channel/api.cjs.map +1 -1
- package/_cjs/Channel/internal/ChannelExecutor.cjs +10 -10
- package/_cjs/Channel/internal/ChannelExecutor.cjs.map +1 -1
- package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs +3 -3
- package/_cjs/Channel/internal/SingleProducerAsyncInput.cjs.map +1 -1
- package/_cjs/Clock/live.cjs +1 -1
- package/_cjs/Clock/live.cjs.map +1 -1
- package/_cjs/Fiber/FiberRuntime.cjs +78 -47
- package/_cjs/Fiber/FiberRuntime.cjs.map +1 -1
- package/_cjs/Fiber/api/collectAll.cjs +1 -1
- package/_cjs/Fiber/api/collectAll.cjs.map +1 -1
- package/_cjs/Fiber/api/mapIO.cjs +1 -1
- package/_cjs/Fiber/api/mapIO.cjs.map +1 -1
- package/_cjs/Fiber/api/zipWith.cjs +1 -1
- package/_cjs/Fiber/api/zipWith.cjs.map +1 -1
- package/_cjs/Fiber/constructors.cjs +5 -5
- package/_cjs/Fiber/constructors.cjs.map +1 -1
- package/_cjs/FiberRef/unsafe.cjs +3 -2
- package/_cjs/FiberRef/unsafe.cjs.map +1 -1
- package/_cjs/Future/api.cjs +4 -4
- package/_cjs/Future/api.cjs.map +1 -1
- package/_cjs/Hub/internal.cjs +1 -1
- package/_cjs/Hub/internal.cjs.map +1 -1
- package/_cjs/IO/api/asyncIO.cjs +1 -1
- package/_cjs/IO/api/asyncIO.cjs.map +1 -1
- package/_cjs/IO/api/asyncInterrupt.cjs +2 -2
- package/_cjs/IO/api/asyncInterrupt.cjs.map +1 -1
- package/_cjs/IO/api/concurrency.cjs +3 -3
- package/_cjs/IO/api/concurrency.cjs.map +1 -1
- package/_cjs/IO/api/daemonChildren.cjs +1 -1
- package/_cjs/IO/api/daemonChildren.cjs.map +1 -1
- package/_cjs/IO/api/fork.cjs +2 -1
- package/_cjs/IO/api/fork.cjs.map +1 -1
- package/_cjs/IO/api/interrupt.cjs +2 -2
- package/_cjs/IO/api/interrupt.cjs.map +1 -1
- package/_cjs/IO/api/repeat.cjs +2 -2
- package/_cjs/IO/api/repeat.cjs.map +1 -1
- package/_cjs/IO/api/timeout.cjs +1 -1
- package/_cjs/IO/api/timeout.cjs.map +1 -1
- package/_cjs/IO/api/transplant.cjs +1 -1
- package/_cjs/IO/api/transplant.cjs.map +1 -1
- package/_cjs/IO/api/withEarlyRelease.cjs +1 -1
- package/_cjs/IO/api/withEarlyRelease.cjs.map +1 -1
- package/_cjs/IO/api.cjs +33 -32
- package/_cjs/IO/api.cjs.map +1 -1
- package/_cjs/IO/definition.cjs +17 -31
- package/_cjs/IO/definition.cjs.map +1 -1
- package/_cjs/IO/runtime.cjs +45 -38
- package/_cjs/IO/runtime.cjs.map +1 -1
- package/_cjs/Logger/api.cjs +3 -2
- package/_cjs/Logger/api.cjs.map +1 -1
- package/_cjs/MVar/api.cjs +11 -11
- package/_cjs/MVar/api.cjs.map +1 -1
- package/_cjs/Push/api.cjs +3 -3
- package/_cjs/Push/api.cjs.map +1 -1
- package/_cjs/Push/internal.cjs +1 -1
- package/_cjs/Push/internal.cjs.map +1 -1
- package/_cjs/Queue/api/filterInputIO.cjs +2 -2
- package/_cjs/Queue/api/filterInputIO.cjs.map +1 -1
- package/_cjs/Ref/Derived.cjs +4 -4
- package/_cjs/Ref/Derived.cjs.map +1 -1
- package/_cjs/Ref/DerivedAll.cjs +5 -5
- package/_cjs/Ref/DerivedAll.cjs.map +1 -1
- package/_cjs/Ref/Synchronized/api.cjs +3 -3
- package/_cjs/Ref/Synchronized/api.cjs.map +1 -1
- package/_cjs/Ref/api/collect.cjs +1 -1
- package/_cjs/Ref/api/collect.cjs.map +1 -1
- package/_cjs/Ref/api/dimap.cjs +3 -3
- package/_cjs/Ref/api/dimap.cjs.map +1 -1
- package/_cjs/Ref/api/filter.cjs +2 -2
- package/_cjs/Ref/api/filter.cjs.map +1 -1
- package/_cjs/Ref/api.cjs +2 -3
- package/_cjs/Ref/api.cjs.map +1 -1
- package/_cjs/RefSubject/Atomic.cjs +6 -6
- package/_cjs/RefSubject/Atomic.cjs.map +1 -1
- package/_cjs/STM/api.cjs +5 -5
- package/_cjs/STM/api.cjs.map +1 -1
- package/_cjs/STM/definition.cjs +1 -1
- package/_cjs/STM/definition.cjs.map +1 -1
- package/_cjs/STM/internal/CommitState.cjs +5 -4
- package/_cjs/STM/internal/CommitState.cjs.map +1 -1
- package/_cjs/STM/internal/Journal.cjs +8 -8
- package/_cjs/STM/internal/Journal.cjs.map +1 -1
- package/_cjs/Schedule/api/driver.cjs +3 -3
- package/_cjs/Schedule/api/driver.cjs.map +1 -1
- package/_cjs/Schedule/api.cjs +8 -8
- package/_cjs/Schedule/api.cjs.map +1 -1
- package/_cjs/Scope/ReleaseMap/api/releaseAll.cjs +1 -1
- package/_cjs/Scope/ReleaseMap/api/releaseAll.cjs.map +1 -1
- package/_cjs/Scope/ReleaseMap/api.cjs +3 -3
- package/_cjs/Scope/ReleaseMap/api.cjs.map +1 -1
- package/_cjs/ScopedRef/api.cjs +1 -1
- package/_cjs/ScopedRef/api.cjs.map +1 -1
- package/_cjs/Semaphore.cjs +2 -2
- package/_cjs/Semaphore.cjs.map +1 -1
- package/_cjs/Sink/api.cjs +6 -6
- package/_cjs/Sink/api.cjs.map +1 -1
- package/_cjs/Stream/api/zipAllWith.cjs +8 -8
- package/_cjs/Stream/api/zipAllWith.cjs.map +1 -1
- package/_cjs/Stream/api/zipWithChunks.cjs +6 -6
- package/_cjs/Stream/api/zipWithChunks.cjs.map +1 -1
- package/_cjs/Stream/api.cjs +370 -130
- package/_cjs/Stream/api.cjs.map +1 -1
- package/_cjs/Stream/internal/Handoff.cjs +2 -2
- package/_cjs/Stream/internal/Handoff.cjs.map +1 -1
- package/_cjs/Stream/internal/Pull.cjs +2 -2
- package/_cjs/Stream/internal/Pull.cjs.map +1 -1
- package/_cjs/Stream/internal/Take.cjs +6 -6
- package/_cjs/Stream/internal/Take.cjs.map +1 -1
- package/_cjs/Stream/internal/util.cjs +3 -2
- package/_cjs/Stream/internal/util.cjs.map +1 -1
- package/_cjs/TFuture/api.cjs +3 -3
- package/_cjs/TFuture/api.cjs.map +1 -1
- package/_cjs/TFuture/constructors.cjs +1 -1
- package/_cjs/TFuture/constructors.cjs.map +1 -1
- package/_cjs/TRef/definition.cjs +9 -9
- package/_cjs/TRef/definition.cjs.map +1 -1
- package/_cjs/collection/immutable/Conc/findIO.cjs +3 -3
- package/_cjs/collection/immutable/Conc/findIO.cjs.map +1 -1
- package/_cjs/data/Exit/foreachIO.cjs +1 -1
- package/_cjs/data/Exit/foreachIO.cjs.map +1 -1
- package/_mjs/Channel/api/mapOutConcurrentIO.mjs +1 -1
- package/_mjs/Channel/api/mapOutConcurrentIO.mjs.map +1 -1
- package/_mjs/Channel/api/mergeAllWith.mjs +3 -3
- package/_mjs/Channel/api/mergeAllWith.mjs.map +1 -1
- package/_mjs/Channel/api/mergeWith.mjs +4 -4
- package/_mjs/Channel/api/mergeWith.mjs.map +1 -1
- package/_mjs/Channel/api/toPull.mjs +2 -2
- package/_mjs/Channel/api/toPull.mjs.map +1 -1
- package/_mjs/Channel/api.mjs +6 -6
- package/_mjs/Channel/api.mjs.map +1 -1
- package/_mjs/Channel/internal/ChannelExecutor.mjs +10 -10
- package/_mjs/Channel/internal/ChannelExecutor.mjs.map +1 -1
- package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs +3 -3
- package/_mjs/Channel/internal/SingleProducerAsyncInput.mjs.map +1 -1
- package/_mjs/Clock/live.mjs +1 -1
- package/_mjs/Clock/live.mjs.map +1 -1
- package/_mjs/Fiber/FiberRuntime.mjs +78 -47
- package/_mjs/Fiber/FiberRuntime.mjs.map +1 -1
- package/_mjs/Fiber/api/collectAll.mjs +1 -1
- package/_mjs/Fiber/api/collectAll.mjs.map +1 -1
- package/_mjs/Fiber/api/mapIO.mjs +1 -1
- package/_mjs/Fiber/api/mapIO.mjs.map +1 -1
- package/_mjs/Fiber/api/zipWith.mjs +1 -1
- package/_mjs/Fiber/api/zipWith.mjs.map +1 -1
- package/_mjs/Fiber/constructors.mjs +5 -5
- package/_mjs/Fiber/constructors.mjs.map +1 -1
- package/_mjs/FiberRef/unsafe.mjs +3 -2
- package/_mjs/FiberRef/unsafe.mjs.map +1 -1
- package/_mjs/Future/api.mjs +4 -4
- package/_mjs/Future/api.mjs.map +1 -1
- package/_mjs/Hub/internal.mjs +1 -1
- package/_mjs/Hub/internal.mjs.map +1 -1
- package/_mjs/IO/api/asyncIO.mjs +1 -1
- package/_mjs/IO/api/asyncIO.mjs.map +1 -1
- package/_mjs/IO/api/asyncInterrupt.mjs +2 -2
- package/_mjs/IO/api/asyncInterrupt.mjs.map +1 -1
- package/_mjs/IO/api/concurrency.mjs +3 -3
- package/_mjs/IO/api/concurrency.mjs.map +1 -1
- package/_mjs/IO/api/daemonChildren.mjs +1 -1
- package/_mjs/IO/api/daemonChildren.mjs.map +1 -1
- package/_mjs/IO/api/fork.mjs +2 -1
- package/_mjs/IO/api/fork.mjs.map +1 -1
- package/_mjs/IO/api/interrupt.mjs +2 -2
- package/_mjs/IO/api/interrupt.mjs.map +1 -1
- package/_mjs/IO/api/repeat.mjs +2 -2
- package/_mjs/IO/api/repeat.mjs.map +1 -1
- package/_mjs/IO/api/timeout.mjs +1 -1
- package/_mjs/IO/api/timeout.mjs.map +1 -1
- package/_mjs/IO/api/transplant.mjs +1 -1
- package/_mjs/IO/api/transplant.mjs.map +1 -1
- package/_mjs/IO/api/withEarlyRelease.mjs +1 -1
- package/_mjs/IO/api/withEarlyRelease.mjs.map +1 -1
- package/_mjs/IO/api.mjs +32 -30
- package/_mjs/IO/api.mjs.map +1 -1
- package/_mjs/IO/definition.mjs +16 -27
- package/_mjs/IO/definition.mjs.map +1 -1
- package/_mjs/IO/runtime.mjs +42 -33
- package/_mjs/IO/runtime.mjs.map +1 -1
- package/_mjs/Logger/api.mjs +3 -2
- package/_mjs/Logger/api.mjs.map +1 -1
- package/_mjs/MVar/api.mjs +11 -11
- package/_mjs/MVar/api.mjs.map +1 -1
- package/_mjs/Push/api.mjs +3 -3
- package/_mjs/Push/api.mjs.map +1 -1
- package/_mjs/Push/internal.mjs +1 -1
- package/_mjs/Push/internal.mjs.map +1 -1
- package/_mjs/Queue/api/filterInputIO.mjs +2 -2
- package/_mjs/Queue/api/filterInputIO.mjs.map +1 -1
- package/_mjs/Ref/Derived.mjs +4 -4
- package/_mjs/Ref/Derived.mjs.map +1 -1
- package/_mjs/Ref/DerivedAll.mjs +5 -5
- package/_mjs/Ref/DerivedAll.mjs.map +1 -1
- package/_mjs/Ref/Synchronized/api.mjs +3 -3
- package/_mjs/Ref/Synchronized/api.mjs.map +1 -1
- package/_mjs/Ref/api/collect.mjs +1 -1
- package/_mjs/Ref/api/collect.mjs.map +1 -1
- package/_mjs/Ref/api/dimap.mjs +3 -3
- package/_mjs/Ref/api/dimap.mjs.map +1 -1
- package/_mjs/Ref/api/filter.mjs +2 -2
- package/_mjs/Ref/api/filter.mjs.map +1 -1
- package/_mjs/Ref/api.mjs +2 -1
- package/_mjs/Ref/api.mjs.map +1 -1
- package/_mjs/RefSubject/Atomic.mjs +6 -6
- package/_mjs/RefSubject/Atomic.mjs.map +1 -1
- package/_mjs/STM/api.mjs +5 -5
- package/_mjs/STM/api.mjs.map +1 -1
- package/_mjs/STM/definition.mjs +1 -1
- package/_mjs/STM/definition.mjs.map +1 -1
- package/_mjs/STM/internal/CommitState.mjs +5 -4
- package/_mjs/STM/internal/CommitState.mjs.map +1 -1
- package/_mjs/STM/internal/Journal.mjs +8 -8
- package/_mjs/STM/internal/Journal.mjs.map +1 -1
- package/_mjs/Schedule/api/driver.mjs +3 -3
- package/_mjs/Schedule/api/driver.mjs.map +1 -1
- package/_mjs/Schedule/api.mjs +8 -8
- package/_mjs/Schedule/api.mjs.map +1 -1
- package/_mjs/Scope/ReleaseMap/api/releaseAll.mjs +1 -1
- package/_mjs/Scope/ReleaseMap/api/releaseAll.mjs.map +1 -1
- package/_mjs/Scope/ReleaseMap/api.mjs +3 -3
- package/_mjs/Scope/ReleaseMap/api.mjs.map +1 -1
- package/_mjs/ScopedRef/api.mjs +1 -1
- package/_mjs/ScopedRef/api.mjs.map +1 -1
- package/_mjs/Semaphore.mjs +2 -2
- package/_mjs/Semaphore.mjs.map +1 -1
- package/_mjs/Sink/api.mjs +6 -6
- package/_mjs/Sink/api.mjs.map +1 -1
- package/_mjs/Stream/api/zipAllWith.mjs +8 -8
- package/_mjs/Stream/api/zipAllWith.mjs.map +1 -1
- package/_mjs/Stream/api/zipWithChunks.mjs +6 -6
- package/_mjs/Stream/api/zipWithChunks.mjs.map +1 -1
- package/_mjs/Stream/api.mjs +281 -58
- package/_mjs/Stream/api.mjs.map +1 -1
- package/_mjs/Stream/internal/Handoff.mjs +2 -2
- package/_mjs/Stream/internal/Handoff.mjs.map +1 -1
- package/_mjs/Stream/internal/Pull.mjs +2 -2
- package/_mjs/Stream/internal/Pull.mjs.map +1 -1
- package/_mjs/Stream/internal/Take.mjs +6 -6
- package/_mjs/Stream/internal/Take.mjs.map +1 -1
- package/_mjs/Stream/internal/util.mjs +3 -2
- package/_mjs/Stream/internal/util.mjs.map +1 -1
- package/_mjs/TFuture/api.mjs +3 -3
- package/_mjs/TFuture/api.mjs.map +1 -1
- package/_mjs/TFuture/constructors.mjs +1 -1
- package/_mjs/TFuture/constructors.mjs.map +1 -1
- package/_mjs/TRef/definition.mjs +9 -9
- package/_mjs/TRef/definition.mjs.map +1 -1
- package/_mjs/collection/immutable/Conc/findIO.mjs +3 -3
- package/_mjs/collection/immutable/Conc/findIO.mjs.map +1 -1
- package/_mjs/data/Exit/foreachIO.mjs +1 -1
- package/_mjs/data/Exit/foreachIO.mjs.map +1 -1
- package/_src/Fiber/FiberRuntime.ts +39 -16
- package/_src/IO/api/asyncIO.ts +1 -1
- package/_src/IO/api.ts +4 -3
- package/_src/IO/definition.ts +35 -28
- package/_src/IO/runtime.ts +36 -35
- package/_src/RefSubject/Atomic.ts +4 -4
- package/_src/STM/definition.ts +1 -1
- package/_src/Stream/api.ts +258 -8
- package/package.json +2 -2
|
@@ -53,15 +53,15 @@ export class AtomicRefSubject<E, A> extends RefSubjectInternal<never, E, A, A> {
|
|
|
53
53
|
end: IO<never, never, void> = this.stream.end;
|
|
54
54
|
|
|
55
55
|
unsafeEmit(value: A): void {
|
|
56
|
-
|
|
56
|
+
this.stream.emit(value).unsafeRunFiber();
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
unsafeFailCause(cause: Cause<E>): void {
|
|
60
|
-
|
|
60
|
+
this.stream.failCause(cause).unsafeRunFiber();
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
unsafeEnd(): void {
|
|
64
|
-
|
|
64
|
+
this.stream.end.unsafeRunFiber();
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
get unsafeGet(): A {
|
|
@@ -111,7 +111,7 @@ class AtomicEmitRef<E, A> extends Atomic<A> {
|
|
|
111
111
|
|
|
112
112
|
unsafeSet(value: A) {
|
|
113
113
|
this.ref.unsafeSet(value);
|
|
114
|
-
this.emitter.emit(value).
|
|
114
|
+
this.emitter.emit(value).unsafeRunFiber();
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
set(value: A, __tsplusTrace?: string) {
|
package/_src/STM/definition.ts
CHANGED
|
@@ -25,7 +25,7 @@ export type STMTypeId = typeof STMTypeId;
|
|
|
25
25
|
*/
|
|
26
26
|
export abstract class STM<R, E, A> {
|
|
27
27
|
readonly [IOTypeId]: IOTypeId = IOTypeId;
|
|
28
|
-
readonly
|
|
28
|
+
readonly _tag = IOOpCode.Commit;
|
|
29
29
|
readonly trace?: string;
|
|
30
30
|
readonly [STMTypeId]: STMTypeId = STMTypeId;
|
|
31
31
|
declare [IOVariance]: {
|
package/_src/Stream/api.ts
CHANGED
|
@@ -247,7 +247,11 @@ export function asyncInterrupt<R, E, A>(
|
|
|
247
247
|
IO.succeed(() =>
|
|
248
248
|
register((k, cb) => {
|
|
249
249
|
const effect = Take.fromPull(k).flatMap((a) => output.offer(a));
|
|
250
|
-
|
|
250
|
+
const fiber = runtime.makeFiber(effect);
|
|
251
|
+
if (cb) {
|
|
252
|
+
fiber.addObserver(cb);
|
|
253
|
+
}
|
|
254
|
+
fiber.start(effect);
|
|
251
255
|
}),
|
|
252
256
|
),
|
|
253
257
|
);
|
|
@@ -317,12 +321,14 @@ export function asyncIO<R, E, A, R1 = R, E1 = E>(
|
|
|
317
321
|
const output = Δ(IO.acquireRelease(Queue.makeBounded<Take<E, A>>(outputBuffer), (_) => _.shutdown));
|
|
318
322
|
const runtime = Δ(IO.runtime<R>());
|
|
319
323
|
Δ(
|
|
320
|
-
register((k, cb) =>
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
324
|
+
register((k, cb) => {
|
|
325
|
+
const io = Take.fromPull(k).flatMap((a) => output.offer(a));
|
|
326
|
+
const fiber = runtime.makeFiber(io);
|
|
327
|
+
if (cb) {
|
|
328
|
+
fiber.addObserver(cb);
|
|
329
|
+
}
|
|
330
|
+
fiber.start(io);
|
|
331
|
+
}),
|
|
326
332
|
);
|
|
327
333
|
const loop: Channel<never, unknown, unknown, unknown, E, Conc<A>, void> = Channel.unwrap(
|
|
328
334
|
output.take
|
|
@@ -1157,7 +1163,7 @@ export function distributedWithDynamic<E, A>(
|
|
|
1157
1163
|
*
|
|
1158
1164
|
* @tsplus getter fncts.io.Stream drain
|
|
1159
1165
|
*/
|
|
1160
|
-
export function drain<R, E, A>(fa: Stream<R, E, A>, __tsplusTrace?: string): Stream<R, E,
|
|
1166
|
+
export function drain<R, E, A>(fa: Stream<R, E, A>, __tsplusTrace?: string): Stream<R, E, never> {
|
|
1161
1167
|
return new Stream(fa.channel.drain);
|
|
1162
1168
|
}
|
|
1163
1169
|
|
|
@@ -1312,6 +1318,15 @@ export function environmentWithStream<R0, R, E, A>(
|
|
|
1312
1318
|
return Stream.environment<R0>().flatMap(f);
|
|
1313
1319
|
}
|
|
1314
1320
|
|
|
1321
|
+
/**
|
|
1322
|
+
* Creates a stream that executes the specified effect but emits no elements.
|
|
1323
|
+
*
|
|
1324
|
+
* @tsplus static fncts.io.StreamOps execute
|
|
1325
|
+
*/
|
|
1326
|
+
export function execute<R, E>(io: IO<R, E, any>, __tsplusTrace?: string): Stream<R, E, never> {
|
|
1327
|
+
return Stream.fromIO(io).drain;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1315
1330
|
/**
|
|
1316
1331
|
* Halt a stream with the specified error
|
|
1317
1332
|
*
|
|
@@ -1584,6 +1599,65 @@ export function scoped<R, E, A>(stream: Lazy<IO<R, E, A>>, __tsplusTrace?: strin
|
|
|
1584
1599
|
return new Stream(Channel.scoped(stream().map(Conc.single)));
|
|
1585
1600
|
}
|
|
1586
1601
|
|
|
1602
|
+
/**
|
|
1603
|
+
* Emits a sliding window of n elements.
|
|
1604
|
+
*
|
|
1605
|
+
* @tsplus pipeable fncts.io.Stream sliding
|
|
1606
|
+
*/
|
|
1607
|
+
export function sliding(chunkSize: number, stepSize: number, __tsplusTrace?: string) {
|
|
1608
|
+
return <R, E, A>(self: Stream<R, E, A>): Stream<R, E, Conc<A>> => {
|
|
1609
|
+
return Stream.defer(() => {
|
|
1610
|
+
function slidingChunk(chunk: Conc<A>, input: Conc<A>): [Conc<A>, Conc<Conc<A>>] {
|
|
1611
|
+
const updatedChunk = chunk.concat(input);
|
|
1612
|
+
const length = updatedChunk.length;
|
|
1613
|
+
if (length >= chunkSize) {
|
|
1614
|
+
const array = new Array<Conc<A>>((length - chunkSize) / stepSize + 1);
|
|
1615
|
+
let arrayIndex = 0;
|
|
1616
|
+
let chunkIndex = 0;
|
|
1617
|
+
while (chunkIndex + chunkSize <= length) {
|
|
1618
|
+
array[arrayIndex] = updatedChunk.slice(chunkIndex, chunkIndex + chunkSize);
|
|
1619
|
+
arrayIndex += 1;
|
|
1620
|
+
chunkIndex += stepSize;
|
|
1621
|
+
}
|
|
1622
|
+
return [updatedChunk.drop(chunkIndex), Conc.fromArray(array)];
|
|
1623
|
+
} else {
|
|
1624
|
+
return [updatedChunk, Conc.empty()];
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
function sliding(chunk: Conc<A>, written: boolean): Channel<never, E, Conc<A>, any, E, Conc<Conc<A>>, any> {
|
|
1628
|
+
return Channel.readWithCause(
|
|
1629
|
+
(input) => {
|
|
1630
|
+
const [updatedChunk, out] = slidingChunk(chunk, input);
|
|
1631
|
+
if (out.isEmpty) {
|
|
1632
|
+
return sliding(updatedChunk, written);
|
|
1633
|
+
} else {
|
|
1634
|
+
return Channel.writeNow(out) > sliding(updatedChunk, true);
|
|
1635
|
+
}
|
|
1636
|
+
},
|
|
1637
|
+
(err) => {
|
|
1638
|
+
const index = written && chunkSize > stepSize ? chunkSize - stepSize : 0;
|
|
1639
|
+
if (index >= chunk.length) {
|
|
1640
|
+
return Channel.failCauseNow(err);
|
|
1641
|
+
} else {
|
|
1642
|
+
return Channel.writeNow(Conc.single(chunk)) > Channel.failCauseNow(err);
|
|
1643
|
+
}
|
|
1644
|
+
},
|
|
1645
|
+
(done) => {
|
|
1646
|
+
const index = written && chunkSize > stepSize ? chunkSize - stepSize : 0;
|
|
1647
|
+
if (index >= chunk.length) {
|
|
1648
|
+
return Channel.succeedNow(done);
|
|
1649
|
+
} else {
|
|
1650
|
+
return Channel.writeNow(Conc.single(chunk)) > Channel.succeedNow(done);
|
|
1651
|
+
}
|
|
1652
|
+
},
|
|
1653
|
+
);
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
return new Stream(self.channel >>> sliding(Conc.empty(), false));
|
|
1657
|
+
});
|
|
1658
|
+
};
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1587
1661
|
/**
|
|
1588
1662
|
* Creates a stream from an effect producing a value of type `A`
|
|
1589
1663
|
*
|
|
@@ -2218,6 +2292,84 @@ export function mapIOConcurrentlyUnordered<A, R1, E1, B>(n: number, f: (a: A) =>
|
|
|
2218
2292
|
};
|
|
2219
2293
|
}
|
|
2220
2294
|
|
|
2295
|
+
/**
|
|
2296
|
+
* Merges this stream and the specified stream together.
|
|
2297
|
+
*
|
|
2298
|
+
* New produced stream will terminate when both specified stream terminate if
|
|
2299
|
+
* no termination strategy is specified.
|
|
2300
|
+
*
|
|
2301
|
+
* @tsplus pipeable fncts.io.Stream merge
|
|
2302
|
+
*/
|
|
2303
|
+
export function merge<R1, E1, B>(
|
|
2304
|
+
that: Stream<R1, E1, B>,
|
|
2305
|
+
strategy: TerminationStrategy = "Both",
|
|
2306
|
+
__tsplusTrace?: string,
|
|
2307
|
+
) {
|
|
2308
|
+
return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
|
|
2309
|
+
return self.mergeWith(that, identity, identity, strategy);
|
|
2310
|
+
};
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
/**
|
|
2314
|
+
* Merges this stream and the specified stream together. New produced stream
|
|
2315
|
+
* will terminate when either stream terminates.
|
|
2316
|
+
*
|
|
2317
|
+
* @tsplus pipeable fncts.io.Stream mergeHaltEither
|
|
2318
|
+
*/
|
|
2319
|
+
export function mergeHaltEither<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
|
|
2320
|
+
return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
|
|
2321
|
+
return self.merge(that, "Either");
|
|
2322
|
+
};
|
|
2323
|
+
}
|
|
2324
|
+
|
|
2325
|
+
/**
|
|
2326
|
+
* Merges this stream and the specified stream together. New produced stream
|
|
2327
|
+
* will terminate when this stream terminates.
|
|
2328
|
+
*
|
|
2329
|
+
* @tsplus pipeable fncts.io.Stream mergeHaltLeft
|
|
2330
|
+
*/
|
|
2331
|
+
export function mergeHaltLeft<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
|
|
2332
|
+
return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
|
|
2333
|
+
return self.merge(that, "Left");
|
|
2334
|
+
};
|
|
2335
|
+
}
|
|
2336
|
+
|
|
2337
|
+
/**
|
|
2338
|
+
* Merges this stream and the specified stream together. New produced stream
|
|
2339
|
+
* will terminate when the specified stream terminates.
|
|
2340
|
+
*
|
|
2341
|
+
* @tsplus pipeable fncts.io.Stream mergeHaltRight
|
|
2342
|
+
*/
|
|
2343
|
+
export function mergeHaltRight<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
|
|
2344
|
+
return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A | B> => {
|
|
2345
|
+
return self.merge(that, "Right");
|
|
2346
|
+
};
|
|
2347
|
+
}
|
|
2348
|
+
|
|
2349
|
+
/**
|
|
2350
|
+
* Merges this stream and the specified stream together, discarding the values
|
|
2351
|
+
* from the right stream.
|
|
2352
|
+
*
|
|
2353
|
+
* @tsplus pipeable fncts.io.Stream mergeLeft
|
|
2354
|
+
*/
|
|
2355
|
+
export function mergeLeft<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
|
|
2356
|
+
return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
|
|
2357
|
+
return self.merge(that.drain);
|
|
2358
|
+
};
|
|
2359
|
+
}
|
|
2360
|
+
|
|
2361
|
+
/**
|
|
2362
|
+
* Merges this stream and the specified stream together, discarding the values
|
|
2363
|
+
* from the left stream.
|
|
2364
|
+
*
|
|
2365
|
+
* @tsplus pipeable fncts.io.Stream mergeRight
|
|
2366
|
+
*/
|
|
2367
|
+
export function mergeRight<R1, E1, B>(that: Stream<R1, E1, B>, __tsplusTrace?: string) {
|
|
2368
|
+
return <R, E, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, B> => {
|
|
2369
|
+
return self.drain.merge(that);
|
|
2370
|
+
};
|
|
2371
|
+
}
|
|
2372
|
+
|
|
2221
2373
|
/**
|
|
2222
2374
|
* Maps each element of this stream to another stream and returns the
|
|
2223
2375
|
* non-deterministic merge of those streams, executing up to `n` inner streams
|
|
@@ -2733,6 +2885,40 @@ export function scanReduceIO<A extends B, R1, E1, B>(f: (b: B, a: A) => IO<R1, E
|
|
|
2733
2885
|
};
|
|
2734
2886
|
}
|
|
2735
2887
|
|
|
2888
|
+
/**
|
|
2889
|
+
* @tsplus pipeable fncts.io.Stream split
|
|
2890
|
+
*/
|
|
2891
|
+
export function split<A>(predicate: Predicate<A>, __tsplusTrace?: string) {
|
|
2892
|
+
return <R, E>(self: Stream<R, E, A>): Stream<R, E, Conc<A>> => {
|
|
2893
|
+
function split(leftovers: Conc<A>, input: Conc<A>): Channel<R, E, Conc<A>, any, E, Conc<Conc<A>>, any> {
|
|
2894
|
+
const [chunk, remaining] = leftovers.concat(input).splitWhere(predicate);
|
|
2895
|
+
if (chunk.isEmpty || remaining.isEmpty) {
|
|
2896
|
+
return loop(chunk.concat(remaining.drop(1)));
|
|
2897
|
+
} else {
|
|
2898
|
+
return Channel.writeNow(Conc.single(chunk)) > split(Conc.empty(), remaining.drop(1));
|
|
2899
|
+
}
|
|
2900
|
+
}
|
|
2901
|
+
|
|
2902
|
+
function loop(leftovers: Conc<A>): Channel<R, E, Conc<A>, any, E, Conc<Conc<A>>, any> {
|
|
2903
|
+
return Channel.readWith(
|
|
2904
|
+
(input) => split(leftovers, input),
|
|
2905
|
+
Channel.failNow,
|
|
2906
|
+
(_) => {
|
|
2907
|
+
if (leftovers.isEmpty) {
|
|
2908
|
+
return Channel.unit;
|
|
2909
|
+
} else if (leftovers.find(predicate).isNothing()) {
|
|
2910
|
+
return Channel.writeNow(Conc.single(leftovers)) > Channel.unit;
|
|
2911
|
+
} else {
|
|
2912
|
+
return split(Conc.empty(), leftovers) > Channel.unit;
|
|
2913
|
+
}
|
|
2914
|
+
},
|
|
2915
|
+
);
|
|
2916
|
+
}
|
|
2917
|
+
|
|
2918
|
+
return new Stream(self.channel >>> loop(Conc.empty()));
|
|
2919
|
+
};
|
|
2920
|
+
}
|
|
2921
|
+
|
|
2736
2922
|
/**
|
|
2737
2923
|
* Creates a single-valued pure stream
|
|
2738
2924
|
*
|
|
@@ -2856,6 +3042,70 @@ export function tap<A, R1, E1>(f: (a: A) => IO<R1, E1, any>, __tsplusTrace?: str
|
|
|
2856
3042
|
};
|
|
2857
3043
|
}
|
|
2858
3044
|
|
|
3045
|
+
/**
|
|
3046
|
+
* Returns a stream that effectfully "peeks" at the failure and adds an effect
|
|
3047
|
+
* to consumption of every element of the stream
|
|
3048
|
+
*
|
|
3049
|
+
* @tsplus pipeable fncts.io.Stream tapBoth
|
|
3050
|
+
*/
|
|
3051
|
+
export function tapBoth<E, A, R1, E1, R2, E2>(
|
|
3052
|
+
f: (e: E) => IO<R1, E1, any>,
|
|
3053
|
+
g: (a: A) => IO<R2, E2, any>,
|
|
3054
|
+
__tsplusTrace?: string,
|
|
3055
|
+
) {
|
|
3056
|
+
return <R>(self: Stream<R, E, A>): Stream<R | R1 | R2, E | E1 | E2, A> => {
|
|
3057
|
+
return self.tapError(f).tap(g);
|
|
3058
|
+
};
|
|
3059
|
+
}
|
|
3060
|
+
|
|
3061
|
+
/**
|
|
3062
|
+
* Returns a stream that effectfully "peeks" at the failure of the stream.
|
|
3063
|
+
*
|
|
3064
|
+
* @tsplus pipeable fncts.io.Stream tapError
|
|
3065
|
+
*/
|
|
3066
|
+
export function tapError<E, R1, E1>(f: (e: E) => IO<R1, E1, any>, __tsplusTrace?: string) {
|
|
3067
|
+
return <R, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
|
|
3068
|
+
return self.catchAll((e) => Stream.fromIO(f(e)));
|
|
3069
|
+
};
|
|
3070
|
+
}
|
|
3071
|
+
|
|
3072
|
+
/**
|
|
3073
|
+
* Returns a stream that effectfully "peeks" at the cause of failure of the
|
|
3074
|
+
* stream.
|
|
3075
|
+
*
|
|
3076
|
+
* @tsplus pipeable fncts.io.Stream tapErrorCause
|
|
3077
|
+
*/
|
|
3078
|
+
export function tapErrorCause<E, R1, E1>(f: (cause: Cause<E>) => IO<R1, E1, any>, __tsplusTrace?: string) {
|
|
3079
|
+
return <R, A>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
|
|
3080
|
+
return self.catchAllCause((e) => Stream.fromIO(f(e) > IO.refailCause(e)));
|
|
3081
|
+
};
|
|
3082
|
+
}
|
|
3083
|
+
|
|
3084
|
+
/**
|
|
3085
|
+
* Sends all elements emitted by this stream to the specified sink in addition
|
|
3086
|
+
* to emitting them.
|
|
3087
|
+
*
|
|
3088
|
+
* @tsplus pipeable fncts.io.Stream tapSink
|
|
3089
|
+
*/
|
|
3090
|
+
export function tapSink<A, R1, E1>(sink: Sink<R1, E1, A, any, any>, __tsplusTrace?: string) {
|
|
3091
|
+
return <R, E>(self: Stream<R, E, A>): Stream<R | R1, E | E1, A> => {
|
|
3092
|
+
return Stream.fromIO(Queue.makeBounded<Take<E | E1, A>>(1).zip(Future.make<never, void>())).flatMap(
|
|
3093
|
+
([queue, future]) => {
|
|
3094
|
+
const right = Stream.fromQueue(queue, 1).flattenTake;
|
|
3095
|
+
const loop: Channel<R | R1, E, Conc<A>, any, E1, Conc<A>, any> = Channel.readWithCause(
|
|
3096
|
+
(chunk: Conc<A>) => Channel.fromIO(queue.offer(Take.chunk(chunk))) > Channel.writeNow(chunk) > loop,
|
|
3097
|
+
(cause: Cause<E>) => Channel.fromIO(queue.offer(Take.failCause(cause))),
|
|
3098
|
+
() => Channel.fromIO(queue.offer(Take.end)),
|
|
3099
|
+
);
|
|
3100
|
+
return new Stream((self.channel >>> loop).ensuring(queue.offer(Take.end).forkDaemon > future.await)).merge(
|
|
3101
|
+
Stream.execute(right.run(sink).ensuring(future.succeed(undefined))),
|
|
3102
|
+
"Both",
|
|
3103
|
+
);
|
|
3104
|
+
},
|
|
3105
|
+
);
|
|
3106
|
+
};
|
|
3107
|
+
}
|
|
3108
|
+
|
|
2859
3109
|
/**
|
|
2860
3110
|
* Throttles the chunks of this stream according to the given bandwidth parameters using the token bucket
|
|
2861
3111
|
* algorithm. Allows for burst in the processing of elements by allowing the token bucket to accumulate
|