diff --git a/src/pages/index.svelte b/src/pages/index.svelte
index a41e1af..599a589 100644
--- a/src/pages/index.svelte
+++ b/src/pages/index.svelte
@@ -1,15 +1,29 @@
diff --git a/src/util/ratelimit.js b/src/util/ratelimit.js
new file mode 100644
index 0000000..1dfcbf2
--- /dev/null
+++ b/src/util/ratelimit.js
@@ -0,0 +1,31 @@
+const ratelimits = new Map();
+
+function callback(func) {
+ const params = ratelimits.get(func);
+ func(...params.params).then(params.result.resolve).catch(params.result.reject);
+ ratelimits.delete(func);
+}
+
+/**
+ *
+ * @param {T} func
+ * @param {...Parameters} params
+ * @template T
+ * @returns {Promise>}
+ */
+function ratelimit(func, ...params) {
+ const data = ratelimits.get(func) || {
+ timeout: setTimeout(callback, 200, func),
+ params,
+ result: {}
+ };
+ if(!data.promise) data.promise = new Promise((resolve, reject) => {
+ data.result.resolve = resolve;
+ data.result.reject = reject;
+ });
+
+ ratelimits.set(func, data);
+ return data.promise;
+}
+
+export default ratelimit;
\ No newline at end of file