paste files, images
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user