@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 12.2 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as e}from"tslib";import t from"./ArrayPool.js";import{isArrayWithReadonly as s}from"./arrayUtils.js";import{EventedAccessor as i}from"./Evented.js";import{makeHandle as r}from"./handleUtils.js";import{clone as n}from"./lang.js";import h from"./Logger.js";import o from"./ObjectPool.js";import{schedule as l}from"./scheduling.js";import{ensureType as a,ensureOneOfType as c}from"./accessorSupport/ensureType.js";import{trackAccess as f}from"./accessorSupport/tracking.js";import{property as _}from"./accessorSupport/decorators/property.js";import{shared as u}from"./accessorSupport/decorators/shared.js";import{subclass as g}from"./accessorSupport/decorators/subclass.js";import{SimpleObservable as m}from"./accessorSupport/tracking/SimpleObservable.js";import{isSerializable as p}from"./support/jsonUtils.js";var d;class b{constructor(){this.target=null,this.cancellable=!1,this.defaultPrevented=!1,this.item=void 0,this.type=void 0}preventDefault(){this.cancellable&&(this.defaultPrevented=!0)}reset(e){this.defaultPrevented=!1,this.item=e}}class v{constructor(e,t,s,i,r){this.target=e,this.added=t,this.removed=s,this.start=i,this.deleteCount=r}}const y=new o(()=>new b,void 0,e=>{e.item=null,e.target=null,e.defaultPrevented=!1,e.cancellable=!1});function C(e){e&&"object"==typeof e&&"destroy"in e&&"function"==typeof e.destroy&&e.destroy()}function A(e){return e?e instanceof I?e.toArray():e.length?Array.prototype.slice.apply(e):[]:[]}function x(e){if(e?.length)return e[0]}function j(e,t,s,i){const r=Math.min(e.length-s,t.length-i);let n=0;for(;n<r&&e[s+n]===t[i+n];)n++;return n}function E(e,t,s,i){t&&t.forEach((t,r,n)=>{e.push(t),E(e,s.call(i,t,r,n),s,i)})}const w=new Set,L=new Set,S=new Set,B=new Map;let O=0,I=d=class extends i{static ofType(t){if(!t)return d;if(B.has(t))return B.get(t);let s=null;if("function"==typeof t)s=t.prototype.declaredClass;else if(t.base)s=t.base.prototype.declaredClass;else for(const e in t.typeMap){const i=t.typeMap[e].prototype.declaredClass;s?s+=` | ${i}`:s=i}let i=class extends d{};return e([u({Type:t,ensureType:"function"==typeof t?a(t):c(t)})],i.prototype,"itemType",void 0),i=e([g(`esri.core.Collection<${s}>`)],i),B.set(t,i),i}static isCollection(e){return null!=e&&e instanceof d}constructor(e){super(e),this._chgListeners=[],this._notifications=null,this._updating=!1,this._timer=null,this._observable=new m,this._length=0,this._items=[],Object.defineProperty(this,"uid",{value:O++})}normalizeCtorArgs(e){return e?s(e)||e instanceof d?{items:e}:e:{}}destroy(){this._removeAllRaw(),this._timer&&this._timer.remove(),super.destroy(),this._notifications=null}*[Symbol.iterator](){yield*this.items}get length(){return this._length}set length(e){e>this._length?h.getLogger(this).error("#length=","Cannot increase the length of the collection by assigning to the length property."):this.splice(e,Math.max(0,this._length-e))}get items(){return f(this._observable),this._items}set items(e){this._emitBeforeChanges(1)||(this._splice(0,this.length,A(e)),this._emitAfterChanges(1))}hasEventListener(e){return!this.destroyed&&("change"===e?this._chgListeners.length>0:super.hasEventListener(e))}on(e,t){if(this.destroyed)return r();if("change"===e){const e=this._chgListeners,s={removed:!1,callback:t};return e.push(s),this._notifications&&this._notifications.push({listeners:e.slice(),items:this._items.slice(),changes:[]}),r(()=>{s.removed=!0,e.splice(e.indexOf(s),1)})}return super.on(e,t)}once(e,t){const s="deref"in t?()=>t.deref():()=>t,i=this.on(e,e=>{s()?.call(null,e),i.remove()});return i}add(e,t){if(f(this._observable),this._emitBeforeChanges(1))return this;const s=this.getNextIndex(t??null);return this._splice(s,0,[e]),this._emitAfterChanges(1),this}addMany(e,t=this._items.length){if(f(this._observable),!e?.length)return this;if(this._emitBeforeChanges(1))return this;const s=this.getNextIndex(t);return this._splice(s,0,A(e)),this._emitAfterChanges(1),this}at(e){if(f(this._observable),(e=Math.trunc(e)||0)<0&&(e+=this.length),!(e<0||e>=this.length))return this._items[e]}removeAll(){if(f(this._observable),!this.length||this._emitBeforeChanges(2))return[];const e=this._removeAllRaw();return this._emitAfterChanges(2),e}_removeAllRaw(){return 0===this.length?[]:this._splice(0,this.length)||[]}clone(){return f(this._observable),this._createNewInstance({items:this._items.map(n)})}concat(...e){f(this._observable);const t=e.map(A);return this._createNewInstance({items:this._items.concat(...t)})}drain(e,t){if(f(this._observable),!this.length||this._emitBeforeChanges(2))return;const s=this._splice(0,this.length),i=s.length;for(let r=0;r<i;r++)e.call(t,s[r],r,s);this._emitAfterChanges(2)}destroyAll(){this.drain(C)}destroyMany(e){const t=this.removeMany(e);return t.forEach(C),t}every(e,t){return f(this._observable),this._items.every(e,t)}filter(e,t){f(this._observable);const s=2===arguments.length?this._items.filter(e,t):this._items.filter(e);return this._createNewInstance({items:s})}find(e,t){return f(this._observable),this._items.find(e,t)}findIndex(e,t){return f(this._observable),this._items.findIndex(e,t)}flatten(e,t){f(this._observable);const s=[];return E(s,this,e,t),new d(s)}forEach(e,t){return f(this._observable),this._items.forEach(e,t)}getItemAt(e){return f(this._observable),this._items[e]}getNextIndex(e){f(this._observable);const t=this.length;return(e=e??t)<0?e=0:e>t&&(e=t),e}includes(e,t=0){return f(this._observable),this._items.includes(e,t)}indexOf(e,t=0){return f(this._observable),this._items.indexOf(e,t)}join(e=","){return f(this._observable),this._items.join(e)}lastIndexOf(e,t=this.length-1){return f(this._observable),this._items.lastIndexOf(e,t)}map(e,t){f(this._observable);const s=this._items.map(e,t);return new d({items:s})}reorder(e,t=this.length-1){f(this._observable);const s=this.indexOf(e);if(-1!==s){if(t<0?t=0:t>=this.length&&(t=this.length-1),s!==t){if(this._emitBeforeChanges(4))return e;this._splice(s,1),this._splice(t,0,[e]),this._emitAfterChanges(4)}return e}}pop(){if(f(this._observable),!this.length||this._emitBeforeChanges(2))return;const e=x(this._splice(this.length-1,1));return this._emitAfterChanges(2),e}push(...e){return f(this._observable),this._emitBeforeChanges(1)||(this._splice(this.length,0,e),this._emitAfterChanges(1)),this.length}reduce(e,t){f(this._observable);const s=this._items;return 2===arguments.length?s.reduce(e,t):s.reduce(e)}reduceRight(e,t){f(this._observable);const s=this._items;return 2===arguments.length?s.reduceRight(e,t):s.reduceRight(e)}remove(e){return f(this._observable),this.removeAt(this.indexOf(e))}removeAt(e){if(f(this._observable),e<0||e>=this.length||this._emitBeforeChanges(2))return;const t=x(this._splice(e,1));return this._emitAfterChanges(2),t}removeMany(e){if(f(this._observable),!e?.length||this._emitBeforeChanges(2))return[];const t=e instanceof d?e.toArray():e,s=this._items,i=[],r=t.length;for(let n=0;n<r;n++){const e=t[n],r=s.indexOf(e);if(r>-1){const e=1+j(t,s,n+1,r+1),h=this._splice(r,e);h&&h.length>0&&i.push.apply(i,h),n+=e-1}}return this._emitAfterChanges(2),i}reverse(){if(f(this._observable),this._emitBeforeChanges(4))return this;const e=this._splice(0,this.length);return e&&(e.reverse(),this._splice(0,0,e)),this._emitAfterChanges(4),this}shift(){if(f(this._observable),!this.length||this._emitBeforeChanges(2))return;const e=x(this._splice(0,1));return this._emitAfterChanges(2),e}slice(e=0,t=this.length){return f(this._observable),this._createNewInstance({items:this._items.slice(e,t)})}some(e,t){return f(this._observable),this._items.some(e,t)}sort(e){if(f(this._observable),!this.length||this._emitBeforeChanges(4)||!this._requiresSort(e))return this;const t=this._splice(0,this.length);return arguments.length?t.sort(e):t.sort(),this._splice(0,0,t),this._emitAfterChanges(4),this}_requiresSort(e=(e,t)=>e===t?0:e<t?-1:1){const t=this.length-1;for(let s=0;s<t;s++){if(e(this.items[s],this.items[s+1])>0)return!0}return!1}splice(e,t,...s){f(this._observable),1===arguments.length&&(t=this.length),t??=0;const i=(t?2:0)|(s.length?1:0);if(this._emitBeforeChanges(i))return[];const r=this._splice(e,t,s)||[];return this._emitAfterChanges(i),r}toArray(){return f(this._observable),this._items.slice()}toJSON(e){f(this._observable);return this.toArray().map(t=>p(t)?t.toJSON(e):t)}toLocaleString(){return f(this._observable),this._items.toLocaleString()}toString(){return f(this._observable),this._items.toString()}unshift(...e){return f(this._observable),!e.length||this._emitBeforeChanges(1)||(this._splice(0,0,e),this._emitAfterChanges(1)),this.length}_createNewInstance(e){return new this.constructor(e)}_splice(e,t,s){const i=this._items,r=this.itemType;let n,h;if(!this._notifications&&this.hasEventListener("change")&&(this._notifications=[{listeners:this._chgListeners.slice(),items:this._items.slice(),changes:[]}],this._timer&&this._timer.remove(),this._updating=!0,this._timer=l(()=>this._dispatchChange())),e<0&&(e+=this.length),t){if(h=i.splice(e,t),this.hasEventListener("before-remove")){const t=y.acquire();t.target=this,t.cancellable=!0;for(let s=0,r=h.length;s<r;s++)n=h[s],t.reset(n),this.emit("before-remove",t),t.defaultPrevented&&(h.splice(s,1),i.splice(e,0,n),e+=1,s-=1,r-=1);y.release(t)}if(this._length=this._items.length,this.hasEventListener("after-remove")){const e=y.acquire();e.target=this,e.cancellable=!1;const t=h.length;for(let s=0;s<t;s++)e.reset(h[s]),this.emit("after-remove",e);y.release(e)}}if(s?.length){if(r){const e=[];for(const t of s){const s=r.ensureType(t);null==s&&null!=t||e.push(s)}s=e}const t=this.hasEventListener("before-add"),n=this.hasEventListener("after-add"),h=e===this.length;if(t||n){const r=y.acquire();r.target=this,r.cancellable=!0;const o=y.acquire();o.target=this,o.cancellable=!1;for(const l of s)t?(r.reset(l),this.emit("before-add",r),r.defaultPrevented||(h?i.push(l):i.splice(e++,0,l),this._length=i.length,n&&(o.reset(l),this.emit("after-add",o)))):(h?i.push(l):i.splice(e++,0,l),this._length=i.length,o.reset(l),this.emit("after-add",o));y.release(o),y.release(r)}else{if(h)for(const e of s)i.push(e);else i.splice(e,0,...s);this._length=i.length}}if((s?.length||h?.length)&&this._notifyChangeEvent(s,h),this.hasEventListener("after-splice")){const i=new v(this,s,h,e,t);this.emit("after-splice",i)}return h}_emitBeforeChanges(e){let t=!1;if(this.hasEventListener("before-changes")){const s=y.acquire();s.target=this,s.cancellable=!0,s.type=e,this.emit("before-changes",s),t=s.defaultPrevented,y.release(s)}return t}_emitAfterChanges(e){if(this.hasEventListener("after-changes")){const t=y.acquire();t.target=this,t.cancellable=!1,t.type=e,this.emit("after-changes",t),y.release(t)}this._observable.notify()}_notifyChangeEvent(e,t){this.hasEventListener("change")&&this._notifications&&this._notifications[this._notifications.length-1].changes.push({added:e,removed:t})}get updating(){return this._updating}_dispatchChange(){if(this._timer&&(this._timer.remove(),this._timer=null),this._updating=!1,!this._notifications)return;const e=this._notifications;this._notifications=null;for(const s of e){const e=s.changes;w.clear(),L.clear(),S.clear();for(const{added:t,removed:s}of e){if(t)if(0===S.size&&0===L.size)for(const e of t)w.add(e);else for(const e of t)L.has(e)?(S.add(e),L.delete(e)):S.has(e)||w.add(e);if(s)if(0===S.size&&0===w.size)for(const e of s)L.add(e);else for(const e of s)w.has(e)?w.delete(e):(S.delete(e),L.add(e))}const i=t.acquire();w.forEach(e=>{i.push(e)});const r=t.acquire();L.forEach(e=>{r.push(e)});const n=this._items,h=s.items,o=t.acquire();if(S.forEach(e=>{h.indexOf(e)!==n.indexOf(e)&&o.push(e)}),s.listeners&&(i.length||r.length||o.length)){const e={target:this,added:i,removed:r,moved:o},t=s.listeners.length;for(let i=0;i<t;i++){const t=s.listeners[i];t.removed||t.callback.call(this,e)}}t.release(i),t.release(r),t.release(o)}w.clear(),L.clear(),S.clear()}};e([_()],I.prototype,"_updating",void 0),e([_()],I.prototype,"_length",void 0),e([_()],I.prototype,"length",null),e([_()],I.prototype,"items",null),e([_({readOnly:!0})],I.prototype,"updating",null),I=d=e([g("esri.core.Collection")],I);const q=I;export{q as default};