Hyperlinkv0.8.0-beta.28

Effect

Effect.withExecutionPlanconsteffect/Effect.ts:4302
<Input, Provides, PlanE, PlanR>(
  plan: ExecutionPlan<{
    provides: Provides
    input: Input
    error: PlanE
    requirements: PlanR
  }>
): <A, E extends Input, R>(
  effect: Effect<A, E, R>
) => Effect<A, E | PlanE, Exclude<R, Provides> | PlanR>
<A, E extends Input, R, Provides, Input, PlanE, PlanR>(
  effect: Effect<A, E, R>,
  plan: ExecutionPlan<{
    provides: Provides
    input: Input
    error: PlanE
    requirements: PlanR
  }>
): Effect<A, E | PlanE, Exclude<R, Provides> | PlanR>

Applies an ExecutionPlan to an effect, retrying with step-provided resources until it succeeds or the plan is exhausted.

Details

Each attempt updates ExecutionPlan.CurrentMetadata (attempt and step index), and retry timing is derived per step (the first attempt uses the remaining attempts schedule; later retries apply the step schedule at least once).

Example (Retrying with an execution plan)

import { Context, Effect, ExecutionPlan, Layer } from "effect"

const Endpoint = Context.Service<{ url: string }>("Endpoint")

const fetchUrl = Effect.gen(function*() {
  const endpoint = yield* Effect.service(Endpoint)
  if (endpoint.url === "bad") {
    return yield* Effect.fail("Unavailable")
  }
  return endpoint.url
})

const plan = ExecutionPlan.make(
  { provide: Layer.succeed(Endpoint, { url: "bad" }), attempts: 2 },
  { provide: Layer.succeed(Endpoint, { url: "good" }) }
)

const program = Effect.withExecutionPlan(fetchUrl, plan)
fallback
Source effect/Effect.ts:430211 lines
export const withExecutionPlan: {
  <Input, Provides, PlanE, PlanR>(
    plan: ExecutionPlan<{ provides: Provides; input: Input; error: PlanE; requirements: PlanR }>
  ): <A, E extends Input, R>(
    effect: Effect<A, E, R>
  ) => Effect<A, E | PlanE, Exclude<R, Provides> | PlanR>
  <A, E extends Input, R, Provides, Input, PlanE, PlanR>(
    effect: Effect<A, E, R>,
    plan: ExecutionPlan<{ provides: Provides; input: Input; error: PlanE; requirements: PlanR }>
  ): Effect<A, E | PlanE, Exclude<R, Provides> | PlanR>
} = internalExecutionPlan.withExecutionPlan