UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.35 kB
import{ObservableBase as t}from"./ObservableBase.js";import{OriginId as e}from"./PropertyOrigin.js";import{trackAccess as s,runTracked as i,trackExplicitDependencies as r,runUntracked as o}from"./tracking.js";import{Flags as n}from"./tracking/Flags.js";class a{constructor(t,e,s){this.properties=t,this.propertyName=e,this.metadata=s,this.observerObject=new l,this._accessed=null,this._handles=null,this.observerObject.flags=n.Dirty|(s.nonNullable?n.NonNullable:0)|(s.hasOwnProperty("value")?n.HasDefaultValue:0)|(void 0===s.get?n.DepTrackingInitialized:0)|(void 0===s.dependsOn?n.AutoTracked:0),c.register(this,this.observerObject)}destroy(){this.observerObject.destroy(),this._accessed=null,this._clearObservationHandles(),c.unregister(this)}getComputed(){const t=this.observerObject;s(t);const a=this.properties.store,l=this.propertyName,c=t.flags,h=a.get(l);if(c&n.Computing)return h;if(~c&n.Dirty&&a.has(l))return h;t.flags|=n.Computing;const d=this.properties.host;let g;c&n.AutoTracked?g=i(this,this.metadata.get,d):(r(d,this),g=this.metadata.get.call(d)),a.set(l,g,e.COMPUTED);const b=a.get(l);return b===h?t.flags&=~n.Dirty:o(this.commit,this),t.flags&=~n.Computing,b}onObservableAccessed(t){t!==this.observerObject&&(null===this._accessed&&(this._accessed=[]),this._accessed.includes(t)||this._accessed.push(t))}onTrackingEnd(){this._clearObservationHandles();const t=this.observerObject;t.flags|=n.DepTrackingInitialized;const e=this._accessed;if(null===e)return;let s=this._handles;null===s&&(s=this._handles=[]);for(let i=0;i<e.length;++i)s.push(e[i].observe(t));e.length=0}notifyChange(){const t=this.observerObject;t.onInvalidated(),t.onCommitted()}invalidate(){this.observerObject.onInvalidated()}commit(){const t=this.observerObject;t.flags&=~n.Dirty,t.onCommitted()}_clearObservationHandles(){const t=this._handles;if(null!==t){for(let e=0;e<t.length;++e)t[e].remove();t.length=0}}}class l extends t{constructor(){super(...arguments),this.flags=0}onInvalidated(){~this.flags&n.Overriden&&(this.flags|=n.Dirty);const t=this._observers;if(t&&t.length>0)for(const e of t)e.onInvalidated()}onCommitted(){const t=this._observers;if(t&&t.length>0){const e=t.slice();for(const t of e)t.onCommitted()}}destroy(){this.flags&n.Dirty&&this.onCommitted(),super.destroy()}}const c=new FinalizationRegistry((t=>{t.destroy()}));export{a as Property};