Panda Noir

JavaScript の限界を究めるブログです。

無限長のイテレータに対してmapする

フィボナッチ数列イテレータなど、無限長であるイテレータに対してmapしたイテレータが欲しくなるときありますよね?ありますよね?

目標物

こんな感じのものが欲しいですな、ということです

const fib = function*() {
    let a = 0, b = 1;
    while (true) {
        yield a;
        [a, b] = [b, a + b];
    }
}
const fib2 = map(fib, x => x * 2);
const iter = fib2();
fib2.next().value; // 0
fib2.next().value; // 2
fib2.next().value; // 2
fib2.next().value; // 4
fib2.next().value; // 6

となるようなmapを作ります。

やり方

簡単明快です。

const map = (gen, f) => {
    return function*() {
        const iter = gen();
        for (const val of iter) {
            yield f(val);
        }
    };
}

え?next()に何か渡したい?return()したい? そんなこと知りません。 そのうち考えますね。