Files
reacord/packages/reacord/library.new/async-queue.ts
2022-07-24 13:39:55 -05:00

26 lines
559 B
TypeScript

export type AsyncCallback = () => unknown
export class AsyncQueue {
private callbacks: AsyncCallback[] = []
private promise: Promise<void> | undefined
async add(callback: AsyncCallback) {
this.callbacks.push(callback)
if (this.promise) return this.promise
this.promise = this.runQueue()
try {
await this.promise
} finally {
this.promise = undefined
}
}
private async runQueue() {
let callback: AsyncCallback | undefined
while ((callback = this.callbacks.shift())) {
await callback()
}
}
}