Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- lazyAPI = {
- indexOf : function(func) {
- this.funcs.push(func);
- return this.funcs.length - 1;
- },
- addFunc : function(strFunc) {
- this.strHandler += strFunc;
- },
- forEach : function(fn) {
- var i = this.indexOf(fn);
- this.addFunc('fns['+i+'](el,i);');
- return this;
- },
- filter : function(fn) {
- var i = this.indexOf(fn);
- this.addFunc('if(!fns['+i+'](el,i)) return;');
- return this;
- },
- map : function(fn) {
- var i = this.indexOf(fn);
- this.addFunc('el = fns['+i+'](el,i);');
- return this;
- },
- get array() {
- var
- arr = this.arr,
- fns = this.funcs,
- out = [], i = 0,
- lenA = arr.length,
- str = this.strHandler + 'out.push(el);',
- handler = new Function('el,i,fns,out', str);
- /*
- var lastA = lenA - 1;
- for (; (i+=2) < lastA;) {
- handler(arr[i], i, fns, out);
- handler(arr[i+1], i+1, fns, out);
- }
- if((lastA+1) % 2 === 1) handler(arr[lastA], lastA, fns, out);
- */
- for(; ++i < lenA;) handler(arr[i], i, fns, out);
- return out;
- }
- };
- getterLazy = function() {
- var lazy = Object.create(lazyAPI);
- lazy.arr = this;
- lazy.funcs = [];
- lazy.strHandler = '';
- return lazy;
- };
- if(Object.defineProperty) {
- Object.defineProperty(Array.prototype, 'lazy',
- { get : getterLazy, enumerable : true, configurable : true });
- } else if({}.__defineGetter__) {
- Lazy.prototype.__defineGetter__('array', getterArray);
- }
- /* TESTING */
- function fill(size) {
- var arr = [];
- for(var i = 0; i < size ; ++i) arr[i] = i;
- return arr;
- }
- var arrays = {};
- function check(size, chain) {
- var arr = arrays[size] || (arrays[size] = fill(size));
- var sizeExp = size.toExponential();
- console.time('Default(' + sizeExp + ')');
- for(var i = 0; i < 100; ++i)
- chain(arr);
- console.timeEnd('Default(' + sizeExp + ')');
- console.time('Lazy(' + sizeExp + ')');
- for(var i = 0; i < 100; ++i)
- chain(arr.lazy).array;
- console.timeEnd('Lazy(' + sizeExp + ')');
- }
- chainOf2 = function (arr) {
- return arr
- .map(function(x){ return x-50 })
- .filter(function(x){ return x > 0});
- };
- chainOf4 = function (arr) {
- return arr
- .map(function(x){ return x-50 })
- .filter(function(x){ return x > 0})
- .map(function(x){ return x * 5 })
- .filter(function(x){ return x % 2});
- };
- chainOf6 = function (arr) {
- return arr
- .map(function(x){ return x-50 })
- .filter(function(x){ return x > 0})
- .map(function(x){ return x * 5 })
- .filter(function(x){ return x % 2})
- .map(function(x){ return x - 50 })
- .forEach(function(x){ x + 100 });
- };
- check(1e3, chainOf6);
Add Comment
Please, Sign In to add comment