Guest User

Untitled

a guest
Jul 15th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. lazyAPI = {
  2.  
  3.     indexOf : function(func) {
  4.         this.funcs.push(func);
  5.         return this.funcs.length - 1;
  6.     },
  7.  
  8.     addFunc : function(strFunc) {
  9.         this.strHandler += strFunc;
  10.     },
  11.  
  12.     forEach : function(fn) {
  13.         var i = this.indexOf(fn);
  14.         this.addFunc('fns['+i+'](el,i);');
  15.         return this;
  16.     },
  17.  
  18.     filter : function(fn) {
  19.         var i = this.indexOf(fn);
  20.         this.addFunc('if(!fns['+i+'](el,i)) return;');
  21.         return this;
  22.     },
  23.  
  24.     map : function(fn) {
  25.         var i = this.indexOf(fn);
  26.         this.addFunc('el = fns['+i+'](el,i);');
  27.         return this;
  28.     },
  29.  
  30.     get array() {
  31.         var
  32.             arr = this.arr,
  33.             fns = this.funcs,
  34.             out = [], i = 0,
  35.             lenA = arr.length,
  36.             str = this.strHandler + 'out.push(el);',
  37.             handler = new Function('el,i,fns,out', str);
  38.  
  39.     /*
  40.         var lastA = lenA - 1;
  41.         for (; (i+=2) < lastA;) {
  42.             handler(arr[i], i, fns, out);
  43.             handler(arr[i+1], i+1, fns, out);
  44.         }
  45.         if((lastA+1) % 2 === 1) handler(arr[lastA], lastA, fns, out);
  46.     */
  47.  
  48.         for(; ++i < lenA;) handler(arr[i], i, fns, out);
  49.         return out;
  50.     }
  51. };
  52.  
  53. getterLazy = function() {
  54.     var lazy = Object.create(lazyAPI);
  55.     lazy.arr = this;
  56.     lazy.funcs = [];
  57.     lazy.strHandler = '';
  58.     return lazy;
  59. };
  60.  
  61. if(Object.defineProperty) {
  62.     Object.defineProperty(Array.prototype, 'lazy',
  63.         { get : getterLazy, enumerable : true, configurable : true });
  64.  
  65. } else if({}.__defineGetter__) {
  66.     Lazy.prototype.__defineGetter__('array', getterArray);
  67. }
  68.  
  69. /* TESTING */
  70. function fill(size) {
  71.     var arr = [];
  72.     for(var i = 0; i < size ; ++i) arr[i] = i;
  73.     return arr;
  74. }
  75.  
  76. var arrays = {};
  77. function check(size, chain) {
  78.     var arr = arrays[size] || (arrays[size] = fill(size));
  79.     var sizeExp = size.toExponential();
  80.  
  81.     console.time('Default(' + sizeExp + ')');
  82.     for(var i = 0; i < 100; ++i)
  83.         chain(arr);
  84.     console.timeEnd('Default(' + sizeExp + ')');
  85.  
  86.     console.time('Lazy(' + sizeExp + ')');
  87.     for(var i = 0; i < 100; ++i)
  88.         chain(arr.lazy).array;
  89.     console.timeEnd('Lazy(' + sizeExp + ')');
  90.  
  91. }
  92.  
  93. chainOf2 = function (arr) {
  94.     return arr
  95.         .map(function(x){ return x-50 })
  96.         .filter(function(x){ return x > 0});
  97. };
  98.  
  99. chainOf4 = function (arr) {
  100.     return arr
  101.         .map(function(x){ return x-50 })
  102.         .filter(function(x){ return x > 0})
  103.         .map(function(x){ return x * 5 })
  104.         .filter(function(x){ return x % 2});
  105. };
  106.  
  107. chainOf6 = function (arr) {
  108.     return arr
  109.         .map(function(x){ return x-50 })
  110.         .filter(function(x){ return x > 0})
  111.         .map(function(x){ return x * 5 })
  112.         .filter(function(x){ return x % 2})
  113.         .map(function(x){ return x - 50 })
  114.         .forEach(function(x){ x + 100 });
  115. };
  116.  
  117. check(1e3, chainOf6);
Add Comment
Please, Sign In to add comment