Created
November 20, 2016 15:57
-
-
Save knknkn1162/80b9581caac49548718e2a962a7ec38d to your computer and use it in GitHub Desktop.
JavaScript遅延評価の練習(yet finished)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
JavaScriptで学ぶ関数型プログラミング 8.1.1レイジーチェーンあたりを参照