pi-lens
Version:
Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo
46 lines (43 loc) • 1.28 kB
JavaScript
import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
// dist/clients/cooperative-budget.js
function createDeadline(budgetMs) {
const boundedBudget = Math.max(0, budgetMs);
let startedAt = performance.now();
return {
expired: () => performance.now() - startedAt >= boundedBudget,
reset: () => {
startedAt = performance.now();
}
};
}
async function yieldIfOverBudget(deadline) {
if (!deadline.expired())
return false;
await new Promise((resolve) => setImmediate(resolve));
deadline.reset();
return true;
}
async function forEachCooperatively(items, fn, options) {
const deadline = createDeadline(options.budgetMs);
const assertContinuing = () => {
if (options.shouldContinue?.() === false) {
throw new Error(options.abortMessage ?? "cooperative work superseded");
}
};
let index = 0;
for (const item of items) {
assertContinuing();
const result = fn(item, index++);
if (result !== void 0 && typeof result.then === "function") {
await result;
}
if (deadline.expired() && await yieldIfOverBudget(deadline)) {
assertContinuing();
}
}
}
export {
createDeadline,
yieldIfOverBudget,
forEachCooperatively
};