mirror of
https://github.com/captbaritone/webamp.git
synced 2026-07-24 10:37:16 +00:00
51 lines
1 KiB
JavaScript
51 lines
1 KiB
JavaScript
export default class LoadQueue {
|
|
constructor(size) {
|
|
this._free = size;
|
|
this._queue = new Array();
|
|
}
|
|
|
|
_remove(priority, cb) {
|
|
const priorityQueue = this._queue[priority];
|
|
if (priorityQueue == null) {
|
|
return;
|
|
}
|
|
priorityQueue.delete(cb);
|
|
if (priorityQueue.size === 0) {
|
|
this._queue[priority] = undefined;
|
|
}
|
|
}
|
|
|
|
enqueue(cb, priority) {
|
|
if (this._queue[priority] == null) {
|
|
this._queue[priority] = new Set();
|
|
}
|
|
this._queue[priority].add(cb);
|
|
|
|
this._run();
|
|
|
|
return () => {
|
|
this._remove(priority, cb);
|
|
};
|
|
}
|
|
_run() {
|
|
if (this._free === 0) {
|
|
return;
|
|
}
|
|
const priority = this._queue.findIndex(value => Boolean(value));
|
|
if (priority === -1) {
|
|
// The queue is empty
|
|
return;
|
|
}
|
|
this._free--;
|
|
const set = this._queue[priority];
|
|
const values = set.values();
|
|
const cb = values.next().value;
|
|
|
|
cb().finally(() => {
|
|
this._free++;
|
|
this._run();
|
|
});
|
|
|
|
this._remove(priority, cb);
|
|
}
|
|
}
|