42 lines
873 B
JavaScript
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]);
|