Skip to content

Instantly share code, notes, and snippets.

@knknkn1162
Created November 20, 2016 15:57
Show Gist options
  • Save knknkn1162/80b9581caac49548718e2a962a7ec38d to your computer and use it in GitHub Desktop.
Save knknkn1162/80b9581caac49548718e2a962a7ec38d to your computer and use it in GitHub Desktop.
JavaScript遅延評価の練習(yet finished)
function LazyChain(iter)
{
//push each function
this._calls = [];
this._target = iter;
}
// アロー演算子は使えない(thisがグローバルオブジェクトをさしてしまうから)
LazyChain.prototype.invoke = function(methodName, ...args)
{
this._calls.push(
(target) =>
// obj['sort']でfunctionが返される。
//レシーバーが関数なので、あとはapplyを適用すれば良い。
{ return target[methodName].apply(target, args);}
);
return this;
};
LazyChain.prototype.exec = function ()
{
return this._calls.reduce(
(target, thunk) => { return thunk(target); },
this._target
);
};
//ジェネレータによって生成。
function* range(from, to,step)
{
while(from < to) {
yield from;
from += step;
}
}
//配列生成部分(配列自体から遅延評価させるとしたらguard使わないとダメかな..)
var arr = Array.from(range(0, 1000, 1));
var res =
new LazyChain(arr)
.invoke('filter', (c) => {return c%3===0;})
.invoke('map', (c)=> {return c*2;})
.exec();
console.log(res);
@knknkn1162
Copy link
Author

JavaScriptで学ぶ関数型プログラミング 8.1.1レイジーチェーンあたりを参照

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment