mix-async-generator
Version:
``` npm i mix-async-generator ```
131 lines • 19.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const MixAsyncGenerator_1 = require("../src/MixAsyncGenerator");
const util_extends_promise_1 = require("@bfchain/util-extends-promise");
const ava_1 = __importDefault(require("ava"));
async function* LoopAg(from = 1, to = 10, throwAt = to + 1, hooks) {
var _a, _b;
for (let i = from; i <= to; i++) {
(_a = hooks === null || hooks === void 0 ? void 0 : hooks.before) === null || _a === void 0 ? void 0 : _a.call(hooks, i);
await util_extends_promise_1.sleep(10);
if (i === throwAt) {
throw i;
}
yield i;
(_b = hooks === null || hooks === void 0 ? void 0 : hooks.after) === null || _b === void 0 ? void 0 : _b.call(hooks, i);
}
}
const reduceTotal = async (ag) => {
let total = 0;
for await (const item of ag) {
total += item;
}
return total;
};
ava_1.default("free loop", async (t) => {
const m = new MixAsyncGenerator_1.MixAsyncGenerator();
const ag1 = m.join(LoopAg(1, 5));
m.join(LoopAg(6, 7));
m.join(LoopAg(8, 15));
t.is(await reduceTotal(m.toAsyncIterator()), await reduceTotal(LoopAg(1, 15)));
t.false(m.remove(ag1));
t.deepEqual(await m.next(), { step: { done: true, value: undefined } });
});
ava_1.default("bench loop", async (t) => {
const m = new MixAsyncGenerator_1.MixAsyncGenerator();
m.join(LoopAg(1, 3), { bench: true });
m.join(LoopAg(4, 5), { bench: true });
m.join(LoopAg(6, 9), { bench: true });
t.is(await reduceTotal(m.toAsyncIterator()), await reduceTotal(LoopAg(1, 9)));
});
ava_1.default("throw", async (t) => {
const m = new MixAsyncGenerator_1.MixAsyncGenerator();
const ag = m.join(LoopAg(1, 3, 2));
const err1 = new Promise((resolve) => m.onError.attachOnce(resolve));
t.deepEqual(await m.next(), {
from: ag,
step: { done: false, value: 1 },
});
t.deepEqual(await m.next(), {
step: { done: true, value: undefined },
});
t.deepEqual(await err1, { from: ag, reason: 2 });
});
ava_1.default("jumpGun", async (t) => {
var _a, _b, _c, _d, _e;
const m = new MixAsyncGenerator_1.MixAsyncGenerator();
let count = 0;
let current = 0;
const ag = m.join(LoopAg(1, 4, 0, {
// logTime && console.log(`wait 10ms from ${i}`);
before(v) {
current = v;
count += 1;
},
}), {
name: "jump-tester",
jumpGun: 2,
});
await util_extends_promise_1.sleep(100);
t.is(ag.inQueueSteps, ag.jumpGun); // @FIXME: 这里不一定……
t.is(ag.inQueueSteps, count);
t.is((_a = ag.currentStep) === null || _a === void 0 ? void 0 : _a.value, 2);
count = 0;
{
const time_start = Date.now();
await m.next(); // 1
await m.next(); // 2
const time_end = Date.now();
const time_diff = time_end - time_start;
t.true(time_diff <= 1, `jumpGun's time ${time_start}~${time_end} ${time_diff}ms should less then 1ms`);
}
t.is(current, 3);
{
const t3 = m.next(); // 3
const t4 = m.next(); // 4
t.is((_b = ag.currentStep) === null || _b === void 0 ? void 0 : _b.value, 2);
await t3;
t.is((_c = ag.currentStep) === null || _c === void 0 ? void 0 : _c.value, 3);
await t4;
t.is((_d = ag.currentStep) === null || _d === void 0 ? void 0 : _d.value, 4);
const ts = Date.now();
await m.next(); // done
const te = Date.now();
const td = te - ts;
t.true(td <= 1, `The Done taks ${ts}~${te} ${td}ms, should less then 1ms`);
t.true(m.isDone, `${ag.name} shoule be finished`);
t.is((_e = ag.currentStep) === null || _e === void 0 ? void 0 : _e.done, true);
}
t.is(current, 4);
});
ava_1.default("lazy jumpGun", async (t) => {
const m = new MixAsyncGenerator_1.MixAsyncGenerator();
const ag1 = m.join(LoopAg(1, 2), {
name: "jump-tester",
jumpGun: 1,
});
const ag2 = m.join(LoopAg(11, 13), {
name: "jump-tester",
bench: true,
jumpGun: 2,
});
const ag3 = m.join(LoopAg(3, 4), {
name: "jump-tester",
jumpGun: 1,
});
await util_extends_promise_1.sleep(100);
t.is(ag1.inQueueSteps, ag1.jumpGun);
t.is(ag2.inQueueSteps, 0);
t.is(ag3.inQueueSteps, ag1.jumpGun);
t.is((await m.next()).step.value, 1);
t.is((await m.next()).step.value, 3);
t.is((await m.next()).step.value, 2);
t.is((await m.next()).step.value, 4);
t.is((await m.next()).step.value, 11);
t.is((await m.next()).step.value, 12);
t.is((await m.next()).step.value, 13);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWl4QXN5bmNHZW5lcmF0b3IudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvTWl4QXN5bmNHZW5lcmF0b3IudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdFQUE2RDtBQUM3RCx3RUFBc0Q7QUFDdEQsOENBQXVCO0FBQ3ZCLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTSxDQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUNSLEVBQUUsR0FBRyxFQUFFLEVBQ1AsT0FBTyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQ2hCLEtBR0M7O0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQixNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLCtDQUFiLEtBQUssRUFBVyxDQUFDLENBQUMsQ0FBQztRQUNuQixNQUFNLDRCQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLEtBQUssT0FBTyxFQUFFO1lBQ2pCLE1BQU0sQ0FBQyxDQUFDO1NBQ1Q7UUFDRCxNQUFNLENBQUMsQ0FBQztRQUNSLE1BQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssK0NBQVosS0FBSyxFQUFVLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0FBQ0gsQ0FBQztBQUNELE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxFQUEwQixFQUFFLEVBQUU7SUFDdkQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxLQUFLLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRSxFQUFFO1FBQzNCLEtBQUssSUFBSSxJQUFJLENBQUM7S0FDZjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBR0YsYUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDNUIsTUFBTSxD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LFlBQVksRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVyQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1peEFzeW5jR2VuZXJhdG9yIH0gZnJvbSBcIi4uL3NyYy9NaXhBc3luY0dlbmVyYXRvclwiO1xyXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gXCJAYmZjaGFpbi91dGlsLWV4dGVuZHMtcHJvbWlzZVwiO1xyXG5pbXBvcnQgdGVzdCBmcm9tIFwiYXZhXCI7XHJcbmFzeW5jIGZ1bmN0aW9uKiBMb29wQWcoXHJcbiAgZnJvbSA9IDEsXHJcbiAgdG8gPSAxMCxcclxuICB0aHJvd0F0ID0gdG8gKyAxLFxyXG4gIGhvb2tzPzoge1xyXG4gICAgYmVmb3JlPzogKHZhbHVlOiBudW1iZXIpID0+IHVua25vd247XHJcbiAgICBhZnRlcj86ICh2YWx1ZTogbnVtYmVyKSA9PiB1bmtub3duO1xyXG4gIH1cclxuKSB7XHJcbiAgZm9yIChsZXQgaSA9IGZyb207IGkgPD0gdG87IGkrKykge1xyXG4gICAgaG9va3M/LmJlZm9yZT8uKGkpO1xyXG4gICAgYXdhaXQgc2xlZXAoMTApO1xyXG4gICAgaWYgKGkgPT09IHRocm93QXQpIHtcclxuICAgICAgdGhyb3cgaTtcclxuICAgIH1cclxuICAgIHlpZWxkIGk7XHJcbiAgICBob29rcz8uYWZ0ZXI/LihpKTtcclxuICB9XHJcbn1cclxuY29uc3QgcmVkdWNlVG90YWwgPSBhc3luYyAoYWc6IEFzeW5jR2VuZXJhdG9yPG51bWJlcj4pID0+IHtcclxuICBsZXQgdG90YWwgPSAwO1xyXG4gIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBhZykge1xyXG4gICAgdG90YWwgKz0gaXRlbTtcclxuICB9XHJcbiAgcmV0dXJuIHRvdGFsO1xyXG59O1xyXG50eXBlIEFHID0gTWl4QXN5bmNHZW5lcmF0b3IuQUc8bnVtYmVyPjtcclxuXHJcbnRlc3QoXCJmcmVlIGxvb3BcIiwgYXN5bmMgKHQpID0+IHtcclxuICBjb25zdCBtID0gbmV3IE1peEFzeW5jR2VuZXJhdG9yPEFHPigpO1xyXG4gIGNvbnN0IGFnMSA9IG0uam9pbihMb29wQWcoMSwgNSkpO1xyXG4gIG0uam9pbihMb29wQWcoNiwgNykpO1xyXG4gIG0uam9pbihMb29wQWcoOCwgMTUpKTtcclxuXHJcbiAgdC5pcyhcclxuICAgIGF3YWl0IHJlZHVjZVRvdGFsKG0udG9Bc3luY0l0ZXJhdG9yKCkpLFxyXG4gICAgYXdhaXQgcmVkdWNlVG90YWwoTG9vcEFnKDEsIDE1KSlcclxuICApO1xyXG5cclxuICB0LmZhbHNlKG0ucmVtb3ZlKGFnMSkpO1xyXG4gIHQuZGVlcEVxdWFsKGF3YWl0IG0ubmV4dCgpLCB7IHN0ZXA6IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9IH0pO1xyXG59KTtcclxuXHJcbnRlc3QoXCJiZW5jaCBsb29wXCIsIGFzeW5jICh0KSA9PiB7XHJcbiAgY29uc3QgbSA9IG5ldyBNaXhBc3luY0dlbmVyYXRvcjxBRz4oKTtcclxuICBtLmpvaW4oTG9vcEFnKDEsIDMpLCB7IGJlbmNoOiB0cnVlIH0pO1xyXG4gIG0uam9pbihMb29wQWcoNCwgNSksIHsgYmVuY2g6IHRydWUgfSk7XHJcbiAgbS5qb2luKExvb3BBZyg2LCA5KSwgeyBiZW5jaDogdHJ1ZSB9KTtcclxuICB0LmlzKGF3YWl0IHJlZHVjZVRvdGFsKG0udG9Bc3luY0l0ZXJhdG9yKCkpLCBhd2FpdCByZWR1Y2VUb3RhbChMb29wQWcoMSwgOSkpKTtcclxufSk7XHJcblxyXG50ZXN0KFwidGhyb3dcIiwgYXN5bmMgKHQpID0+IHtcclxuICBjb25zdCBtID0gbmV3IE1peEFzeW5jR2VuZXJhdG9yPEFHPigpO1xyXG4gIGNvbnN0IGFnID0gbS5qb2luKExvb3BBZygxLCAzLCAyKSk7XHJcbiAgY29uc3QgZXJyMSA9IG5ldyBQcm9taXNlPE1peEFzeW5jR2VuZXJhdG9yLkVycm9yPEFHPj4oKHJlc29sdmUpID0+XHJcbiAgICBtLm9uRXJyb3IuYXR0YWNoT25jZShyZXNvbHZlKVxyXG4gICk7XHJcbiAgdC5kZWVwRXF1YWwoYXdhaXQgbS5uZXh0KCksIHtcclxuICAgIGZyb206IGFnLFxyXG4gICAgc3RlcDogeyBkb25lOiBmYWxzZSwgdmFsdWU6IDEgfSxcclxuICB9KTtcclxuICB0LmRlZXBFcXVhbChhd2FpdCBtLm5leHQoKSwge1xyXG4gICAgc3RlcDogeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0sXHJcbiAgfSk7XHJcbiAgdC5kZWVwRXF1YWwoYXdhaXQgZXJyMSwgeyBmcm9tOiBhZywgcmVhc29uOiAyIH0pO1xyXG59KTtcclxuXHJcbnRlc3QoXCJqdW1wR3VuXCIsIGFzeW5jICh0KSA9PiB7XHJcbiAgY29uc3QgbSA9IG5ldyBNaXhBc3luY0dlbmVyYXRvcjxBRz4oKTtcclxuICBsZXQgY291bnQgPSAwO1xyXG4gIGxldCBjdXJyZW50ID0gMDtcclxuICBjb25zdCBhZyA9IG0uam9pbihcclxuICAgIExvb3BBZygxLCA0LCAwLCB7XHJcbiAgICAgIC8vIGxvZ1RpbWUgJiYgY29uc29sZS5sb2coYHdhaXQgMTBtcyBmcm9tICR7aX1gKTtcclxuICAgICAgYmVmb3JlKHYpIHtcclxuICAgICAgICBjdXJyZW50ID0gdjtcclxuICAgICAgICBjb3VudCArPSAxO1xyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6IFwianVtcC10ZXN0ZXJcIixcclxuICAgICAganVtcEd1bjogMixcclxuICAgIH1cclxuICApO1xyXG4gIGF3YWl0IHNsZWVwKDEwMCk7XHJcbiAgdC5pcyhhZy5pblF1ZXVlU3RlcHMsIGFnLmp1bXBHdW4pOyAvLyBARklYTUU6IOi/memHjOS4jeS4gOWumuKApuKAplxyXG4gIHQuaXMoYWcuaW5RdWV1ZVN0ZXBzLCBjb3VudCk7XHJcbiAgdC5pcyhhZy5jdXJyZW50U3RlcD8udmFsdWUsIDIpO1xyXG5cclxuICBjb3VudCA9IDA7XHJcbiAge1xyXG4gICAgY29uc3QgdGltZV9zdGFydCA9IERhdGUubm93KCk7XHJcbiAgICBhd2FpdCBtLm5leHQoKTsgLy8gMVxyXG4gICAgYXdhaXQgbS5uZXh0KCk7IC8vIDJcclxuICAgIGNvbnN0IHRpbWVfZW5kID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IHRpbWVfZGlmZiA9IHRpbWVfZW5kIC0gdGltZV9zdGFydDtcclxuICAgIHQudHJ1ZShcclxuICAgICAgdGltZV9kaWZmIDw9IDEsXHJcbiAgICAgIGBqdW1wR3VuJ3MgdGltZSAke3RpbWVfc3RhcnR9fiR7dGltZV9lbmR9ICR7dGltZV9kaWZmfW1zIHNob3VsZCBsZXNzIHRoZW4gMW1zYFxyXG4gICAgKTtcclxuICB9XHJcbiAgdC5pcyhjdXJyZW50LCAzKTtcclxuICB7XHJcbiAgICBjb25zdCB0MyA9IG0ubmV4dCgpOyAvLyAzXHJcbiAgICBjb25zdCB0NCA9IG0ubmV4dCgpOyAvLyA0XHJcbiAgICB0LmlzKGFnLmN1cnJlbnRTdGVwPy52YWx1ZSwgMik7XHJcbiAgICBhd2FpdCB0MztcclxuICAgIHQuaXMoYWcuY3VycmVudFN0ZXA/LnZhbHVlLCAzKTtcclxuICAgIGF3YWl0IHQ0O1xyXG4gICAgdC5pcyhhZy5jdXJyZW50U3RlcD8udmFsdWUsIDQpO1xyXG5cclxuICAgIGNvbnN0IHRzID0gRGF0ZS5ub3coKTtcclxuICAgIGF3YWl0IG0ubmV4dCgpOyAvLyBkb25lXHJcbiAgICBjb25zdCB0ZSA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCB0ZCA9IHRlIC0gdHM7XHJcbiAgICB0LnRydWUodGQgPD0gMSwgYFRoZSBEb25lIHRha3MgJHt0c31+JHt0ZX0gJHt0ZH1tcywgc2hvdWxkIGxlc3MgdGhlbiAxbXNgKTtcclxuICAgIHQudHJ1ZShtLmlzRG9uZSwgYCR7YWcubmFtZX0gc2hvdWxlIGJlIGZpbmlzaGVkYCk7XHJcbiAgICB0LmlzKGFnLmN1cnJlbnRTdGVwPy5kb25lLCB0cnVlKTtcclxuICB9XHJcbiAgdC5pcyhjdXJyZW50LCA0KTtcclxufSk7XHJcbnRlc3QoXCJsYXp5IGp1bXBHdW5cIiwgYXN5bmMgKHQpID0+IHtcclxuICBjb25zdCBtID0gbmV3IE1peEFzeW5jR2VuZXJhdG9yPEFHPigpO1xyXG5cclxuICBjb25zdCBhZzEgPSBtLmpvaW4oTG9vcEFnKDEsIDIpLCB7XHJcbiAgICBuYW1lOiBcImp1bXAtdGVzdGVyXCIsXHJcbiAgICBqdW1wR3VuOiAxLFxyXG4gIH0pO1xyXG4gIGNvbnN0IGFnMiA9IG0uam9pbihMb29wQWcoMTEsIDEzKSwge1xyXG4gICAgbmFtZTogXCJqdW1wLXRlc3RlclwiLFxyXG4gICAgYmVuY2g6IHRydWUsXHJcbiAgICBqdW1wR3VuOiAyLFxyXG4gIH0pO1xyXG4gIGNvbnN0IGFnMyA9IG0uam9pbihMb29wQWcoMywgNCksIHtcclxuICAgIG5hbWU6IFwianVtcC10ZXN0ZXJcIixcclxuICAgIGp1bXBHdW46IDEsXHJcbiAgfSk7XHJcbiAgYXdhaXQgc2xlZXAoMTAwKTtcclxuICB0LmlzKGFnMS5pblF1ZXVlU3RlcHMsIGFnMS5qdW1wR3VuKTtcclxuICB0LmlzKGFnMi5pblF1ZXVlU3RlcHMsIDApO1xyXG4gIHQuaXMoYWczLmluUXVldWVTdGVwcywgYWcxLmp1bXBHdW4pO1xyXG5cclxuICB0LmlzKChhd2FpdCBtLm5leHQoKSkuc3RlcC52YWx1ZSwgMSk7XHJcbiAgdC5pcygoYXdhaXQgbS5uZXh0KCkpLnN0ZXAudmFsdWUsIDMpO1xyXG4gIHQuaXMoKGF3YWl0IG0ubmV4dCgpKS5zdGVwLnZhbHVlLCAyKTtcclxuICB0LmlzKChhd2FpdCBtLm5leHQoKSkuc3RlcC52YWx1ZSwgNCk7XHJcblxyXG4gIHQuaXMoKGF3YWl0IG0ubmV4dCgpKS5zdGVwLnZhbHVlLCAxMSk7XHJcbiAgdC5pcygoYXdhaXQgbS5uZXh0KCkpLnN0ZXAudmFsdWUsIDEyKTtcclxuICB0LmlzKChhd2FpdCBtLm5leHQoKSkuc3RlcC52YWx1ZSwgMTMpO1xyXG59KTtcclxuIl19