/** Run `task` for every item with at most `limit` in flight; each item is isolated. */
export async function forEachLimited<T>(items: T[], limit: number, task: (item: T) => Promise<void>): Promise<void> {
  const queue = [...items];
  async function worker() {
    for (let item = queue.shift(); item !== undefined; item = queue.shift()) await task(item);
  }
  await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
}
