aboutsummaryrefslogtreecommitdiff
path: root/src/utils/Queue.ts
diff options
context:
space:
mode:
authorVendicated <vendicated@riseup.net>2022-11-25 18:07:29 +0100
committerVendicated <vendicated@riseup.net>2022-11-25 18:07:29 +0100
commitb60f6cb18d1d55d367ae2f3c322d76b709eacdfe (patch)
treec2d06ff7643da8244c157c03e877b273b5b61a39 /src/utils/Queue.ts
parentbb398970ef7d60c68191f5e6e153bdba24e07207 (diff)
downloadVencord-b60f6cb18d1d55d367ae2f3c322d76b709eacdfe.tar.gz
Vencord-b60f6cb18d1d55d367ae2f3c322d76b709eacdfe.tar.bz2
Vencord-b60f6cb18d1d55d367ae2f3c322d76b709eacdfe.zip
WhoReacted: Make more reliable & don't spam api
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;
}
}