123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- ({define:typeof define!="undefined"?define:function(deps, factory){module.exports = factory.apply(this, deps.map(function(id){return require(id)}))}}).
- define(["./promise"], function(promise){
- try{
- var when = promise.when;
- }catch(e){
- console.log("couldn't load promise library", e.stack);
- when = function(value, callback){
- return callback(value);
- }
- }
- function LazyArray(hasSomeAndLength){
- return new SomeWrapper(hasSomeAndLength);
- };
- var exports = LazyArray;
- exports.LazyArray = LazyArray;
- exports.first = function(array){
- return exports.get(array, 0);
- };
- exports.last = function(array){
- return exports.get(array, array.length-1);
- };
- exports.get = function(array, index){
- var result, i = 0;
- return when(array.some(function(item){
- if(i == index){
- result = item;
- return true;
- }
- i++;
- }),
- function(){
- return result;
- });
- };
- var testProto = {};
- var testProto2 = {a:"b"};
- testProto.__proto__ = testProto2;
- var mutableProto = testProto.a == "b";
- function SomeWrapper(hasSomeAndLength){
- if(mutableProto){
- hasSomeAndLength.source = hasSomeAndLength;
- hasSomeAndLength.__proto__ = SomeWrapper.prototype;
- return hasSomeAndLength;
- }
- this.source = hasSomeAndLength;
- if(hasSomeAndLength.length){
- this.length = hasSomeAndLength.length;
- }
- this.totalCount = hasSomeAndLength.totalCount;
- }
- exports.LazyArray.prototype = SomeWrapper.prototype = [];
- SomeWrapper.prototype.some = function(callback){
- this.source.some(callback);
- }
- SomeWrapper.prototype.filter = function(fn, thisObj){
- var results = [];
- return when(this.source.some(function(item){
- if(fn.call(thisObj, item)){
- results.push(item);
- }
- }), function(){
- return results;
- });
- };
- SomeWrapper.prototype.every = function(fn, thisObj){
- return when(this.source.some(function(item){
- if(!fn.call(thisObj, item)){
- return true;
- }
- }), function(result){return !result;});
- };
- SomeWrapper.prototype.forEach= function(fn, thisObj){
- return this.source.some(function(item){
- fn.call(thisObj, item);
- });
- };
- SomeWrapper.prototype.concat = function(someOther){
- var source = this.source;
- return new SomeWrapper({
- length : source.length + someOther.length,
- some : function(fn,thisObj){
- return when(source.some(fn,thisObj), function(result){
- return result || someOther.some(fn,thisObj);
- });
- }
- });
- };
- SomeWrapper.prototype.map = function(mapFn, mapThisObj){
- var source = this.source;
- return new SomeWrapper({
- length : source.length,
- some : function(fn,thisObj){
- return source.some(function(item){
- return fn.call(thisObj, mapFn.call(mapThisObj, item));
- });
- }
- });
- };
- SomeWrapper.prototype.toRealArray= function(mapFn, mapThisObj){
- var array = [];
- return when(this.source.some(function(item){
- array.push(item);
- }), function(){
- return array;
- });
- };
- SomeWrapper.prototype.join = function(){
- var args = arguments;
- return when(this.toRealArray(), function(realArray){
- return Array.prototype.join.apply(realArray, args);
- });
- };
- SomeWrapper.prototype.sort = function(){
- var args = arguments;
- return when(this.toRealArray(), function(realArray){
- return Array.prototype.sort.apply(realArray, args);
- });
- };
- SomeWrapper.prototype.reverse = function(){
- var args = arguments;
- return when(this.toRealArray(), function(realArray){
- return Array.prototype.reverse.apply(realArray, args);
- });
- };
- SomeWrapper.prototype.get = SomeWrapper.prototype.item = function(index){
- var result, i = 0;
- return when(this.source.some(function(item){
- if(i == index){
- result = item;
- return true;
- }
- i++;
- }), function(){
- return result;
- });
- };
- SomeWrapper.prototype.toSource = function(){
- var serializedParts = [];
- return when(this.source.some(function(item){
- serializedParts.push(item && item.toSource());
- }), function(){
- return '[' + serializedParts.join(",") + ']';
- });
- };
- SomeWrapper.prototype.toJSON = function(){
- var loadedParts = [];
- return when(this.source.some(function(item){
- loadedParts.push(item);
- }), function(){
- return loadedParts;
- });
- };
- return exports;
- });
|