Skip to content

Instantly share code, notes, and snippets.

@pennane
Created July 11, 2024 14:50
Show Gist options
  • Select an option

  • Save pennane/0e3bd39fecffd8465c8e5dd9aa871deb to your computer and use it in GitHub Desktop.

Select an option

Save pennane/0e3bd39fecffd8465c8e5dd9aa871deb to your computer and use it in GitHub Desktop.
type Pool<T> = Map<number, Promise<readonly [number, T]>>;
async function* raceAll<T>(promises: Iterable<Promise<T>>): AsyncGenerator<T> {
const pool: Pool<T> = new Map();
let key = 0;
for (const p of promises) {
const _key = key;
pool.set(
_key,
p.then(value => [_key, value] as const)
);
key++;
}
while (pool.size > 0) {
const [key, result] = await Promise.race(pool.values());
yield result;
pool.delete(key);
}
}
async function* raceAllSettled<T>(
promises: Iterable<Promise<T>>
): AsyncGenerator<PromiseSettledResult<T>> {
const pool: Pool<PromiseSettledResult<T>> = new Map();
let key = 0;
for (const p of promises) {
const _key = key;
pool.set(
_key,
p
.then(value => [_key, { status: 'fulfilled', value }] as const)
.catch(reason => [_key, { status: 'rejected', reason }] as const)
);
key++;
}
while (pool.size > 0) {
const [key, result] = await Promise.race(pool.values());
yield result;
pool.delete(key);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment