hbus
Version:
An event bus lib.
1 lines • 2.36 kB
JavaScript
class Action{constructor(t,s){this.type=t,this.payload=s}}function createActionFactory(t,s){const e=s instanceof Object;return r=>new Action(t,e&&r instanceof Object?Object.assign({},s,r):r)}function createProcessor(t,s){return(e,r)=>{const{type:i}=r;return i in t?t[i](e,r):s?s(e,r):e}}const t=(s,e)=>{if(s===e&&s+""==e+""||s!=s&&e!=e)return!0;if(!(s instanceof Object&&e instanceof Object))return!1;for(const r in s)if(!(r in e&&t(s[r],e[r])))return!1;for(const t in e)if(!(t in s))return!1;return!0},s=t=>{requestAnimationFrame(t)},e={tickMethod:s,_willTick:!1,_callbacks:[],tick(t){e._callbacks.push(t),e._willTick||(e._willTick=!0,e.tickMethod(()=>{e._willTick=!1;const{_callbacks:t}=e;t.forEach(t=>{t()}),t.length=0}))}};class Bus{constructor(s,e={}){this.processor=s,this.comparer=t,this._stateRequestCallbacks=[],this._willUpdate=!1,this._actions=[],this._subscriberMap=new Map,this._subscribers=[],this._state=e}_requestUdpate(){this._willUpdate||(this._willUpdate=!0,e.tick(()=>{this._willUpdate=!1,this._update();const{_stateRequestCallbacks:t,_state:s}=this;t.forEach(t=>{t(s)}),t.length=0}))}_update(){const{processor:t,comparer:s,_state:e,_actions:r,_subscriberMap:i}=this;let c,a=e instanceof Object?Object.create(e):e;r.forEach(s=>{void 0!==(c=t(a,s))&&(a=c)}),r.length=0,this._state=a;let n=!1;i.forEach((t,r)=>{const i=a[r];s(i,e[r])||(n=!0,t.forEach(t=>{t(i)}))}),!n&&s(e,a)||this._subscribers.forEach(t=>{t(a)})}getState(){return this._state}requestState(t){return this._stateRequestCallbacks.push(t),this._requestUdpate(),this}publish(t){return this._actions.push(t),this._requestUdpate(),this}subscribe(t){return this._subscribers.push(t),this}unsubscribe(t){const{_subscribers:s}=this,e=s.indexOf(t);return e>=0&&s.splice(e,1),this}clearSubscribers(){return this._subscribers.length=0,this}subscribeProp(t,s){const{_subscriberMap:e}=this;let r=e.get(t);return r||e.set(t,r=[]),r.push(s),this}unsubscribeProp(t,s){const{_subscriberMap:e}=this,r=e.get(t);if(r){const t=r.indexOf(s);t>=0&&r.splice(t,1)}return this}clearPropSubscribers(t){return this._subscriberMap.delete(t),this}clearAllPropSubscribers(){return this._subscriberMap.clear(),this}clearAllSubscribers(){return this.clearSubscribers().clearAllPropSubscribers()}}export{Action,createActionFactory,createProcessor,t as defaultComparer,s as defaultTickMethod,e as ticker,Bus};