import { isThenable } from '../../lib/is-thenable' export type TaskGroup = { done: () => Promise run: any>( op: Operation ) => ReturnType } export const createTaskGroup = (): TaskGroup => { let taskCompletionPromise: Promise let resolvePromise: () => void let count = 0 return { done: () => taskCompletionPromise, run: (op) => { const returnValue = op() if (isThenable(returnValue)) { if (++count === 1) { taskCompletionPromise = new Promise((res) => (resolvePromise = res)) } returnValue.finally(() => --count === 0 && resolvePromise()) } return returnValue }, } }