2014-11-23 16:15:39 +11:00

42 lines
873 B
JavaScript

function *gen(start, step) {
step = step || 1;
while (true) {
yield start;
start += step;
}
}
function *limit(g, stop) {
while (true) {
var info = g.next();
if (info.done) {
return;
} else if (info.value < stop) {
yield info.value;
} else {
return;
}
}
}
// should generate a lot of plausible values
var g = gen(10, 2);
assert.deepEqual(g.next(), { value: 10, done: false });
assert.deepEqual(g.next(), { value: 12, done: false });
assert.deepEqual(g.next(), { value: 14, done: false });
assert.deepEqual(g.next(), { value: 16, done: false });
var sum = 10 + 12 + 14 + 16;
for (var n = 0; n < 1000; ++n) {
var info = g.next();
sum += info.value;
assert.strictEqual(info.done, false);
}
assert.strictEqual(sum, 1017052);
// should allow limiting
genHelpers.check(limit(gen(10, 3), 20), [10, 13, 16, 19]);