import { PriorityQueue } from './priority-queue'; export class AsyncPriorityQueue extends PriorityQueue { private _resolveUpdate: (() => void) | null = null; private _waitForUpdate: Promise | null = null; async asyncPop( minimumPriority?: number, abort?: AbortSignal ): Promise { const update = this.pop(minimumPriority); if (update) { return update; } else { if (!this._waitForUpdate) { this._waitForUpdate = new Promise(resolve => { this._resolveUpdate = resolve; }); } await Promise.race([ this._waitForUpdate, new Promise((_, reject) => { if (abort?.aborted) { reject(abort?.reason); } abort?.addEventListener('abort', () => { reject(abort.reason); }); }), ]); return this.asyncPop(minimumPriority, abort); } } override push(id: string, priority: number = 0) { super.push(id, priority); if (this._resolveUpdate) { const resolve = this._resolveUpdate; this._resolveUpdate = null; this._waitForUpdate = null; resolve(); } } }