MCPcopy Create free account
hub / github.com/Effect-TS/effect / raceAll

Function raceAll

packages/effect/src/internal/effect.ts:1476–1531  ·  view source on GitHub ↗
(
  all: Iterable<Eff>,
  options?: {
    readonly onWinner?: (options: {
      readonly fiber: Fiber.Fiber<any, any>
      readonly index: number
      readonly parentFiber: Fiber.Fiber<any, any>
    }) => void
  }
)

Source from the content-addressed store, hash-verified

1474
1475/** @internal */
1476export const raceAll = <Eff extends Effect.Effect<any, any, any>>(
1477 all: Iterable<Eff>,
1478 options?: {
1479 readonly onWinner?: (options: {
1480 readonly fiber: Fiber.Fiber<any, any>
1481 readonly index: number
1482 readonly parentFiber: Fiber.Fiber<any, any>
1483 }) => void
1484 }
1485): Effect.Effect<
1486 Effect.Success<Eff>,
1487 Effect.Error<Eff>,
1488 Effect.Services<Eff>
1489> =>
1490 withFiber((parent) =>
1491 callback((resume) => {
1492 const effects = Arr.fromIterable(all)
1493 const len = effects.length
1494 let doneCount = 0
1495 let done = false
1496 const fibers = new Set<Fiber.Fiber<any, any>>()
1497 const failures: Array<Cause.Reason<any>> = []
1498 const onExit = (exit: Exit.Exit<any, any>, fiber: Fiber.Fiber<any, any>, i: number) => {
1499 doneCount++
1500 if (exit._tag === "Failure") {
1501 failures.push(...exit.cause.reasons)
1502 if (doneCount >= len) {
1503 resume(failCause(causeFromReasons(failures)))
1504 }
1505 return
1506 }
1507 const isWinner = !done
1508 done = true
1509 resume(
1510 fibers.size === 0
1511 ? exit
1512 : flatMap(uninterruptible(fiberInterruptAll(fibers)), () => exit)
1513 )
1514 if (isWinner && options?.onWinner) {
1515 options.onWinner({ fiber, index: i, parentFiber: parent })
1516 }
1517 }
1518
1519 for (let i = 0; i < len; i++) {
1520 const fiber = forkUnsafe(parent, effects[i], true, true, false)
1521 fibers.add(fiber)
1522 fiber.addObserver((exit) => {
1523 fibers.delete(fiber)
1524 onExit(exit, fiber, i)
1525 })
1526 if (done) break
1527 }
1528
1529 return fiberInterruptAll(fibers)
1530 })
1531 )
1532
1533/** @internal */

Callers 1

effect.tsFile · 0.70

Calls 5

fiberInterruptAllFunction · 0.85
addObserverMethod · 0.80
callbackFunction · 0.70
onExitFunction · 0.70
addMethod · 0.65

Tested by

no test coverage detected