export const executePromisesLimited = async <T>(iterable: Iterable<any | PromiseLike<any>>, concurrencyLimit: number): Promise<T[]> => {
  const iterator = iterable[Symbol.iterator]();

  let isDone = false;
  let promises: PromiseLike<any>[] = [];
  const result: any[] = [];

  while (!isDone) {
    const { value, done } = iterator.next();
    isDone = Boolean(done);
    promises.push(value);

    if (promises.length >= concurrencyLimit) {
      const promiseResults = await Promise.all(promises.map(promise => promise));
      result.push(...promiseResults);
      promises = [];
    }
  }
  if (promises.length) {
    const promiseResults = await Promise.all(promises.map(promise => promise));
    result.push(...promiseResults);
  }
  return result;
}
