aboutsummaryrefslogtreecommitdiff
path: root/src/utils/Queue.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/Queue.ts')
-rw-r--r--src/utils/Queue.ts45
1 files changed, 42 insertions, 3 deletions
diff --git a/src/utils/Queue.ts b/src/utils/Queue.ts
index 46959a0..6153d40 100644
--- a/src/utils/Queue.ts
+++ b/src/utils/Queue.ts
@@ -19,9 +19,48 @@
import { Promisable } from "type-fest";
export class Queue {
- private promise: Promise<any> = Promise.resolve();
+ /**
+ * @param maxSize The maximum amount of functions that can be queued at once.
+ * If the queue is full, the oldest function will be removed.
+ */
+ constructor(public maxSize = Infinity) { }
- add<T>(func: (lastValue: unknown) => Promisable<T>): Promise<T> {
- return (this.promise = this.promise.then(func));
+ queue = [] as Array<() => Promisable<unknown>>;
+
+ private promise?: Promise<any>;
+
+ private next() {
+ const func = this.queue.shift();
+ if (func)
+ this.promise = Promise.resolve()
+ .then(func)
+ .then(() => this.next());
+ else
+ this.promise = undefined;
+ }
+
+ private run() {
+ if (!this.promise)
+ this.next();
+ }
+
+ push<T>(func: () => Promisable<T>) {
+ if (this.size >= this.maxSize)
+ this.queue.shift();
+
+ this.queue.push(func);
+ this.run();
+ }
+
+ unshift<T>(func: () => Promisable<T>) {
+ if (this.size >= this.maxSize)
+ this.queue.pop();
+
+ this.queue.unshift(func);
+ this.run();
+ }
+
+ get size() {
+ return this.queue.length;
}
}