똑같은 삽질은 2번 하지 말자
Javascript ES6+ 에서 함수형 프로그래밍(제너레이터) 본문
제너레이터
이터레이터이자 이터러블을 생성하는 함수
난생처음 보는 함수..이다
function* generator(){
yield 1;
yield 2;
yield 3;
}
let iter = gen()
log(iter[Symbol.iterator]() == iter) // true => well-formed iterator이다
log(iter.next()) // value: 1 done: false
log(iter.next()) // value: 2 done: false
log(iter.next()) // value: 3 done: false
log(iter.next()) // value: undefined done: true
for(const i of iter) console.log(i) // 순회가능
- 제네레이터 함수를 일단 처음 실행해도 아무일도 일어나지 않는다. 그냥 제네레이터 객체가 리턴된다.
- 제네레이터 객체는 next() 메소드를 실행할 때마다 다음 yield 문까지 실행되고 정지한다. 다시 next()를 실행하면 아까 멈췄던 yield 부터 다음 yield까지 실행하고 다시 정지한다.
- 더 이상 yield가 없으면 제네레이터의 실행은 완전히 종료된다.
여기서, 제네레이터 객체는 이터레이터 객체이고(next() 메소드를 구현했음) 제네레이터 함수는 이터러블 객체이다(이터레이터를 반환함)
그리고 제너레이터로 상당히 상징적인 것을 할 수 있는데,
function* generator(){
yield 1;
if (false) yield 2;
yield 3;
}
let iter = generator()
for(const i of iter) console.log(i) // 1 3
위와 같이 문장(특정한 로직)을 통해서 순회할 수 있는 데이터 스트림을 만들어 낼 수 있다.
내가 원하는 범위에서 순회가능한 홀수들을 가진 iterable을 만들어보자
function* odds(start, end) {
let i = start%2 ? start : ++start;
while(i <= end) {
yield i;
i += 2
}
}
for(const odd of odds(1, 15)) console.log(odd)
다양한 generator 활용방법(꽤 신박한 방법이었다.. 강의에서 가져온 코드)
function* infinity(i = 0) { // 무한대의 순회가능한 iterable
while (true) yield i++;
}
function* limit(l, iter) { // 주어진 범위내의 순회가능한 iterable
for (const a of iter) {
yield a;
if (a == l) return;
}
}
function* odds(l) { // 홀수들
for (const a of limit(l, infinity(1))) { // 짬뽕 시키기
if (a % 2) yield a;
}
}
for (const a of odds(10)) log(a); // 1 3 5 7 9
console.log(...odds(10)); // 1 3 5 7 9
console.log([...odds(10), ...odds(20)]); // 1 3 5 7 9 1 3 5 7 9 11 13 15 17 19
const [head, ...tail] = odds(5);
console.log(head); // 1
console.log(tail); // 3 5
const [a, b, ...rest] = odds(10);
console.log(a); // 1
console.log(b); // 3
console.log(rest); // 5 7 9
이렇게 제너레이터로 손쉽게 이터러블을 만들어 낼 수 있으며, 제너레이터나 이터레이터들을 잘 활용하면 좀 더 조합성이 높은
프로그래밍을 할 수 있다.
'Javascript' 카테고리의 다른 글
Browser Back & history API (브라우저 뒤로가기에 대한 대응) (0) | 2021.09.09 |
---|---|
Javascript ES6+ 에서 함수형 프로그래밍(go, pipe,curry) (0) | 2021.08.26 |
Javascript ES6+ 에서 함수형 프로그래밍(리스트 순회, Iterable Iterator 프로토콜 ) (0) | 2021.08.16 |
Javascript ES6+ 에서 함수형 프로그래밍(평가, 일급, 일차함수, 고차함수) (0) | 2021.08.16 |
Promise.all() 여러개의 비동기함수를 실행 (0) | 2021.08.04 |
Comments