Iterables and Generators
Generator Functions
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
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(","));
limit ← 3, parts ← (empty)
4 }5}67const limit→ 3: number = 3; //@limit=2, 48const parts→ (empty): string[] = [];function* countUp(limit: number): Generator<number>
1function* countUp(limit3: number): Generator<number> {2 for (let current: number = 1; current <= limit; current++) {for (let current: number = 1; current <= limit; current++)
pass 1 of 31function* 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 pass current1 1 2 2 3 3 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) → 1partsparts ← 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,2partsparts ← 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
limit ← 2, parts ← (empty)
4 }5}67const limit→ 2: number = 2;8const parts→ (empty): string[] = [];function* countUp(limit: number): Generator<number>
1function* countUp(limit2: number): Generator<number> {2 for (let current: number = 1; current <= limit; current++) {for (let current: number = 1; current <= limit; current++)
pass 1 of 21function* countUp(limit: number): Generator<number> {2 for (let current1: number = 1; current <= limit2; current++) {3 yield current1;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) → 1partsfor (let current: number = 1; current <= limit; current++)
pass 2 of 21function* countUp(limit: number): Generator<number> {2 for (let current2: number = 1; current <= limit2; current++) {3 yield current2;4 }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
limit ← 4, parts ← (empty)
4 }5}67const limit→ 4: number = 4;8const parts→ (empty): string[] = [];function* countUp(limit: number): Generator<number>
1function* countUp(limit4: number): Generator<number> {2 for (let current: number = 1; current <= limit; current++) {for (let current: number = 1; current <= limit; current++)
pass 1 of 41function* 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 pass current1 1 2 2 3 3 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 = 4;8const parts: string[] = [];910for (const value of countUp(limit)) {11 parts.push(String(value1));12}values this step(empty) → 1partsparts ← 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,2partsparts ← 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,3partsparts ← 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