Queue.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import EventEmiter from "events";
  2. /**
  3. * Simple queue with asynchronous support
  4. *
  5. * @class Queue
  6. * @extends {EventEmiter}
  7. * @template T
  8. */
  9. class Queue<T> extends EventEmiter {
  10. queue: Array<T>;
  11. /**
  12. * Creates an instance of Queue.
  13. * @memberof Queue
  14. */
  15. constructor() {
  16. super();
  17. this.queue = [];
  18. }
  19. /**
  20. * Return length of queue
  21. *
  22. * @readonly
  23. * @type {number}
  24. * @memberof Queue
  25. */
  26. get length(): number {
  27. return this.queue.length;
  28. }
  29. /**
  30. * Add element to queue
  31. *
  32. * @param {T} el
  33. * @memberof Queue
  34. */
  35. add(el: T) {
  36. this.queue.push(el);
  37. this.emit("add");
  38. }
  39. /**
  40. * Asynchronous remove first element of queue.
  41. * Resolve only with element. There is no timeout
  42. *
  43. * @returns {Promise<T>}
  44. * @memberof Queue
  45. */
  46. remove(): Promise<T> {
  47. return new Promise((resolve, reject) => {
  48. if (this.queue.length > 0) {
  49. this.emit("remove");
  50. resolve(this.queue.shift());
  51. } else {
  52. this.once("add", () => {
  53. resolve(this.removeSync());
  54. })
  55. }
  56. });
  57. }
  58. /**
  59. * Synchronous remove
  60. *
  61. * @returns {(T | undefined)}
  62. * @memberof Queue
  63. */
  64. removeSync(): T | undefined {
  65. this.emit("remove");
  66. return this.queue.shift();
  67. }
  68. /**
  69. * Add many elements to queue
  70. *
  71. * @param {Array<T>} arr
  72. * @memberof Queue
  73. */
  74. concat(arr: Array<T>) {
  75. if (arr.length > 0) {
  76. this.queue = this.queue.concat(arr);
  77. this.emit("add");
  78. }
  79. }
  80. }
  81. export default Queue;