/** * Returns an effect that races this effect with the specified effect, calling * the specified finisher as soon as one result or the other has been computed. * * @tsplus static effect/core/io/Effect.Aspects raceWith * @tsplus pipeable effect/core/io/Effect raceWith */ export function raceWith( that: Effect, leftDone: (exit: Exit, fiber: Fiber) => Effect, rightDone: (exit: Exit, fiber: Fiber) => Effect ) { return (self: Effect): Effect => self.raceFibersWith( that, (winner, loser) => winner.await.flatMap((exit) => { switch (exit._tag) { case "Success": { return winner.inheritAll.flatMap(() => leftDone(exit, loser)) } case "Failure": { return leftDone(exit, loser) } } }), (winner, loser) => winner.await.flatMap((exit) => { switch (exit._tag) { case "Success": { return winner.inheritAll.flatMap(() => rightDone(exit, loser)) } case "Failure": { return rightDone(exit, loser) } } }) ) }