Skip to content

Commit

Permalink
fix example & simplify return type
Browse files Browse the repository at this point in the history
  • Loading branch information
tim-smart committed Aug 29, 2024
1 parent 83d63cb commit 817f169
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 63 deletions.
48 changes: 18 additions & 30 deletions packages/effect/src/Effect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3546,17 +3546,17 @@ export const bind: {
* results in a Do notation pipeline.
*
* @example
* import { Effect, pipe } from "effect"
* import { Effect, Either, pipe } from "effect"
*
* const result = pipe(
* Effect.Do,
* Effect.bind("x", () => Effect.succeed(2)),
* Effect.bindAll(({ x }) => ({
* a: Effect.succeed(x),
* b: Effect.fail('ops'),
* }), { concurrency: 2, mode: 'either' })
* b: Effect.fail("oops"),
* }), { concurrency: 2, mode: "either" })
* )
* assert.deepStrictEqual(Effect.runSync(result), { x: 2, a: Either.right(2), b: Either.left('ops') })
* assert.deepStrictEqual(Effect.runSync(result), { x: 2, a: Either.right(2), b: Either.left("oops") })
*
* @category do notation
* @since 3.7.0
Expand All @@ -3576,18 +3576,13 @@ export const bindAll: {
options?: undefined | O
): <E1, R1>(
self: Effect<A, E1, R1>
) => Effect<
{
[K in keyof X | keyof A]: K extends keyof A ? A[K] :
K extends keyof Effect.Success<
All.ReturnObject<X, false, All.ExtractMode<O>>
> ? Effect.Success<All.ReturnObject<X, false, All.ExtractMode<O>>>[K] :
never
},
| E1
| Effect.Error<All.ReturnObject<X, false, All.ExtractMode<O>>>,
R1 | Effect.Context<X[keyof X]>
>
) => [All.ReturnObject<X, false, All.ExtractMode<O>>] extends [Effect<infer Success, infer Error, infer Context>]
? Effect<
{ [K in keyof A | keyof Success]: K extends keyof A ? A[K] : K extends keyof Success ? Success[K] : never },
E1 | Error,
R1 | Context
>
: never
<
A extends object,
X extends Record<string, Effect<any, any, any>>,
Expand All @@ -3608,20 +3603,13 @@ export const bindAll: {
readonly mode?: "default" | "validate" | "either" | undefined
readonly concurrentFinalizers?: boolean | undefined
}
): Effect<
{
[K in keyof X | keyof A]: K extends keyof A ? A[K] :
K extends keyof Effect.Success<
All.ReturnObject<X, false, All.ExtractMode<O>>
> ? Effect.Success<
All.ReturnObject<X, false, All.ExtractMode<O>>
>[K] :
never
},
| E1
| Effect.Error<All.ReturnObject<X, false, All.ExtractMode<O>>>,
R1 | Effect.Context<X[keyof X]>
>
): [All.ReturnObject<X, false, All.ExtractMode<O>>] extends [Effect<infer Success, infer Error, infer Context>]
? Effect<
{ [K in keyof A | keyof Success]: K extends keyof A ? A[K] : K extends keyof Success ? Success[K] : never },
E1 | Error,
R1 | Context
>
: never
} = circular.bindAll

/**
Expand Down
59 changes: 27 additions & 32 deletions packages/effect/src/internal/effect/circular.ts
Original file line number Diff line number Diff line change
Expand Up @@ -720,22 +720,21 @@ export const bindAll: {
>(
f: (a: A) => [Extract<keyof X, keyof A>] extends [never] ? X : `Duplicate keys`,
options?: undefined | O
): <E1, R1>(self: Effect.Effect<A, E1, R1>) => Effect.Effect<
{
[K in keyof X | keyof A]: K extends keyof A ? A[K] :
K extends keyof Effect.Effect.Success<
Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>
> ? Effect.Effect.Success<
Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>
>[K] :
never
},
| E1
| Effect.Effect.Error<
Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>
>,
R1 | Effect.Effect.Context<X[keyof X]>
>
): <E1, R1>(
self: Effect.Effect<A, E1, R1>
) => [Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>] extends
[Effect.Effect<infer Success, infer Error, infer Context>] ? Effect.Effect<
{
[K in keyof A | keyof Success]: K extends keyof A ? A[K]
: K extends keyof Success ? Success[K]
: never
},
| E1
| Error,
R1 | Context
>
: never

<
A extends object,
X extends Record<string, Effect.Effect<any, any, any>>,
Expand All @@ -756,22 +755,18 @@ export const bindAll: {
readonly mode?: "default" | "validate" | "either" | undefined
readonly concurrentFinalizers?: boolean | undefined
}
): Effect.Effect<
{
[K in keyof X | keyof A]: K extends keyof A ? A[K] :
K extends keyof Effect.Effect.Success<
Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>
> ? Effect.Effect.Success<
Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>
>[K] :
never
},
| E1
| Effect.Effect.Error<
Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>
>,
R1 | Effect.Effect.Context<X[keyof X]>
>
): [Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>] extends
[Effect.Effect<infer Success, infer Error, infer Context>] ? Effect.Effect<
{
[K in keyof A | keyof Success]: K extends keyof A ? A[K]
: K extends keyof Success ? Success[K]
: never
},
| E1
| Error,
R1 | Context
>
: never
} = dual((args) => core.isEffect(args[0]), <
A extends object,
X extends Record<string, Effect.Effect<any, any, any>>,
Expand Down
1 change: 0 additions & 1 deletion packages/effect/test/Effect/do-notation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ describe("do notation", () => {
)

expectLeft(getTest({ mode: "default" }), 2)

expectRight(getTest({ mode: "either" }), {
a: Either.left(2),
b: Either.right("ops"),
Expand Down

0 comments on commit 817f169

Please sign in to comment.