UNPKG

1.42 kBJavaScriptView Raw
1/**
2 * A simple queue with optional priority.
3 */
4export class Queue {
5 /**
6 * Queue data.
7 */
8 _queue_ = [];
9
10 /**
11 * Queue constructor.
12 */
13 constructor() {}
14
15 /**
16 * Get size of queue.
17 *
18 * @returns Total callbacks in queue.
19 */
20 get size() {
21 return this._queue_.length;
22 }
23
24 /**
25 * Clear queue.
26 */
27 clear() {
28 this._queue_ = [];
29 }
30
31 /**
32 * Enqueue callback.
33 *
34 * @param handler Callback function.
35 * @param priority Callback priority.
36 */
37 push(handler, priority = 0) {
38 const queue = this._queue_;
39 let index = 0;
40 for (let i = queue.length; i--;) {
41 if (queue[i].priority < priority) {
42 index = i + 1;
43 break;
44 }
45 }
46 queue.splice(index, 0, {
47 priority,
48 handler
49 });
50 }
51
52 /**
53 * Pop callback off queue.
54 *
55 * @returns Callback function or null if empty.
56 */
57 pop() {
58 const entry = this._queue_.pop();
59 return entry ? entry.handler : null;
60 }
61
62 /**
63 * Shift callback off queue.
64 *
65 * @returns Callback function or null if empty.
66 */
67 shift() {
68 const entry = this._queue_.shift();
69 return entry ? entry.handler : null;
70 }
71
72 /**
73 * Run queue.
74 */
75 async run() {
76 for (;;) {
77 const entry = this.pop();
78 if (!entry) {
79 break;
80 }
81
82 // eslint-disable-next-line no-await-in-loop
83 await entry();
84 }
85 }
86}
87//# sourceMappingURL=queue.mjs.map
\No newline at end of file