export class AsyncEventQueue { private tail: Promise = Promise.resolve(); enqueue(task: () => Promise | void) { this.tail = this.tail .then(async () => { await task(); }) .catch((error) => { console.error("AsyncEventQueue task failed", error); }); } clear() { this.tail = Promise.resolve(); } } export const nextTick = () => new Promise((resolve) => { if (typeof queueMicrotask === "function") { queueMicrotask(resolve); } else { Promise.resolve().then(() => resolve()); } }); export const afterPaint = () => new Promise((resolve) => { requestAnimationFrame(() => resolve()); });