+TypeScript 예제
Playlist는 항목을 보관하고, 순회할 때 만든 반복자는 현재 위치를 보관한다. 위치를 컬렉션 하나에 저장하지 않아야 두 순회가 서로의 진행을 바꾸지 않는다.
// 내부 배열을 감추고 항목을 순회하는 약속만 제공한다.
class Playlist implements Iterable<string> {
private readonly tracks: readonly string[];
constructor(tracks: readonly string[]) { this.tracks = [...tracks]; }
// 새 호출마다 별도 순회 위치를 가진 생성기를 반환한다.
*[Symbol.iterator](): Generator<string, void, unknown> {
for (const track of this.tracks) yield track;
}
}
function step(iterator: Iterator<string>): string {
const result = iterator.next();
return result.done ? "(end)" : result.value;
}
const playlist = new Playlist(["intro", "outro"]);
const first = playlist[Symbol.iterator]();
const second = playlist[Symbol.iterator]();
console.log("first: " + step(first));
console.log("first: " + step(first));
console.log("second: " + step(second));
console.log("second: " + step(second));
first: intro
first: outro
second: intro
second: outro
C#의 GetEnumerator()에 대응하는 진입점이 Symbol.iterator다. 생성기 함수를 호출할 때마다 별도 반복자가 만들어지며, 끝난 뒤에는 next()의 done을 확인한다.