이터레이터이자 이터러블을 생성하는 함수
function *gen() { //손쉽게 생성 가능한 이터러블
yield 1; //몇 번의 next를 통해 값을 꺼내줄지 결정
if (false) yield 2;
yield 3;
return 100; //done이 true가 되며 리턴 값을 value로 전달
}
let iter = gen();
log(iter[Symbol.iterator]() == iter)
log(iter.next());
for (const a of gen()) log(a); //순회 가능 => 순회는 리턴 없이 이루어지고 done인 순간 return 반환
function *odds(l) {
for (let i = 0; i < l; i++) {
if (i % 2) yield i;
}
}
let iter2 = odds(10);
function *infinity(i = 0) {
while (true) yield i++;
} //무한히 값을 생성하는 이터레이터 next를 할 때마다 yield를 통해 value가 무한히 생성된다.
function *limit(l, iter) {
for (const a of iter) {
yield a;
if (a == l) return; //같은 값을 만나면 멈추는 제네레이터
}
}
function *odds(l) {
for (const a of infinity(1)) {
if (i % 2) yield i;
if (a == l) return;
}
}
for (const a of odds(40)) log(a); //제너레이터를 통해 순회하는 값을 할당해줄 수 있다.
log(...odds(10));
log([...odds(10), ...odds(20)]);
const [head, ...tail] = odds(5);
const [a, b, ...rest] = odds(10);