TaskDefine function* naturals() (infinite 1,2,3,...) and function* take(iter, n) that yields first n items. Log [...take(naturals(), 5)].join(','). Then count squares with function* squares() that yields n*n for each natural, log [...take(squares(), 4)].join(',').
Lazy infinite sequences
175 XP10 min
Theory
Generators don't have to end
A generator only computes the next value when you ask. An infinite while (true) loop with yield is perfectly fine β the runtime never gets stuck because each yield pauses execution.
function* naturals() {
let n = 1;
while (true) yield n++;
}You can NOT for-of an infinite generator without a break. You CAN take a finite prefix:
function* take(iter, n) {
let i = 0;
for (const x of iter) {
if (i++ >= n) return;
yield x;
}
}
console.log([...take(naturals(), 5)]); // [1, 2, 3, 4, 5]Why lazy matters
- Memory β you never materialize the whole sequence.
- Composition β
take(filter(map(naturals(), x => x*x), x => x > 50), 3)walks naturals exactly until 3 results are found, no more. - This is how reactive frontend frameworks model streams of events under the hood.
The pattern in production
Pagination, event streams, message queues, anything-with-backpressure. Lesson C6-08 shows the async version that powers paginated APIs.
π
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β card required, cancel anytime.
Sign up β free trial βFirst 10 lessons in each track are free. No card needed for those.