diff options
| author | kj_sh604 | 2026-03-15 16:19:35 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-03-15 16:19:35 -0400 |
| commit | 6ec259a0e71174651bae95d4628138bf6fd68742 (patch) | |
| tree | 5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/queue.ts | |
| parent | 16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff) | |
refactor: packages/
Diffstat (limited to 'packages/excalidraw/queue.ts')
| -rw-r--r-- | packages/excalidraw/queue.ts | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/packages/excalidraw/queue.ts b/packages/excalidraw/queue.ts new file mode 100644 index 0000000..9cac2c5 --- /dev/null +++ b/packages/excalidraw/queue.ts @@ -0,0 +1,46 @@ +import type { MaybePromise } from "./utility-types"; +import type { ResolvablePromise } from "./utils"; +import { promiseTry, resolvablePromise } from "./utils"; + +type Job<T, TArgs extends unknown[]> = (...args: TArgs) => MaybePromise<T>; + +type QueueJob<T, TArgs extends unknown[]> = { + jobFactory: Job<T, TArgs>; + promise: ResolvablePromise<T>; + args: TArgs; +}; + +export class Queue { + private jobs: QueueJob<any, any[]>[] = []; + private running = false; + + private tick() { + if (this.running) { + return; + } + const job = this.jobs.shift(); + if (job) { + this.running = true; + job.promise.resolve( + promiseTry(job.jobFactory, ...job.args).finally(() => { + this.running = false; + this.tick(); + }), + ); + } else { + this.running = false; + } + } + + push<TValue, TArgs extends unknown[]>( + jobFactory: Job<TValue, TArgs>, + ...args: TArgs + ): Promise<TValue> { + const promise = resolvablePromise<TValue>(); + this.jobs.push({ jobFactory, promise, args }); + + this.tick(); + + return promise; + } +} |
