import { createQueue } from './queue.js'; export interface TaskCallback { (value: T): Promise; } export interface Task { (callback: TaskCallback): R; } export const generatorify = (task: Task): AsyncIterable => { const queue = createQueue>(); Promise.resolve( task(async (value) => { await queue.push({ value, done: false }).promise; }), ).then(async (value) => queue.done({ value, done: true })); return { [Symbol.asyncIterator]() { return { next() { return queue.pull().promise; }, }; }, }; };