/*
- Struktura podobna do wzorca Observable
- Przypomina maszynę stanu - pamięta stworzoną kolekcję danych i zwraca kolejne wartości
- Generator jest specyficznym typem funkcji, która może być pauzowan i wznawiana
*/
// Funkcja generatora zwraca obiekt generatora (iterator), który może być iterowany przez właściwość next zwracającą kolejne wartości
function* g() {
yield 1;
yield 2;
yield 3;
}
// console.log(g()); // g {<suspended>}
const iterator = g();
/*
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}
*/
// console.log([...iterator]); // [1,2,3]
/*
for (let value of iterator) {
console.log(value); // 1, 2, 3
}
*/
// ---
function* a() {
const a = yield "2+2?";
console.log('A:', a);
const b = yield "3+3?";
console.log('B:', b);
if(a === 4 && b === 6) return "Cool!";
return "Not cool :(";
}
const iterator2 = a();
// The next time next() is called, execution resumes with the statement immediately after the yield.
console.log('Uno:', iterator2.next());
console.log('Duo:', iterator2.next(4));
console.log(iterator2.next(6));
// ---
{
function* c() {
let i = 0;
while(true) {
yield i++;
}
}
const i = c();
console.log(i.next().value);
console.log(i.next().value);
console.log(i.next().value);
console.log(i.next().value);
}