{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import { _getAbortReason, _isAbortSignal } from \"../_abort/index.ts\";\nimport { getAbortSignal } from \"../getAbortSignal/index.ts\";\n\nexport type TGetAsyncPoolOptions<TSettle extends boolean = boolean> = {\n  concurrency?: number;\n  settle?: TSettle;\n  signal?: AbortSignal | null;\n};\n\nexport type TGetAsyncPoolResult<T, TSettle extends boolean> = TSettle extends true\n  ? PromiseSettledResult<T>[]\n  : T[];\n\nexport type TGetAsyncPoolArgs = Parameters<typeof getAsyncPool>;\n\nexport type TGetAsyncPoolReturn = ReturnType<typeof getAsyncPool>;\n\n/**\n * Maps an array asynchronously with a concurrency limit while preserving order.\n * Supports cancellation and an all-settled result mode.\n * @template T,U,TSettle\n * @param {T[]} arr Source array\n * @param {(value: T, index: number, array: T[], signal: AbortSignal) => Promise<U>|U} callback Mapper\n * @param {number|TGetAsyncPoolOptions<TSettle>} [concurrencyOrOptions=4] Concurrency or pool options\n * @returns {Promise<TGetAsyncPoolResult<U,TSettle>>} Ordered results\n * @throws {TypeError} getAsyncPool: arguments are invalid\n * @example\n * await getAsyncPool(ids, (id) => loadItem(id), 3);\n * @example\n * // Upload files with cancellation and collect every outcome\n * const controller = new AbortController();\n * const uploadedFiles = await getAsyncPool(files, uploadFile, {\n *   concurrency: 2,\n *   settle: true,\n *   signal: controller.signal,\n * });\n */\nexport const getAsyncPool = async <T, U, TSettle extends boolean = false>(\n  arr: T[],\n  callback: (value: T, index: number, array: T[], signal: AbortSignal) => Promise<U> | U,\n  concurrencyOrOptions: number | TGetAsyncPoolOptions<TSettle> = 4\n): Promise<TGetAsyncPoolResult<U, TSettle>> => {\n  if (!Array.isArray(arr)) {\n    throw new TypeError(\"getAsyncPool: arr must be an array\");\n  }\n  if (typeof callback !== \"function\") {\n    throw new TypeError(\"getAsyncPool: callback must be a function\");\n  }\n  if (\n    typeof concurrencyOrOptions !== \"number\"\n    && (!concurrencyOrOptions\n      || typeof concurrencyOrOptions !== \"object\"\n      || Array.isArray(concurrencyOrOptions))\n  ) {\n    throw new TypeError(\"getAsyncPool: options must be a number or plain object\");\n  }\n\n  const options = typeof concurrencyOrOptions === \"number\"\n    ? { concurrency: concurrencyOrOptions, settle: false, signal: null }\n    : concurrencyOrOptions;\n  const {\n    concurrency = 4,\n    settle = false,\n    signal = null,\n  } = options;\n  if (!Number.isInteger(concurrency) || concurrency <= 0) {\n    throw new TypeError(\"getAsyncPool: concurrency must be a positive integer\");\n  }\n  if (typeof settle !== \"boolean\") {\n    throw new TypeError(\"getAsyncPool: settle must be a boolean\");\n  }\n  if (signal !== null && !_isAbortSignal(signal)) {\n    throw new TypeError(\"getAsyncPool: signal must be an AbortSignal or null\");\n  }\n\n  const controls = getAbortSignal({ signals: [ signal ] });\n  if (controls.signal.aborted) {\n    throw _getAbortReason(controls.signal);\n  }\n\n  const result = new Array<U | PromiseSettledResult<U>>(arr.length);\n  let nextIndex = 0;\n  const worker = async (): Promise<void> => {\n    while (nextIndex < arr.length) {\n      if (controls.signal.aborted) {\n        throw _getAbortReason(controls.signal);\n      }\n      const index = nextIndex;\n      nextIndex += 1;\n      try {\n        const value = await callback(arr[index], index, arr, controls.signal);\n        result[index] = settle ? { status: \"fulfilled\", value } : value;\n      } catch (error) {\n        if (controls.signal.aborted) {\n          throw _getAbortReason(controls.signal);\n        }\n        if (settle) {\n          result[index] = { reason: error, status: \"rejected\" };\n        } else {\n          controls.abort(error);\n          throw error;\n        }\n      }\n    }\n  };\n  const workers = Array.from(\n    { length: Math.min(concurrency, arr.length) },\n    () => worker()\n  );\n  let removeAbortListener = (): void => {};\n  const aborted = new Promise<never>((resolve, reject) => {\n    const onAbort = (): void => reject(_getAbortReason(controls.signal));\n    controls.signal.addEventListener(\"abort\", onAbort, { once: true });\n    removeAbortListener = (): void => controls.signal.removeEventListener(\"abort\", onAbort);\n  });\n\n  try {\n    await Promise.race([ Promise.all(workers), aborted ]);\n    return result as TGetAsyncPoolResult<U, TSettle>;\n  } finally {\n    removeAbortListener();\n    controls.dispose();\n  }\n};\n"],"names":["getAsyncPool","async","arr","callback","concurrencyOrOptions","Array","isArray","TypeError","options","concurrency","settle","signal","Number","isInteger","_isAbortSignal","controls","getAbortSignal","signals","aborted","_getAbortReason","result","length","nextIndex","worker","index","value","status","error","reason","abort","workers","from","Math","min","removeAbortListener","Promise","resolve","reject","onAbort","addEventListener","once","removeEventListener","race","all","dispose"],"mappings":"wHAqCO,MAAMA,aAAeC,MAC1BC,IACAC,SACAC,qBAA+D,KAE/D,IAAKC,MAAMC,QAAQJ,KACjB,MAAM,IAAIK,UAAU,sCAEtB,UAAWJ,WAAa,WACtB,MAAM,IAAII,UAAU,6CAEtB,UACSH,uBAAyB,YAC3BA,6BACOA,uBAAyB,UAChCC,MAAMC,QAAQF,uBAEnB,MAAM,IAAIG,UAAU,0DAGtB,MAAMC,eAAiBJ,uBAAyB,SAC5C,CAAEK,YAAaL,qBAAsBM,OAAQ,MAAOC,OAAQ,MAC5DP,qBACJ,MAAMK,YACJA,YAAc,EAACC,OACfA,OAAS,MAAKC,OACdA,OAAS,MACPH,QACJ,IAAKI,OAAOC,UAAUJ,cAAgBA,aAAe,EACnD,MAAM,IAAIF,UAAU,wDAEtB,UAAWG,SAAW,UACpB,MAAM,IAAIH,UAAU,0CAEtB,GAAII,SAAW,OAASG,eAAeH,QACrC,MAAM,IAAIJ,UAAU,uDAGtB,MAAMQ,SAAWC,eAAe,CAAEC,QAAS,CAAEN,UAC7C,GAAII,SAASJ,OAAOO,QAClB,MAAMC,gBAAgBJ,SAASJ,QAGjC,MAAMS,OAAS,IAAIf,MAAmCH,IAAImB,QAC1D,IAAIC,UAAY,EAChB,MAAMC,OAAStB,UACb,MAAOqB,UAAYpB,IAAImB,OAAQ,CAC7B,GAAIN,SAASJ,OAAOO,QAClB,MAAMC,gBAAgBJ,SAASJ,QAEjC,MAAMa,MAAQF,UACdA,WAAa,EACb,IACE,MAAMG,YAActB,SAASD,IAAIsB,OAAQA,MAAOtB,IAAKa,SAASJ,QAC9DS,OAAOI,OAASd,OAAS,CAAEgB,OAAQ,YAAaD,aAAUA,KAC5D,CAAE,MAAOE,OACP,GAAIZ,SAASJ,OAAOO,QAClB,MAAMC,gBAAgBJ,SAASJ,QAEjC,GAAID,OACFU,OAAOI,OAAS,CAAEI,OAAQD,MAAOD,OAAQ,gBACpC,CACLX,SAASc,MAAMF,OACf,MAAMA,KACR,CACF,CACF,GAEF,MAAMG,QAAUzB,MAAM0B,KACpB,CAAEV,OAAQW,KAAKC,IAAIxB,YAAaP,IAAImB,SACpC,IAAME,UAER,IAAIW,oBAAsB,OAC1B,MAAMhB,QAAU,IAAIiB,QAAe,CAACC,QAASC,UAC3C,MAAMC,QAAU,IAAYD,OAAOlB,gBAAgBJ,SAASJ,SAC5DI,SAASJ,OAAO4B,iBAAiB,QAASD,QAAS,CAAEE,KAAM,OAC3DN,oBAAsB,IAAYnB,SAASJ,OAAO8B,oBAAoB,QAASH,WAGjF,UACQH,QAAQO,KAAK,CAAEP,QAAQQ,IAAIb,SAAUZ,UAC3C,OAAOE,MACT,CAAC,QACCc,sBACAnB,SAAS6B,SACX"}