function pooledMap(poolLimit, array, iteratorFn) {
  // Create the async iterable that is returned from this function.
  const res = new TransformStream({
    async transform(p, controller) {
      controller.enqueue(await p);
    },
  });
  // Start processing items from the iterator
  (async () => {
    const writer = res.writable.getWriter();
    const executing = [];
    try {
      for await (const item of array) {
        const p = Promise.resolve().then(() => iteratorFn(item));
        // Only write on success. If we `writer.write()` a rejected promise,
        // that will end the iteration. We don't want that yet. Instead let it
        // fail the race, taking us to the catch block where all currently
        // executing jobs are allowed to finish and all rejections among them
        // can be reported together.
        p.then((v) => writer.write(Promise.resolve(v))).catch(() => {
        });
        const e = p.then(() => executing.splice(executing.indexOf(e), 1));
        executing.push(e);
        if (executing.length >= poolLimit) {
          await Promise.race(executing);
        }
      }
      // Wait until all ongoing events have processed, then close the writer.
      await Promise.all(executing);
      writer.close();
    } catch {
      const errors = [];
      for (const result of await Promise.allSettled(executing)) {
        if (result.status == "rejected") {
          errors.push(result.reason);
        }
      }
      writer.write(
        Promise.reject(new AggregateError(errors, "Threw while mapping.")),
      ).catch(() => {
      });
    }
  })();
  return res.readable[Symbol.asyncIterator]();
}
/**
 * pooledMap transforms values from an (async) iterable into another async
 * iterable. The transforms are done concurrently, with a max concurrency
 * defined by the poolLimit.
 *
 * If an error is thrown from `iterableFn`, no new transformations will begin.
 * All currently executing transformations are allowed to finish and still
 * yielded on success. After that, the rejections among them are gathered and
 * thrown by the iterator in an `AggregateError`.
 *
 * @param poolLimit The maximum count of items being processed concurrently.
 * @param array The input array for mapping.
 * @param iteratorFn The function to call for every item of the array.
 */
pooledMap transforms values from an (async) iterable into another async
iterable. The transforms are done concurrently, with a max concurrency
defined by the poolLimit.

If an error is thrown from `iterableFn`, no new transformations will begin.
All currently executing transformations are allowed to finish and still
yielded on success. After that, the rejections among them are gathered and
thrown by the iterator in an `AggregateError`.

@param poolLimit The maximum count of items being processed concurrently.
@param array The input array for mapping.
@param iteratorFn The function to call for every item of the array.
pooledMap transforms values from an ( async ) iterable into another async iterable . The transforms are done concurrently with a max concurrency defined by the poolLimit . If an error is thrown from ` iterableFn ` no new transformations will begin . All currently executing transformations are allowed to finish and still yielded on success . After that the rejections among them are gathered and thrown by the iterator in an ` AggregateError ` . @param poolLimit The maximum count of items being processed concurrently . @param array The input array for mapping . @param iteratorFn The function to call for every item of the array .
function pooledMap(poolLimit, array, iteratorFn) {
  const res = new TransformStream({
    async transform(p, controller) {
      controller.enqueue(await p);
    },
  });
  (async () => {
    const writer = res.writable.getWriter();
    const executing = [];
    try {
      for await (const item of array) {
        const p = Promise.resolve().then(() => iteratorFn(item));
        p.then((v) => writer.write(Promise.resolve(v))).catch(() => {
        });
        const e = p.then(() => executing.splice(executing.indexOf(e), 1));
        executing.push(e);
        if (executing.length >= poolLimit) {
          await Promise.race(executing);
        }
      }
      await Promise.all(executing);
      writer.close();
    } catch {
      const errors = [];
      for (const result of await Promise.allSettled(executing)) {
        if (result.status == "rejected") {
          errors.push(result.reason);
        }
      }
      writer.write(
        Promise.reject(new AggregateError(errors, "Threw while mapping.")),
      ).catch(() => {
      });
    }
  })();
  return res.readable[Symbol.asyncIterator]();
}
function pooledMap ( poolLimit , array , iteratorFn ) { const res = new TransformStream ( { async transform ( p , controller ) { controller . enqueue ( await p ) ; } , } ) ; ( async ( ) => { const writer = res . writable . getWriter ( ) ; const executing = [ ] ; try { for await ( const item of array ) { const p = Promise . resolve ( ) . then ( ( ) => iteratorFn ( item ) ) ; p . then ( ( v ) => writer . write ( Promise . resolve ( v ) ) ) . catch ( ( ) => { } ) ; const e = p . then ( ( ) => executing . splice ( executing . indexOf ( e ) , 1 ) ) ; executing . push ( e ) ; if ( executing . length >= poolLimit ) { await Promise . race ( executing ) ; } } await Promise . all ( executing ) ; writer . close ( ) ; } catch { const errors = [ ] ; for ( const result of await Promise . allSettled ( executing ) ) { if ( result . status == "rejected" ) { errors . push ( result . reason ) ; } } writer . write ( Promise . reject ( new AggregateError ( errors , "Threw while mapping." ) ) , ) . catch ( ( ) => { } ) ; } } ) ( ) ; return res . readable [ Symbol . asyncIterator ] ( ) ; }
pooledMap transforms values from an (async) iterable into another async
 iterable.
pooledMap transforms values from an ( async ) iterable into another async iterable .
// Create the async iterable that is returned from this function. // Start processing items from the iterator // Only write on success. If we `writer.write()` a rejected promise, // that will end the iteration. We don't want that yet. Instead let it // fail the race, taking us to the catch block where all currently // executing jobs are allowed to finish and all rejections among them // can be reported together. // Wait until all ongoing events have processed, then close the writer.