| 821 | |
| 822 | /** @internal */ |
| 823 | export const fiberJoinAll = <A extends Iterable<Fiber.Fiber<any, any>>>(self: A): Effect.Effect< |
| 824 | Arr.ReadonlyArray.With<A, A extends Iterable<Fiber.Fiber<infer _A, infer _E>> ? _A : never>, |
| 825 | A extends Iterable<Fiber.Fiber<infer _A, infer _E>> ? _E : never |
| 826 | > => |
| 827 | callback((resume) => { |
| 828 | const fibers = Array.from(self) |
| 829 | if (fibers.length === 0) return resume(succeed(Arr.empty() as any)) |
| 830 | const out = new Array<any>(fibers.length) as Arr.NonEmptyArray<any> |
| 831 | const cancels = Arr.empty<() => void>() |
| 832 | let done = 0 |
| 833 | let failed = false |
| 834 | for (let i = 0; i < fibers.length; i++) { |
| 835 | if (failed) break |
| 836 | cancels.push(fibers[i].addObserver((exit) => { |
| 837 | done++ |
| 838 | if (exit._tag === "Failure") { |
| 839 | failed = true |
| 840 | cancels.forEach((cancel) => cancel()) |
| 841 | return resume(exit as any) |
| 842 | } |
| 843 | out[i] = exit.value |
| 844 | if (done === fibers.length) { |
| 845 | resume(succeed(out)) |
| 846 | } |
| 847 | })) |
| 848 | } |
| 849 | return sync(() => { |
| 850 | failed = true |
| 851 | cancels.forEach((cancel) => cancel()) |
| 852 | }) |
| 853 | }) |
| 854 | |
| 855 | /** @internal */ |
| 856 | export const fiberInterrupt = <A, E>( |