네. 가능합니다 :)
아래 코드는 제너레이터를 사용하지 않고 이터레이터를 생성하도록 하여 구현한 지연 평가입니다.
이해를 돕기 위해 ES5 문법으로만 작성했습니다.
감사합니다.
function fromArray(arr) {
var i = -1, length = arr.length;
return {
next: function() {
return ++i >= length ?
{ done: true } :
{ value: arr[i], done: false };
}
}
}
function map(f, iter) {
return {
next: function() {
var cur = iter.next();
return cur.done ?
{ done: true } :
{ value: f(cur.value), done: false };
}
}
}
var iter = map(a => a + 10, fromArray([1, 2, 3, 4]));
console.log(iter.next()); // { value: 11, done: false }
console.log(iter.next()); // { value: 12, done: false }
console.log(iter.next()); // { value: 13, done: false }
console.log(iter.next()); // { value: 14, done: false }
console.log(iter.next()); // { done: true }
function filter(f, iter) {
return {
next: function() {
var cur = iter.next();
return cur.done ?
{ done: true } :
f(cur.value) ?
{ value: cur.value, done: false } :
this.next();
}
}
}
var iter2 = filter(a => a % 2, fromArray([1, 2, 3]));
console.log(iter2.next()); // { value: 1, done: false }
console.log(iter2.next()); // { value: 3, done: false }
console.log(iter2.next()); // { done: true }
function take(l, iter) {
var i = -1, res = [];
while (++i < l) {
var cur = iter.next();
if (cur.done) break;
res.push(cur.value);
}
return res;
}
console.log(
take(2,
filter(a => a % 2,
map(a => a + 10,
fromArray([1, 2, 3, 4, 5])))));
// [11, 13] map의 next에는 3번만.