Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class AsyncQueue<T> {
- waitingEnqueue = new Array<() => void>()
- waitingDequeue = new Array<() => void>()
- enqueuePointer = 0
- dequeuePointer = 0
- queue = Array<T>()
- maxSize = 1
- async enqueue(x: T) {
- if ((this.queue.length + 1) > this.maxSize || this.waitingDequeue.length > 0) {
- this.dequeuePointer += 1
- await new Promise(r => this.waitingDequeue.unshift(r))
- this.waitingDequeue.pop()
- }
- this.queue.unshift(x)
- if (this.enqueuePointer > 0) {
- this.waitingEnqueue[this.enqueuePointer-1]()
- this.enqueuePointer -= 1
- }
- }
- async dequeue() {
- if (this.queue.length == 0 || this.waitingEnqueue.length > 0) {
- this.enqueuePointer += 1
- await new Promise(r => this.waitingEnqueue.unshift(r))
- this.waitingEnqueue.pop()
- }
- if (this.dequeuePointer > 0) {
- this.waitingDequeue[this.dequeuePointer - 1]()
- this.dequeuePointer -= 1
- }
- return this.queue.pop()!
- }
- }
Add Comment
Please, Sign In to add comment