Package: effect
Module: Stream
Stops a stream after the current pull when an effect completes.
When to use
Use to stop before the next pull after an external signal completes.
Details
The effect is forked, its success value is discarded, and its failure fails the stream.
Gotchas
This does not interrupt or truncate an in-progress pull. A pull may emit
multiple elements in a single chunk, in which case the entire chunk is
emitted. Use interruptWhen when the stream should be interrupted
immediately.
Example (Halting a stream after an effect completes)
import { Console, Deferred, Effect, Stream } from "effect"
const program = Effect.gen(function*() {
const halt = yield* Deferred.make<void>()
const values = yield* Stream.fromArray([1, 2, 3]).pipe(
Stream.tap((value) => value === 2 ? Deferred.succeed(halt, void 0) : Effect.void),
Stream.haltWhen(Deferred.await(halt)),
Stream.runCollect
)
yield* Console.log(values)
})
Effect.runPromise(program)
// Output:
// [1, 2]
Signature
declare const haltWhen: { <X, E2, R2>(effect: Effect.Effect<X, E2, R2>): <A, E, R>(self: Stream<A, E, R>) => Stream<A, E2 | E, R2 | R>; <A, E, R, X, E2, R2>(self: Stream<A, E, R>, effect: Effect.Effect<X, E2, R2>): Stream<A, E | E2, R | R2>; }
Since v2.0.0