@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 2.17 kB
JavaScript
import e from"../../../core/Evented.js";import{someMap as t}from"../../../core/MapUtils.js";import{GraphicsMap as s}from"./GraphicsMap.js";class i extends e{constructor(e){super(),this._limit=e,this._all=new s,this._active=new a(this),this._pending=new Map,this._handle=this._all.on("change",(e=>this._handleChanges(e)))}destroy(){this._handle.remove()}get length(){return this._active.length}toArray(){return this._active.toArray()}find(e){return this._active.find(e)}forEach(e){this._active.forEach(e)}addMany(e){this._all.addMany(e)}removeManyByObjectId(e){this._all.removeManyByObjectId(e)}_handleChanges(e){let t=e.removed;if(this._pending.size>0){t=new Array;for(const s of e.removed)this._pending.delete(s.objectId)||t.push(s)}let s=this._limit-this._active.length+t.length;s<e.added.length&&(this._active.removeMany(t),t=[],h.reset(1-this._limit/(this._active.length+e.added.length)),this._active.forEach((e=>{h.sample()&&(t.push(e),this._pending.set(e.objectId,e))})),s=this._limit-this._active.length+t.length);let i=e.added;if(s<e.added.length){i=new Array,h.reset(s/e.added.length);for(const t of e.added)h.sample()?i.push(t):this._pending.set(t.objectId,t)}const n=s-i.length;n>0&&this._pending.size>0&&(h.reset(n/this._pending.size),this._pending.forEach((e=>{h.sample()&&(i.push(e),this._pending.delete(e.objectId))}))),this._active.addAndRemove(i,t)}}class n{constructor(){this._percentage=1,this._last=-1,this._index=0}reset(e){this._percentage=e,this._last=-1}sample(){const e=Math.floor(this._index*this._percentage);return++this._index,e!==this._last&&(this._last=e,!0)}}const h=new n;class a{constructor(e){this._parent=e,this._map=new Map}get length(){return this._map.size}forEach(e){this._map.forEach((t=>e(t)))}find(e){let s;return t(this._map,(t=>!!e(t)&&(s=t,!0))),s}toArray(){return[...this._map.values()]}addAndRemove(e,t){for(const s of e)this._map.set(s.objectId,s);for(const s of t)this._map.delete(s.objectId);(e.length>0||t.length>0)&&this._parent.emit("change",{added:e,removed:t})}removeMany(e){for(const t of e)this._map.delete(t.objectId);e.length>0&&this._parent.emit("change",{added:[],removed:e})}}export{i as LimitGraphicsMap};