function* generator(){
yield 1;
yield 2;
yield 3;
}
let iterator = generator()
iterator.next() // { value:1, done:false}
iterator.next() // { value:2, done:false}
// range
const range = () => {
let i = -1;
let res = [];
while (++i < l) {
res.push(i);
}
return res;
}
// L.lange
const L = {
range = function*() {
let i = -1;
while(++i < l){
yield i;
}
}
}
cosnt take = (l, iter) => {
let res = [];
for (const a of iter) {
res.push(a);
if (res.length === l) {
return res;
}
}
return res;
},
const test = (name, f) => {
console.time(name)
f()
console.timeEnd(name)
}
test("range", () => take(10, range(1000000))); // 10ms
test("L.range", () => take(10, L.range(1000000))); // 0.1ms
Lazy를 사용할 경우, 지연평가가 가능하기 때문에 10번만 실행됨. generator의 장점!
아래 코드에서 L.range(100000)
에선 연산하지 않음, take, reduce와 같은 함수가 실행됐을 때 하나씩 실행되며 평가하기 때문에 최적화 가능!
go(
L.range(100000),
take(5),
reduce((a, b) => a + b)
)
참고 :
함수형 프로그래밍과 JavaScript ES6+ 강의
https://ko.javascript.info/generators