159 lines
4.1 KiB
JavaScript
Executable File
159 lines
4.1 KiB
JavaScript
Executable File
({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;
|
|
});
|