Hyperlinkv0.8.0-beta.28

Stream

Stream.raceconsteffect/Stream.ts:4270
<AR, ER, RR>(right: Stream<AR, ER, RR>): <AL, EL, RL>(
  left: Stream<AL, EL, RL>
) => Stream<AL | AR, EL | ER, RL | RR>
<AL, EL, RL, AR, ER, RR>(
  left: Stream<AL, EL, RL>,
  right: Stream<AR, ER, RR>
): Stream<AL | AR, EL | ER, RL | RR>

Runs both streams concurrently until one stream emits its first value, then mirrors that winning stream and interrupts the other.

Details

A failure or completion from one side before the other side emits does not win the race unless both sides fail or complete before emitting. After a winner is chosen, that stream's later failures are propagated.

Example (Racing two streams)

import { Console, Effect, Schedule, Stream } from "effect"

const stream = Stream.race(
  Stream.make(0, 1, 2),
  Stream.fromSchedule(Schedule.spaced("1 second"))
)

const program = Effect.gen(function*() {
  const result = yield* Stream.runCollect(stream)
  yield* Console.log(result)
})

Effect.runPromise(program)
// Output: [ 0, 1, 2 ]
racing
Source effect/Stream.ts:427012 lines
export const race: {
  <AR, ER, RR>(
    right: Stream<AR, ER, RR>
  ): <AL, EL, RL>(left: Stream<AL, EL, RL>) => Stream<AL | AR, EL | ER, RL | RR>
  <AL, EL, RL, AR, ER, RR>(
    left: Stream<AL, EL, RL>,
    right: Stream<AR, ER, RR>
  ): Stream<AL | AR, EL | ER, RL | RR>
} = dual(2, <AL, EL, RL, AR, ER, RR>(
  left: Stream<AL, EL, RL>,
  right: Stream<AR, ER, RR>
): Stream<AL | AR, EL | ER, RL | RR> => raceAll(left, right))