cbon
Version:
Common Bracket Object Notation
56 lines (55 loc) • 1.59 kB
JavaScript
import { next_micro_tick } from "./utils";
export class RecursiveCtx {
get(_, result) {
return result;
}
call(fn, ...args) {
return () => fn(this, ...args);
}
}
const _AsyncRecursiveCtx = RecursiveCtx;
export { _AsyncRecursiveCtx as AsyncRecursiveCtx };
export function doRecursive(fn, ...args) {
var _a, _b;
const ctx = new RecursiveCtx;
const gens = [fn(ctx, ...args)];
let v = undefined;
while (gens.length > 0) {
const gen = gens[gens.length - 1];
const now = gen.next(v);
v = undefined;
if (now.done) {
gens.pop();
v = now.value;
}
else {
const ngen = (_b = (_a = now).value) === null || _b === void 0 ? void 0 : _b.call(_a);
if (ngen != null) {
gens.push(ngen);
}
}
}
return v;
}
export async function doRecursiveAsync(fn, ...args) {
var _a, _b;
const ctx = new RecursiveCtx;
const gens = [fn(ctx, ...args)];
let v = undefined;
do {
const gen = gens[gens.length - 1];
const now = await gen.next(v);
v = undefined;
if (now.done) {
gens.pop();
v = now.value;
}
else {
const ngen = (_b = (_a = now).value) === null || _b === void 0 ? void 0 : _b.call(_a);
if (ngen != null) {
gens.push(ngen);
}
}
} while (gens.length > 0 ? (await next_micro_tick(), true) : false);
return v;
}