計算機科学のブログ

イテラブル ジェネレーター、無限、take関数

入門JavaScriptプログラミング (JD Isaacks(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(イテラブル)、LESSON 23(イテラブル)、23.6(練習問題)、Q23-1の解答を求めてみる。

コード

function take(n, iterable) {
    let result = [],
        i = 0;

    if (n === 0) {
        return result;
    }
    i++;
    for (const iterator of iterable) {
        result.push(iterator);
        if (i === n) {
            break;
        }
        i++;
    }

    return result;
}

function* naturalNumbers() {
    for (let n = 0; true; n++) {
        yield n;
    }
}

let ns = [0, 1, 2, 5, 10];

for (const n of ns) {
    console.log(take(n, naturalNumbers()));
}

function* oneTwoThree() {
    yield 1;
    yield 2;
    yield 3;
}

for (const n of ns) {
    console.log(take(n, oneTwoThree()));
}

入出力結果(Terminal、Zsh)

% node sample.js 
[]
[ 0 ]
[ 0, 1 ]
[ 0, 1, 2, 3, 4 ]
[
  0, 1, 2, 3, 4,
  5, 6, 7, 8, 9
]
[]
[ 1 ]
[ 1, 2 ]
[ 1, 2, 3 ]
[ 1, 2, 3 ]
%