인프런 커뮤니티 질문&답변

거울이님의 프로필 이미지
거울이

작성한 질문수

함수형 프로그래밍과 JavaScript ES6+

L.map

function* 없이 지연성이 있는 함수를 만들 수 있을까요?

작성

·

306

0

주어지는 generator기능이 없이, generator와 동일한 역할을 수행하는 함수를 코드로 보고 싶습니다.

답변 2

5

유인동님의 프로필 이미지
유인동
지식공유자

 
 

네. 가능합니다 :)

아래 코드는 제너레이터를 사용하지 않고 이터레이터를 생성하도록 하여 구현한 지연 평가입니다.

이해를 돕기 위해 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번만.

0

거울이님의 프로필 이미지
거울이
질문자

와... 감사합니다!

거울이님의 프로필 이미지
거울이

작성한 질문수

질문하기