EdgeAIG's picture
download
raw
3.59 kB
import { constant, constTrue, dual, identity } from "../Function.js";
import * as Option from "../Option.js";
import * as Pull from "../Pull.js";
import * as Schedule from "../Schedule.js";
import { internalCall } from "../Utils.js";
import * as core from "./core.js";
import * as effect from "./effect.js";
/** @internal */
export const repeatOrElse = /*#__PURE__*/dual(3, (self, schedule, orElse) => effect.flatMap(Schedule.toStepWithMetadata(schedule), step => {
let meta = Schedule.CurrentMetadata.defaultValue();
return effect.catch_(effect.forever(effect.tap(effect.flatMap(effect.suspend(() => effect.provideService(self, Schedule.CurrentMetadata, meta)), step), meta_ => effect.sync(() => {
meta = meta_;
})), {
disableYield: true
}), error => core.isDone(error) ? effect.succeed(error.value) : orElse(error, meta.attempt === 0 ? Option.none() : Option.some(meta)));
}));
/** @internal */
export const retryOrElse = /*#__PURE__*/dual(3, (self, policy, orElse) => effect.flatMap(Schedule.toStepWithMetadata(policy), step => {
let meta = Schedule.CurrentMetadata.defaultValue();
let lastError;
const loop = effect.catch_(effect.suspend(() => effect.provideService(self, Schedule.CurrentMetadata, meta)), error => {
lastError = error;
return effect.flatMap(step(error), meta_ => {
meta = meta_;
return loop;
});
});
return Pull.catchDone(loop, out => internalCall(() => orElse(lastError, out)));
}));
/** @internal */
export const repeat = /*#__PURE__*/dual(2, (self, options) => {
const schedule = typeof options === "function" ? options(identity) : Schedule.isSchedule(options) ? options : buildFromOptions(options);
return repeatOrElse(self, schedule, effect.fail);
});
/** @internal */
export const retry = /*#__PURE__*/dual(2, (self, options) => {
const schedule = typeof options === "function" ? options(identity) : Schedule.isSchedule(options) ? options : buildFromOptions(options);
return retryOrElse(self, schedule, effect.fail);
});
/** @internal */
export const scheduleFrom = /*#__PURE__*/dual(3, (self, initial, schedule) => effect.flatMap(Schedule.toStepWithMetadata(schedule), step => {
let meta = Schedule.CurrentMetadata.defaultValue();
const selfWithMeta = effect.suspend(() => effect.provideService(self, Schedule.CurrentMetadata, meta));
return effect.catch_(effect.flatMap(step(initial), meta_ => {
meta = meta_;
const body = constant(effect.flatMap(selfWithMeta, step));
return effect.whileLoop({
while: constTrue,
body,
step(meta_) {
meta = meta_;
}
});
}), error => core.isDone(error) ? effect.succeed(error.value) : effect.fail(error));
}));
const passthroughForever = /*#__PURE__*/Schedule.passthrough(Schedule.forever);
/** @internal */
export const buildFromOptions = options => {
let schedule = options.schedule ? Schedule.passthrough(options.schedule) : passthroughForever;
if (options.while) {
schedule = Schedule.while(schedule, ({
input
}) => {
const applied = options.while(input);
return core.isEffect(applied) ? applied : effect.succeed(applied);
});
}
if (options.until) {
schedule = Schedule.while(schedule, ({
input
}) => {
const applied = options.until(input);
return core.isEffect(applied) ? effect.map(applied, b => !b) : effect.succeed(!applied);
});
}
if (options.times !== undefined) {
schedule = Schedule.while(schedule, ({
attempt
}) => effect.succeed(attempt <= options.times));
}
return schedule;
};
//# sourceMappingURL=schedule.js.map

Xet Storage Details

Size:
3.59 kB
·
Xet hash:
c2eb95469437a9a1e564a924264535e7b04ddcdb23e1b51aae469aaa39ad7a89

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.