UNPKG

rxdeep

Version:
2 lines (1 loc) 5.97 kB
var rxdeep=function(e,t,s){"use strict";function r(e){return!e||!e.subs}function a(e){return null==e||"number"==typeof e||"string"==typeof e||"boolean"==typeof e||e instanceof Date}function n(e,t){if(e!==t){if(!a(e)&&!a(t)){const s={subs:{}},r=new Set;let a=!1;for(let i in e){r.add(i);const u=n(e[i],t[i]);u&&(s.subs[i]=u,a=!0)}for(let i in t)r.has(i)||(s.subs[i]=n(e[i],t[i]),a=!0);return a?s:void 0}return e instanceof Date&&t instanceof Date&&+e!=+t||e!==t?{from:e,to:t}:void 0}}class i extends t.Observable{constructor(e,a=new t.Subject,i){super(e=>(e.next(this.value),this.downstream.pipe(s.map(e=>e.value)).subscribe(e))),this._value=e,this._changesub=new t.Subject,this.downstream=a.pipe(s.map(e=>{if(r(e.trace)&&e.trace){const t=n(e.trace.from,e.trace.to);if(t)return{value:e.value,trace:t}}return e}),s.tap(e=>{e.value!==this._value&&(this._value=e.value)}),s.multicast(()=>this._changesub),s.refCount()),this.upstream=i||a}next(e){this.upstream.next({value:e,trace:{from:this.value,to:e}})}error(e){this.upstream.error(e)}complete(){this.upstream.complete(),this._changesub.complete()}get value(){return this._value}set value(e){this.next(e)}sub(e){const t=new i(this.value?this.value[e]:void 0,this.subDownstream(e,()=>t.value),this.subUpstream(e));return t}subDownstream(e,t){return this.downstream.pipe(s.map(t=>({value:t.value?t.value[e]:void 0,trace:t.trace})),s.filter(s=>r(s.trace)?t()!==s.value:e in s.trace.subs),s.map(t=>({value:t.value,trace:r(t.trace)?void 0:t.trace.subs[e]})))}subUpstream(e){return{next:t=>{this.value&&(this.value[e]=t.value),this.upstream.next({value:this.value,trace:{subs:{[e]:t.trace}}})},error:e=>this.upstream.error(e),complete:()=>{}}}}class u{constructor(e,t){this.keyFunc=t,this._keymap={},this.changes(e)}changes(e=[]){const t={additions:[],deletions:[],moves:[]},s=e.reduce((e,s,r)=>{const a=this.keyFunc(s);return e[a]={index:r,item:s},a in this._keymap||t.additions.push({index:r,item:s}),e},{});return Object.entries(this._keymap).forEach(([e,r])=>{if(e in s){const a=s[e];a.index!==r.index&&t.moves.push({oldIndex:r.index,newIndex:a.index,item:r.item})}else t.deletions.push(r)}),this._keymap=s,t}get keymap(){return this._keymap}}class c extends t.Observable{constructor(e,a){super(e=>this._changes.pipe(s.map(([e,t])=>e.value||[]),s.startWith(this.value)).subscribe(e)),this.state=e,this.keyfunc=a,this._value=[],this._watcher=new u(e.value,a),this._value=e.value||[],this._changesub=new t.Subject,this._changes=this.state.downstream.pipe(s.map(e=>[e,this._watcher.changes(e.value)]),s.map(([e,t])=>{if(t.moves.length>0&&!r(e.trace)){const s=t.moves.reduce((e,t)=>(e[t.oldIndex]=t.newIndex,e),{}),r={subs:Object.assign({},e.trace.subs)};return Object.entries(s).forEach(([t,s])=>{const a=n(this._value[t],e.value[s]);a?r.subs[s]=a:delete r.subs[s]}),[{value:e.value,trace:r},t]}return[e,t]}),s.tap(([e])=>{this._value=e.value||[]}),s.multicast(()=>this._changesub),s.refCount())}next(e){this.state.upstream.next({value:e,trace:{from:this.value,to:e}})}error(e){this.state.upstream.error(e)}complete(){this._changesub.complete()}get value(){return this._value}set value(e){this.next(e)}key(e){var t;const s=new i(null===(t=this._watcher.keymap[e])||void 0===t?void 0:t.item,this.keyDownstream(e,()=>s.value),this.keyUpstream(e));return s}keyDownstream(e,t){return this._changes.pipe(s.map(([t,s])=>({trace:t.trace,entry:this._watcher.keymap[e]})),s.filter(e=>r(e.trace)?t()!==e.entry.item:!e.entry&&!!t()||e.entry&&e.entry.index in e.trace.subs),s.map(e=>{var t;return{value:null===(t=e.entry)||void 0===t?void 0:t.item,trace:r(e.trace)||!e.entry?void 0:e.trace.subs[e.entry.index]}}))}keyUpstream(e){return{next:t=>{const s=this._watcher.keymap[e];this._value[s.index]=t.value,this.state.upstream.next({value:this._value,trace:{subs:{[s.index]:t.trace}}})},error:e=>this.state.upstream.error(e),complete:()=>{}}}index(e){var t;return this._changes.pipe(s.map(()=>{var t;return null===(t=this._watcher.keymap[e])||void 0===t?void 0:t.index}),s.startWith(null===(t=this._watcher.keymap[e])||void 0===t?void 0:t.index),s.distinctUntilChanged())}changes(){return this._changes.pipe(s.map(([e,t])=>t))}}function o(e){if(r(e.trace))return{value:e.trace.from,trace:{from:e.trace.to,to:e.trace.from}};{const t=Array.isArray(e.value)?[...e.value]:Object.assign({},e.value),s={subs:{}};for(let r in e.trace.subs){const a=o({value:e.value?e.value[r]:void 0,trace:e.trace.subs[r]});t[r]=a.value,s.subs[r]=a.trace}return Array.isArray(t)&&function e(t){void 0===t[t.length-1]&&(t.length--,e(t))}(t),{value:t,trace:s}}}function h(e){return s.takeUntil(e.pipe(s.startWith(void 0),s.last()))}class l extends i{constructor(e,r){super(e.value,t.defer(()=>t.merge(e.downstream.pipe(h(this._bounce)),this._bounce.pipe(s.map(o),h(e.downstream)))),{next:t=>{r(t)?e.upstream.next(t):this._bounce.next(t)},error:t=>e.upstream.error(t),complete:()=>this._bounce.complete()}),this.state=e,this.verifier=r,this._bounce=new t.Subject}bounce(){return t.merge(this.downstream.pipe(s.filter(()=>!1),h(this._bounce)),this._bounce.pipe(h(this.downstream)))}}class v extends i{constructor(e,r,a){super(e.value,t.merge(e.downstream,e.downstream.pipe(s.filter(e=>this._received!==e.value),a||(e=>e),s.tap(e=>{this._received=e.value,r.save(e.value)}),s.filter(()=>!1)),r.load().pipe(s.tap(e=>{this._received=e,this.next(e)}),s.filter(()=>!1))),e.upstream),this.state=e,this.storage=r,this.transform=a}}return e.KeyedState=c,e.PersistentState=v,e.State=i,e.VerifiedState=l,e.change=function(e,t){const s=n(e,t);if(s)return{value:t,trace:s}},e.ignore=function(){return{next:()=>{},error:()=>{},complete:()=>{}}},e.isLeaf=r,e.isStorage=function(e){return e&&e.load&&"function"==typeof e.load&&e.save&&"function"==typeof e.save},e.keyed=function(e,t){return new c(e,t)},e.persistent=function(e,t){return new v(e,t)},e.reverse=o,e.state=function(e){return new i(e)},e.trace=n,e.verified=function(e,t){return new l(e,t)},e}({},rxjs,rxjs.operators);