Ix.Enumerable.repeat

このエントリーをはてなブックマークに追加

IxJSでシーケンスを生成する関数の一つ。指定した値を繰り返し生成します。繰り返す回数を省略した場合は無限シーケンスを生成します。

Ix.Enumerable.repeat(value, count);
// value: この値が繰り返されます
// count?: 繰り返す回数。省略時は無限シーケンスになる。

実装方法を見ると結構おもしろい。

Enumerable.repeat = function (value, repeatCount) {
    return new Enumerable(function () {
        var count = repeatCount == null ? -1 : repeatCount, hasRepeatCount = repeatCount != null;
        return enumeratorCreate( // enumeratorCreateの定義は下
             // moveNext
            function () {
                if (count !== 0) {
                    hasRepeatCount && count--; // repeatCountが指定されない場合は必ずtrueを返す。これが無限シーケンスの仕掛け。
                    return true;
                } else {
                    return false;
                }
            },
            // getCurrent
            function () { return value; } // 必ずvalueを生成。これが繰り返しの仕掛け
        );
    });
}; 

var enumeratorCreate = Enumerator.create = function (moveNext, getCurrent, dispose) {
    var done = false;
    dispose || (dispose = noop);
    return new Enumerator(function () {
        if (done) {
            return false;
        }
        var result = moveNext(); // 必ずtrue
        if (!result) {
            done = true;
            dispose();
        }
        return result;
    }, function () { return getCurrent(); }, function () {
        if (!done) {
            dispose();
            done = true;
        }
    });
};

 

JSFiddle

Lazy.js関連関数
Lazy.repeat

目次へ

Written on May 26, 2015
このエントリーをはてなブックマークに追加