export interface Pending { done?: false | undefined; // 'need_context' is a hack so `yield*` works value: "need_context" | "pending"; } export interface Ready { done: true; value: T; } // NoInfer prevents TS from inferring T as `"need_context" | "pending"` export type Poll = NoInfer> | NoInfer; export interface Future { [Symbol.iterator](): Future; next(...[value]: [] | [Context]): Poll; throw(e?: unknown): Poll; } export interface Context { wake(): void; [Symbol.toStringTag]: "Futures.Context"; }