@fncts/io 0.0.32 → 0.0.33
Sign up to get free protection for your applications and to get access to all the features.
- 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
|