上限付きで複数の函数を非同期に実行し、順番を維持して結果を返す関数
上限付きで複数の函数を非同期に実行し、順番を維持して結果を返す関数
Iterable<Arg>→Iterable<Promise<{ success: true; value: T; } | { success: false; value: E; }>>
順番は維持する
idには、どの処理レーンを使っているのかの番号が入る
実装したいこと
テストを書く
code:mod.ts
export type Result<T, E> = { success: true; value: T; } | { success: false; value: E; };
export function* pool<Arg extends unknown[], T, E = unknown>(
threshold: number,
args: Iterable<Arg>,
): Generator<Promise<Result<T, E>>, void, unknown> {
let running = 0;
const waitings = [] as (() => number)[];
const waitForReady = async () => {
running++;
if (running <= threshold) return running - 1;
return await new Promise<number>(
(resolve) => waitings.push(resolve)
);
};
for (const arg of args) {
yield (async () => {
const id = await waitForReady();
try {
return {
success: true,
value: await func(...arg, id),
};
} catch(e: unknown) {
return {
success: false,
value: e as E,
};
} finally {
waitings.shift()?.(id);
}
})();
}
// 実行しきれない可能性はある?
}