Files
rustpad/static/js/render-queue.js
T

48 lines
1.1 KiB
JavaScript

/*
* Copyright (C) 2026 Mateusz Gruszczynski @linuxiarz.pl
* Source-Available Code / Dual-Licensed.
*
* Free for non-commercial and evaluation use under terms of BSL/GPLv3.
* Commercial or production use requires a valid paid license.
* See LICENSE file in repository root for details.
*/
export function createRenderQueue(renderNow, schedule = queueMicrotask) {
if (typeof renderNow !== "function") throw new TypeError("renderNow must be a function");
if (typeof schedule !== "function") throw new TypeError("schedule must be a function");
let rendering = false;
let pending = false;
let scheduled = false;
const schedulePendingRender = () => {
if (scheduled) return;
scheduled = true;
schedule(() => {
scheduled = false;
if (!pending) return;
pending = false;
render();
});
};
function render() {
if (rendering) {
pending = true;
schedulePendingRender();
return;
}
pending = false;
rendering = true;
try {
renderNow();
} finally {
rendering = false;
if (pending) schedulePendingRender();
}
}
return render;
}