/** * @since 3.16.0 * @experimental */ import type { NonEmptyReadonlyArray } from "./Array.js"; import type * as Context from "./Context.js"; import * as Effect from "./Effect.js"; import * as Layer from "./Layer.js"; import type { Pipeable } from "./Pipeable.js"; import type * as Schedule from "./Schedule.js"; /** * @since 3.16.0 * @category Symbols * @experimental */ export declare const TypeId: unique symbol; /** * @since 3.16.0 * @category Symbols * @experimental */ export type TypeId = typeof TypeId; /** * @since 3.16.0 * @category Guards * @experimental */ export declare const isExecutionPlan: (u: unknown) => u is ExecutionPlan; /** * A `ExecutionPlan` can be used with `Effect.withExecutionPlan` or `Stream.withExecutionPlan`, allowing you to provide different resources for each step of execution until the effect succeeds or the plan is exhausted. * * ```ts * import { type AiLanguageModel } from "@effect/ai" * import type { Layer } from "effect" * import { Effect, ExecutionPlan, Schedule } from "effect" * * declare const layerBad: Layer.Layer * declare const layerGood: Layer.Layer * * const ThePlan = ExecutionPlan.make( * { * // First try with the bad layer 2 times with a 3 second delay between attempts * provide: layerBad, * attempts: 2, * schedule: Schedule.spaced(3000) * }, * // Then try with the bad layer 3 times with a 1 second delay between attempts * { * provide: layerBad, * attempts: 3, * schedule: Schedule.spaced(1000) * }, * // Finally try with the good layer. * // * // If `attempts` is omitted, the plan will only attempt once, unless a schedule is provided. * { * provide: layerGood * } * ) * * declare const effect: Effect.Effect< * void, * never, * AiLanguageModel.AiLanguageModel * > * const withPlan: Effect.Effect = Effect.withExecutionPlan(effect, ThePlan) * ``` * * @since 3.16.0 * @category Models * @experimental */ export interface ExecutionPlan extends Pipeable { readonly [TypeId]: TypeId; readonly steps: NonEmptyReadonlyArray<{ readonly provide: Context.Context | Layer.Layer; readonly attempts?: number | undefined; readonly while?: ((input: Types["input"]) => Effect.Effect) | undefined; readonly schedule?: Schedule.Schedule | undefined; }>; /** * Returns an equivalent `ExecutionPlan` with the requirements satisfied, * using the current context. */ readonly withRequirements: Effect.Effect, never, Types["requirements"]>; } /** * @since 3.16.0 * @experimental */ export type TypesBase = { provides: any; input: any; error: any; requirements: any; }; /** * Create an `ExecutionPlan`, which can be used with `Effect.withExecutionPlan` or `Stream.withExecutionPlan`, allowing you to provide different resources for each step of execution until the effect succeeds or the plan is exhausted. * * ```ts * import { type AiLanguageModel } from "@effect/ai" * import type { Layer } from "effect" * import { Effect, ExecutionPlan, Schedule } from "effect" * * declare const layerBad: Layer.Layer * declare const layerGood: Layer.Layer * * const ThePlan = ExecutionPlan.make( * { * // First try with the bad layer 2 times with a 3 second delay between attempts * provide: layerBad, * attempts: 2, * schedule: Schedule.spaced(3000) * }, * // Then try with the bad layer 3 times with a 1 second delay between attempts * { * provide: layerBad, * attempts: 3, * schedule: Schedule.spaced(1000) * }, * // Finally try with the good layer. * // * // If `attempts` is omitted, the plan will only attempt once, unless a schedule is provided. * { * provide: layerGood * } * ) * * declare const effect: Effect.Effect< * void, * never, * AiLanguageModel.AiLanguageModel * > * const withPlan: Effect.Effect = Effect.withExecutionPlan(effect, ThePlan) * ``` * * @since 3.16.0 * @category Constructors * @experimental */ export declare const make: >(...steps: Steps & { [K in keyof Steps]: make.Step; }) => ExecutionPlan<{ provides: make.StepProvides; input: make.StepInput; error: (Steps[number]["provide"] extends Context.Context | Layer.Layer ? E : never) | (Steps[number]["while"] extends (input: infer _I) => Effect.Effect ? _E : never); requirements: (Steps[number]["provide"] extends Layer.Layer ? R : never) | (Steps[number]["while"] extends (input: infer _I) => Effect.Effect ? R_1 : never) | (Steps[number]["schedule"] extends Schedule.Schedule ? R_2 : never); }>; /** * @since 3.16.0 * @experimental */ export declare namespace make { /** * @since 3.16.0 * @experimental */ type Step = { readonly provide: Context.Context | Context.Context | Layer.Layer.Any; readonly attempts?: number | undefined; readonly while?: ((input: any) => boolean | Effect.Effect) | undefined; readonly schedule?: Schedule.Schedule | undefined; }; /** * @since 3.16.1 * @experimental */ type StepProvides, Out = unknown> = Steps extends readonly [infer Step, ...infer Rest] ? StepProvides | Layer.Layer; } ? P : unknown))> : Out; /** * @since 3.16.1 * @experimental */ type PlanProvides, Out = unknown> = Plans extends readonly [infer Plan, ...infer Rest] ? PlanProvides ? T["provides"] : unknown)> : Out; /** * @since 3.16.0 * @experimental */ type StepInput, Out = unknown> = Steps extends readonly [infer Step, ...infer Rest] ? StepInput infer _; } ? I : unknown) & (Step extends { readonly schedule: Schedule.Schedule; } ? I : unknown))> : Out; /** * @since 3.16.0 * @experimental */ type PlanInput, Out = unknown> = Plans extends readonly [infer Plan, ...infer Rest] ? PlanInput ? T["input"] : unknown)> : Out; } /** * @since 3.16.0 * @category Combining * @experimental */ export declare const merge: >>(...plans: Plans) => ExecutionPlan<{ provides: make.PlanProvides; input: make.PlanInput; error: Plans[number] extends ExecutionPlan ? T["error"] : never; requirements: Plans[number] extends ExecutionPlan ? T["requirements"] : never; }>; //# sourceMappingURL=ExecutionPlan.d.ts.map