Skip to content

Commit

Permalink
return Exit values from Fiber.awaitAll (#3147)
Browse files Browse the repository at this point in the history
Co-authored-by: Tim <hello@timsmart.co>
  • Loading branch information
patroza and tim-smart committed Aug 14, 2024
1 parent 8da85e5 commit 228d02b
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 4 deletions.
5 changes: 5 additions & 0 deletions .changeset/dry-badgers-boil.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"effect": minor
---

improve: type Fiber.awaitAll as Exit<A, E>[].
16 changes: 16 additions & 0 deletions packages/effect/dtslint/Fiber.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Fiber } from "effect"

declare const string: Fiber.Fiber<string>
declare const number: Fiber.Fiber<number>
declare const array: Array<Fiber.Fiber<string> | Fiber.Fiber<number>>

// awaitAll

// $ExpectType Effect<[Exit<string, never>, Exit<number, never>], never, never>
Fiber.awaitAll([string, number])

// $ExpectType Effect<(Exit<string, never> | Exit<number, never>)[], never, never>
Fiber.awaitAll(new Set([string, number]))

// $ExpectType Effect<(Exit<string, never> | Exit<number, never>)[], never, never>
Fiber.awaitAll(array)
9 changes: 8 additions & 1 deletion packages/effect/src/Fiber.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,14 @@ export {
* @since 2.0.0
* @category destructors
*/
export const awaitAll: (fibers: Iterable<Fiber<any, any>>) => Effect.Effect<void> = fiberRuntime.fiberAwaitAll
export const awaitAll: <const T extends Iterable<Fiber<any, any>>>(
fibers: T
) => Effect.Effect<
[T] extends [ReadonlyArray<infer U>]
? number extends T["length"] ? Array<U extends Fiber<infer A, infer E> ? Exit.Exit<A, E> : never>
: { -readonly [K in keyof T]: T[K] extends Fiber<infer A, infer E> ? Exit.Exit<A, E> : never }
: Array<T extends Iterable<infer U> ? U extends Fiber<infer A, infer E> ? Exit.Exit<A, E> : never : never>
> = fiberRuntime.fiberAwaitAll

/**
* Retrieves the immediate children of the fiber.
Expand Down
10 changes: 8 additions & 2 deletions packages/effect/src/internal/fiberRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3288,8 +3288,14 @@ export const currentSupervisor: FiberRef.FiberRef<Supervisor.Supervisor<any>> =
// circular with Fiber

/* @internal */
export const fiberAwaitAll = (fibers: Iterable<Fiber.Fiber<any, any>>): Effect.Effect<void> =>
core.asVoid(internalFiber._await(fiberAll(fibers)))
export const fiberAwaitAll = <const T extends Iterable<Fiber.Fiber<any, any>>>(
fibers: T
): Effect.Effect<
[T] extends [ReadonlyArray<infer U>]
? number extends T["length"] ? Array<U extends Fiber.Fiber<infer A, infer E> ? Exit.Exit<A, E> : never>
: { -readonly [K in keyof T]: T[K] extends Fiber.Fiber<infer A, infer E> ? Exit.Exit<A, E> : never }
: Array<T extends Iterable<infer U> ? U extends Fiber.Fiber<infer A, infer E> ? Exit.Exit<A, E> : never : never>
> => forEach(fibers, internalFiber._await) as any

/** @internal */
export const fiberAll = <A, E>(fibers: Iterable<Fiber.Fiber<A, E>>): Fiber.Fiber<Array<A>, E> => ({
Expand Down
4 changes: 3 additions & 1 deletion packages/effect/test/Fiber.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,9 @@ describe("Fiber", () => {
it.effect("awaitAll - stack safety", () =>
Effect.gen(function*($) {
const result = yield* $(Fiber.awaitAll(fibers))
assert.isUndefined(result)
assert.isArray(result)
assert(result.length === fibers.length)
result.forEach((_) => assert.isTrue(Exit.isSuccess(_) && _.value === undefined))
}), 10000)
it.effect("joinAll - stack safety", () =>
Effect.gen(function*($) {
Expand Down

0 comments on commit 228d02b

Please sign in to comment.