{"version":3,"file":"filter.cjs","names":[],"sources":["../../src/promise/filter.ts"],"sourcesContent":["/**\n * Iterates over an array and returns a promise that resolves with an array of elements\n * that pass the predicate test. Supports concurrency limiting.\n *\n * @template T - The type of the array elements\n * @param array - The array to iterate over\n * @param predicate - The function to test each element (can be async or return a promise)\n * @param concurrency - The maximum number of concurrent operations (default: Infinity)\n * @returns Returns a promise that resolves with an array of elements that passed the test\n *\n * @example\n * const numbers = [1, 2, 3, 4, 5];\n * const evens = await filter(numbers, (n) => n % 2 === 0);\n *\n * @example\n * const users = await filter(userIds, (id) => checkUserActive(id), 2); // Max 2 concurrent checks\n */\nexport function filter<T>(\n  array: T[],\n  predicate: (value: T, index: number) => Promise<boolean> | boolean,\n  concurrency = Infinity,\n): Promise<T[]> {\n  if (!Array.isArray(array) || array.length === 0) {\n    return Promise.resolve([]);\n  }\n\n  return new Promise((resolve, reject) => {\n    const results: T[] = [];\n    let completed = 0;\n    let inProgress = 0;\n    let index = 0;\n    let hasError = false;\n\n    function execute() {\n      while (index < array.length && inProgress < concurrency && !hasError) {\n        const currentIndex = index++;\n        inProgress++;\n\n        Promise.resolve(predicate(array[currentIndex], currentIndex)).then(\n          (passed) => {\n            if (!hasError) {\n              if (passed) {\n                results.push(array[currentIndex]);\n              }\n              completed++;\n              inProgress--;\n\n              if (completed === array.length) {\n                resolve(results);\n              } else {\n                execute();\n              }\n            }\n          },\n          (error) => {\n            if (!hasError) {\n              hasError = true;\n              reject(error);\n            }\n          },\n        );\n      }\n    }\n\n    execute();\n  });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiBA,SAAgB,OACd,OACA,WACA,cAAc,UACA;CACd,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAC5C,OAAO,QAAQ,QAAQ,CAAC,CAAC;CAG3B,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,UAAe,CAAC;EACtB,IAAI,YAAY;EAChB,IAAI,aAAa;EACjB,IAAI,QAAQ;EACZ,IAAI,WAAW;EAEf,SAAS,UAAU;GACjB,OAAO,QAAQ,MAAM,UAAU,aAAa,eAAe,CAAC,UAAU;IACpE,MAAM,eAAe;IACrB;IAEA,QAAQ,QAAQ,UAAU,MAAM,eAAe,YAAY,CAAC,CAAC,CAAC,MAC3D,WAAW;KACV,IAAI,CAAC,UAAU;MACb,IAAI,QACF,QAAQ,KAAK,MAAM,aAAa;MAElC;MACA;MAEA,IAAI,cAAc,MAAM,QACtB,QAAQ,OAAO;WAEf,QAAQ;KAEZ;IACF,IACC,UAAU;KACT,IAAI,CAAC,UAAU;MACb,WAAW;MACX,OAAO,KAAK;KACd;IACF,CACF;GACF;EACF;EAEA,QAAQ;CACV,CAAC;AACH"}