Generator functions use yield to produce a sequence one value at a time.

generator A generator function uses `function*` and `yield` to create an iterable sequence.

Generator Functions

limit
generator.ts
Replay: real traced execution (multi-file project)
function* countUp(limit: number): Generator<number> {
    for (let current: number = 1; current <= limit; current++) {
        yield current;
    }
}

const limit: number = 3;
const parts: string[] = [];

for (const value of countUp(limit)) {
    parts.push(String(value));
}

console.log(parts.join(","));
function* countUp(limit: number): Generator<number> {
    for (let current: number = 1; current <= limit; current++) {
        yield current;
    }
}

const limit: number = 2;
const parts: string[] = [];

for (const value of countUp(limit)) {
    parts.push(String(value));
}

console.log(parts.join(","));
function* countUp(limit: number): Generator<number> {
    for (let current: number = 1; current <= limit; current++) {
        yield current;
    }
}

const limit: number = 4;
const parts: string[] = [];

for (const value of countUp(limit)) {
    parts.push(String(value));
}

console.log(parts.join(","));
  1. limit ← 3, parts ← (empty)

    4    }5}67const limit→ 3: number = 3;  //@limit=2, 48const parts→ (empty): string[] = [];
  2. function* countUp(limit: number): Generator<number>

    1function* countUp(limit3: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {
  3. for (let current: number = 1; current <= limit; current++)

    pass 1 of 3
    1function* countUp(limit: number): Generator<number> {2    for (let current1: number = 1; current <= limit3; current++) {3        yield current1;4    }
    All 3 passes — pass 1 is the card above
    passcurrent
    11
    22
    33
  4. parts ← 1

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current1;4    }5}67const limit: number = 3;  //@limit=2, 48const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value1));12}
    values this step(empty) 1parts
  5. parts ← 1,2

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current2;4    }5}67const limit: number = 3;  //@limit=2, 48const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value2));12}
    values this step1 1,2parts
  6. parts ← 1,2,3

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current3;4    }5}67const limit: number = 3;  //@limit=2, 48const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value3));12}1314console.log(parts1,2,3.join(","));
    output1,2,3
  1. limit ← 2, parts ← (empty)

    4    }5}67const limit→ 2: number = 2;8const parts→ (empty): string[] = [];
  2. function* countUp(limit: number): Generator<number>

    1function* countUp(limit2: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {
  3. for (let current: number = 1; current <= limit; current++)

    pass 1 of 2
    1function* countUp(limit: number): Generator<number> {2    for (let current1: number = 1; current <= limit2; current++) {3        yield current1;4    }
  4. parts ← 1

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current1;4    }5}67const limit: number = 2;8const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value1));12}
    values this step(empty) 1parts
  5. for (let current: number = 1; current <= limit; current++)

    pass 2 of 2
    1function* countUp(limit: number): Generator<number> {2    for (let current2: number = 1; current <= limit2; current++) {3        yield current2;4    }
  6. parts ← 1,2

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current2;4    }5}67const limit: number = 2;8const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value2));12}1314console.log(parts1,2.join(","));
    output1,2
  1. limit ← 4, parts ← (empty)

    4    }5}67const limit→ 4: number = 4;8const parts→ (empty): string[] = [];
  2. function* countUp(limit: number): Generator<number>

    1function* countUp(limit4: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {
  3. for (let current: number = 1; current <= limit; current++)

    pass 1 of 4
    1function* countUp(limit: number): Generator<number> {2    for (let current1: number = 1; current <= limit4; current++) {3        yield current1;4    }
    All 4 passes — pass 1 is the card above
    passcurrent
    11
    22
    33
    44
  4. parts ← 1

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current1;4    }5}67const limit: number = 4;8const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value1));12}
    values this step(empty) 1parts
  5. parts ← 1,2

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current2;4    }5}67const limit: number = 4;8const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value2));12}
    values this step1 1,2parts
  6. parts ← 1,2,3

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current3;4    }5}67const limit: number = 4;8const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value3));12}
    values this step1,2 1,2,3parts
  7. parts ← 1,2,3,4

    1function* countUp(limit: number): Generator<number> {2    for (let current: number = 1; current <= limit; current++) {3        yield current4;4    }5}67const limit: number = 4;8const parts: string[] = [];910for (const value of countUp(limit)) {11    parts.push(String(value4));12}1314console.log(parts1,2,3,4.join(","));
    output1,2,3,4