| import * as Api from "../ExecutionPlan.js"; | |
| import { dual } from "../Function.js"; | |
| import * as Result from "../Result.js"; | |
| import * as Schedule from "../Schedule.js"; | |
| import * as effect from "./effect.js"; | |
| import * as internalLayer from "./layer.js"; | |
| import * as internalSchedule from "./schedule.js"; | |
| /** @internal */ | |
| export const withExecutionPlan = /*#__PURE__*/dual(2, (self, plan) => effect.suspend(() => { | |
| let i = 0; | |
| let meta = { | |
| attempt: 0, | |
| stepIndex: 0 | |
| }; | |
| const provideMeta = effect.provideServiceEffect(Api.CurrentMetadata, effect.sync(() => { | |
| meta = { | |
| attempt: meta.attempt + 1, | |
| stepIndex: i | |
| }; | |
| return meta; | |
| })); | |
| let result; | |
| return effect.flatMap(effect.whileLoop({ | |
| while: () => i < plan.steps.length && (result === undefined || Result.isFailure(result)), | |
| body() { | |
| const step = plan.steps[i]; | |
| let nextEffect = provideMeta(internalLayer.provide(self, step.provide)); | |
| if (result) { | |
| let attempted = false; | |
| const wrapped = nextEffect; | |
| // ensure the schedule is applied at least once | |
| nextEffect = effect.suspend(() => { | |
| if (attempted) return wrapped; | |
| attempted = true; | |
| return effect.fromResult(result); | |
| }); | |
| nextEffect = internalSchedule.retry(nextEffect, scheduleFromStep(step, false)); | |
| } else { | |
| const schedule = scheduleFromStep(step, true); | |
| nextEffect = schedule ? internalSchedule.retry(nextEffect, schedule) : nextEffect; | |
| } | |
| return effect.result(nextEffect); | |
| }, | |
| step(result_) { | |
| result = result_; | |
| i++; | |
| } | |
| }), () => effect.fromResult(result)); | |
| })); | |
| /** @internal */ | |
| export const scheduleFromStep = (step, first) => { | |
| if (!first) { | |
| return internalSchedule.buildFromOptions({ | |
| schedule: step.schedule ? step.schedule : step.attempts ? undefined : scheduleOnce, | |
| times: step.attempts, | |
| while: step.while | |
| }); | |
| } else if (step.attempts === 1 || !(step.schedule || step.attempts)) { | |
| return undefined; | |
| } | |
| return internalSchedule.buildFromOptions({ | |
| schedule: step.schedule, | |
| while: step.while, | |
| times: step.attempts ? step.attempts - 1 : undefined | |
| }); | |
| }; | |
| const scheduleOnce = /*#__PURE__*/Schedule.recurs(1); | |
| //# sourceMappingURL=executionPlan.js.map |
Xet Storage Details
- Size:
- 2.3 kB
- Xet hash:
- f106d1b2517b36ca3f21d05d99fad55ac7d00742f20d57d093aec10eddc81ea1
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.