Tree.prototype.searchTree = function(bbox){ var extents = this.extent(bbox).sort().map(function(v){ return [v,this.next(v)]; },this).reduce(function(a,b){ if(!a.length){ return [b]; } if(a[a.length-1][1]===b[0]){ a[a.length-1][1] = b[1]; }else{ a.push(b); } return a; },[]); var self = this; return all(extents.map(function(v){ return self.findChildren(v[0],v[1]); })).then(function(children){ var map = {}; children.forEach(function(child){ child.forEach(function(item){ map[item] = true; }); }); return Object.keys(map); }); }
return use(array,function(arr){ return all(qMap(arr,function(a,i){ return resolve(a).then(function(b){ return func(b,i); }); })); });
return this.searchTree(bbox).then(function(results){ return all(results.map(function(item){ return this.fetch(item); },self)).then(function(results){ return results.filter(function(item){ return self.contains(bbox,item.bbox)||self.intersects(bbox, item.bbox); }); }); });
function apply(){ var args = qMap(arguments); var func = args.shift(); if(args.length===0){ return cast(func()); }else if(args.length===1){ return cast(args[0]).then(func); } return all(args).then(function(results){ return func.apply(null,results); }); }
Tree.prototype.load = function(array){ if(!Array.isArray(array)&&array.features){ array = array.features; } var self = this; var batch = []; var bboxen = {}; var i = -1; var len = array.length; var extent; while(++i<len){ if(!array[i].bbox){ array[i].bbox = makeBbox(array[i]); } if(!array[i].id){ array[i].id = makeID(array[i]); } array[i].bbox.id = array[i].id; batch[i] = {key:'z-'+array[i].id,value:array[i],type:'put'}; extent = this.makeExtent(array[i]); batch[i].value.bboxen = extent; extent.forEach(function(value){ if(!bboxen[value]){ bboxen[value]=[]; } if(~~bboxen[value].indexOf(array[i].id)){ bboxen[value].push(array[i].id); } }) }; var things = []; Object.keys(bboxen).forEach(function(quad){ var ids = bboxen[quad]; things.push(this.has(quad).then(function(answer){ if(answer){ return self.get(quad); }else{ return {features:[],id:quad} } }).then(function(v){ v.features = v.features.concat(ids); return {type:'put',key:v.id,value:v} })) },this); return all(things).then(function(moreKeys){ batch = batch.concat(moreKeys); return self.batch(batch); }); }
}).then(function(bboxen){ return all(bboxen.map(function(bbox){ return self.get(bbox).then(function(resp){ if(resp.features.length===1){ return {type:'del',key:resp.id} }else{ resp.features = resp.features.filter(function(v){ return v!==id; }) return {type:'put',key:resp.id,value:resp}; } }); })).then(function(batch){ return self.batch(batch); }) });
return promise(function(yes,no){ all(qMap(array,function(value){ var cvalue = cast(value); if(hasfunc){ cvalue = cvalue.then(func); } return cvalue.then(function(pValue){ if(pValue){ yes(true); }else{ return false; } }); })).then(function(){ yes(false); },no); });
function zip(){ if(arguments.length===1){ return map(arguments[0],function(a){ return [a]; }); } return all(qMap(arguments)).then(function(args){ var min = args[0].length; var shortest = 0; each(args,function(a,i){ var len = a.length; if(len<min){ shortest = i; min = len; } }); return map(args[shortest],function(_,i){ return map(args,function(value){ return value[i]; }); }); }); }
Tree.prototype.insertBbox =function(item){ var extent = item.bboxen; var id = item.id; var self = this; if(!Array.isArray(id)){ id = [id]; } return all(extent.map(function(v){ return this.has(v).then(function(answer){ if(answer){ return self.get(v); }else{ return {features:[],id:v} } }); },this)).then(function(answers){ return self.batch(answers.map(function(v){ v.features = v.features.concat(id); return {type:'put',key:v.id,value:v} })).then(function(){ return extent; }); }); }
it('should work when all are rejected including a nested one',function(){ var a = some(resolve([resolve().then(function(){ return reject(1); }),reject(3),reject(5),reject(7),reject(9)])); return all([a.should.be.rejected.and.eventually.include.members([1,3,5,7,9]),a.should.be.rejected.and.eventually.have.length(5)]); });
it('should work with very nested values',function(){ var a = some(resolve([resolve().then(function(){ return resolve(1); }),resolve(3),resolve(5),resolve(7),resolve(9)])); return all([a.should.eventually.include.members([1,3,5,7,9]),a.should.eventually.have.length(5)]); });
it('should work with a rejection',function(){ var a = some(resolve([resolve(1),reject(3),resolve(5),resolve(7),resolve(9)])); return all([a.should.eventually.include.members([1,5,7,9]),a.should.eventually.have.length(4)]); });
it('should work mixed',function(){ var a = some(resolve([resolve(1),3,resolve(5),resolve(7),resolve(9)])); return all([a.should.eventually.include.members([1,3,5,7,9]),a.should.eventually.have.length(5)]); });
it('should work when all are rejected',function(){ var a = some([reject(1),reject(3),reject(5),reject(7),reject(9)]); return all([a.should.be.rejected.and.eventually.include.members([1,3,5,7,9]),a.should.be.rejected.and.eventually.have.length(5)]); });