(
all: Iterable<Eff>,
options?: {
readonly onWinner?: (options: {
readonly fiber: Fiber.Fiber<any, any>
readonly index: number
readonly parentFiber: Fiber.Fiber<any, any>
}) => void
}
)
| 1474 | |
| 1475 | /** @internal */ |
| 1476 | export 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 */ |
no test coverage detected