{
  "version": 3,
  "sources": ["../src/main.ts"],
  "sourcesContent": ["import {newFlatomise} from '@alwatr/flatomise';\nimport {packageTracer} from '@alwatr/package-tracer';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\n/**\n * A queue that executes async tasks in order like mutex and semaphore methodology\n *\n * @example\n * ```ts\n * const queue = new AsyncQueue();\n *\n * function longTask() {\n *   queue.push('longTaskId', async () => {\n *     // ...\n *   });\n * }\n * ```\n */\nexport class AsyncQueue {\n  /**\n   * A record of task IDs and their corresponding last queued task promises.\n   */\n  private queue__: DictionaryOpt<Promise<unknown>> = {};\n\n  /**\n   * Push a async task to the queue.\n   *\n   * @param taskId task id\n   * @param task async task\n   * @returns A promise that resolves when the task is done.\n   *\n   * @example\n   * ```typescript\n   * const queue = new AsyncQueue();\n   *\n   * function longTask() {\n   *  queue.push('longTaskId', async () => {\n   *   // ...\n   * });\n   * ```\n   */\n  async push<T>(taskId: string, task: () => Promise<T>): Promise<T> {\n    const flatomise = newFlatomise<T>();\n\n    const previousTaskPromise = this.queue__[taskId];\n    this.queue__[taskId] = flatomise.promise;\n\n    try {\n      await previousTaskPromise;\n    }\n    catch (_e) {\n      // ignore\n    }\n\n    setTimeout(() => {\n      task()\n        .then(flatomise.resolve, flatomise.reject)\n        .then(() => {\n          if (this.queue__[taskId] === flatomise.promise) {\n            delete this.queue__[taskId];\n          }\n        });\n    }, 0);\n\n    return flatomise.promise;\n  }\n\n  /**\n   * Check if the task running in the queue.\n   *\n   * @param taskId task id\n   * @returns true if the task is running, otherwise false.\n   * @example\n   * ```typescript\n   * if (queue.isRunning('longTaskId')) {\n   *  // ...\n   * }\n   * ```\n   */\n  isRunning(taskId: string): boolean {\n    return this.queue__[taskId] !== undefined;\n  }\n\n  /**\n   * Wait for the all tasks in the queue to finish.\n   *\n   * @param taskId task id\n   * @returns A promise that resolves when all tasks are done.\n   * @example\n   * ```typescript\n   * await queue.waitForFinish('longTaskId');\n   * ```\n   */\n  waitForFinish(taskId: string): Promise<unknown> {\n    return this.queue__[taskId] ?? Promise.resolve();\n  }\n\n  /**\n   * Wait for the all tasks in the queue to finish.\n   * @returns A promise that resolves when all tasks are done.\n   * @example\n   * ```typescript\n   * await queue.waitForAllFinish();\n   * ```\n   */\n  waitForAllFinish(): Promise<unknown[]> {\n    return Promise.all(Object.values(this.queue__));\n  }\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA2B;AAC3B,4BAA4B;AAE5B,aAAc,qCAAc,IAAI,uBAAkB,OAAmB;AAgB9D,IAAM,aAAN,MAAiB;AAAA,EAAjB;AAIL;AAAA;AAAA;AAAA,SAAQ,UAA2C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpD,MAAM,KAAQ,QAAgB,MAAoC;AAChE,UAAM,gBAAY,+BAAgB;AAElC,UAAM,sBAAsB,KAAK,QAAQ,MAAM;AAC/C,SAAK,QAAQ,MAAM,IAAI,UAAU;AAEjC,QAAI;AACF,YAAM;AAAA,IACR,SACO,IAAI;AAAA,IAEX;AAEA,eAAW,MAAM;AACf,WAAK,EACF,KAAK,UAAU,SAAS,UAAU,MAAM,EACxC,KAAK,MAAM;AACV,YAAI,KAAK,QAAQ,MAAM,MAAM,UAAU,SAAS;AAC9C,iBAAO,KAAK,QAAQ,MAAM;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACL,GAAG,CAAC;AAEJ,WAAO,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU,QAAyB;AACjC,WAAO,KAAK,QAAQ,MAAM,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,cAAc,QAAkC;AAC9C,WAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mBAAuC;AACrC,WAAO,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,CAAC;AAAA,EAChD;AACF;",
  "names": []
}
