UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 6.91 kB
const e=e=>typeof e,t=e(""),n=e(!0),r=e(0),s=e(e),a="Listener",o="Result",i="Ids",d="Table",l="Row",c=l+"Count",u=l+i,v="Sorted"+l+i,g="Cell",L=g+i,h=e=>(t,n,r)=>e(t)?r?.():n(t),w=Math,f=w.max,m=w.min,y=isFinite,R=e=>null==e,p=e=>void 0===e,T=h(R),b=h(p),C=t=>e(t)==s,V=e=>Array.isArray(e),P=e=>e.length,S=()=>{},I=(e,t)=>e.every(t),Q=(e,t)=>P(e)===P(t)&&I(e,(e,n)=>t[n]===e),E=(e,t)=>V(e)&&V(t)?Q(e,t):e===t,M=(e,t)=>e.forEach(t),k=e=>D(e,(e,t)=>e+t,0),x=e=>0==P(e),D=(e,t,n)=>e.reduce(t,n),j=(e,...t)=>e.push(...t),z=e=>t=>D(B(t),(t,n)=>t+e(n),0),A=e=>e?.size??0,F=z(A),O=z(F),W=(e,t)=>e?.has(t)??!1,q=e=>p(e)||0==A(e),B=e=>[...e?.values()??[]],G=e=>e.clear(),H=(e,t)=>e?.forEach(t),J=(e,t)=>e?.delete(t),K=Object,N=e=>K.getPrototypeOf(e),U=K.entries,X=e=>!R(e)&&T(N(e),e=>e==K.prototype||R(N(e)),()=>!0),Y=K.keys,Z=K.freeze,$=(e,t)=>b(e,e=>e[t]),_=(e,t,n=(e,t)=>e===t)=>{const r=U(e);return P(r)===P(Y(t))&&I(r,([e,r])=>X(r)?!!X(t[e])&&_(t[e],r):n(r,t[e]))},ee=Map,te=e=>new ee(e),ne=(e,t)=>e?.get(t),re=(e,t)=>H(e,(e,n)=>t(n,e)),se=(e,t,n)=>p(n)?(J(e,t),e):e?.set(t,n),ae=(e,t,n,r)=>(W(e,t)?r?.(ne(e,t)):se(e,t,n()),ne(e,t)),oe=(e,t,n,r)=>{const s={};return H(e,(e,t)=>{{const n=e;s[t]=n}}),s},ie=(e,t,n,r,s=0)=>b((n?ae:ne)(e,t[s],s>P(t)-2?n:te),a=>{if(s>P(t)-2)return r?.(a)&&se(e,t[s]),a;const o=ie(a,t,n,r,s+1);return q(a)&&se(e,t[s]),o}),de=te([["avg",[(e,t)=>k(e)/t,(e,t,n)=>e+(t-e)/(n+1),(e,t,n)=>e+(e-t)/(n-1),(e,t,n,r)=>e+(t-n)/r]],["max",[e=>f(...e),(e,t)=>f(t,e),(e,t)=>t==e?void 0:e,(e,t,n)=>n==e?void 0:f(t,e)]],["min",[e=>m(...e),(e,t)=>m(t,e),(e,t)=>t==e?void 0:e,(e,t,n)=>n==e?void 0:m(t,e)]],["sum",[e=>k(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,n)=>e-n+t]]]),le=e=>new Set(V(e)||p(e)?e:[e]),ce=(e,t)=>e?.add(t),ue=(()=>{const s=new WeakMap;return i=>(s.has(i)||s.set(i,(s=>{const i=s.createStore,h=i(),w=i(),f=te(),m=te(),R=te(),{addListener:T,callListeners:k,delListener:D}=w,[z,N,X,ee,ue,ve,ge,Le,,he,we,fe,me,ye]=((e,t,n,r,s)=>{const a=e.hasRow,o=te(),i=te(),d=te(),l=te(),c=te(),u=te(),v=(t,n,...r)=>{const s=ae(u,t,le);return M(r,t=>ce(s,t)&&n&&e.callListener(t)),r},g=(t,...n)=>b(ne(u,t),r=>{M(x(n)?B(r):n,t=>{e.delListener(t),J(r,t)}),q(r)&&se(u,t)}),L=(e,t)=>{se(o,e,t),W(i,e)||(se(i,e,[]),se(l,e,te()),se(c,e,te()),s(d))},h=e=>{se(o,e),se(i,e),se(l,e),se(c,e),g(e),s(d)};return[()=>e,()=>{return e=o,[...e?.keys()??[]];var e},e=>re(i,e),e=>W(i,e),e=>ne(o,e),e=>ne(i,e),(e,t)=>se(i,e,t),L,(t,r,s,o,i)=>{L(t,r);const d=te(),u=te(),h=ne(l,t),w=ne(c,t),f=t=>{const s=n=>e.getCell(r,t,n),l=ne(h,t),c=a(r,t)?n(o(s,t)):void 0;if(l===c||V(l)&&V(c)&&Q(l,c)||se(d,t,[l,c]),!p(i)){const e=ne(w,t),n=a(r,t)?i(s,t):void 0;e!=n&&se(u,t,n)}},m=e=>{s(()=>{H(d,([,e],t)=>se(h,t,e)),H(u,(e,t)=>se(w,t,e))},d,u,h,w,e),G(d),G(u)};re(h,f),e.hasTable(r)&&M(e.getRowIds(r),e=>{W(h,e)||f(e)}),m(!0),g(t),v(t,0,e.addRowListener(r,null,(e,t,n)=>f(n)),e.addTableListener(r,()=>m()))},h,e=>r(e,d),()=>re(u,h),v,g]})(s,0,S,T,k),Re=(e,t,...n)=>M(n,n=>ce(ae(ae(f,t,te),e,le),n)),pe=e=>{b(ne(f,e),e=>{re(e,(e,t)=>H(t,t=>e.delListener(t))),G(e)}),M([w,h],t=>t.delTable(e))},Te=(e,t,n)=>Re(t,e,t.addStartTransactionListener(n.startTransaction),t.addDidFinishTransactionListener(()=>n.finishTransaction())),be=(a,o,i,d={})=>{const l=Pe(a);var c;Le(a,o),ge(a,[i,(c=d,new Map(U(c)))]),Ce(a,l,d),pe(a);const[,u]=ve(a),v=[],g=[[void 0,[o,void 0,void 0,[],te()]]],L=[],f=[],m=[];i({select:(e,t)=>{const n=C(e)?[P(v)+"",e]:[p(t)?e:t,n=>n(e,t)];return j(v,n),{as:e=>n[0]=e}},join:(e,t,n)=>{const r=p(n)||C(t)?void 0:t,s=p(r)?t:n,a=[e,[e,r,C(s)?s:e=>e(s),[],te()]];return j(g,a),{as:e=>a[0]=e}},where:(e,t,n)=>j(L,C(e)?e:p(n)?n=>n(e)===t:r=>r(e,t)===n),group:(e,t,n,r,s)=>{const a=[e,[e,C(t)?[t,n,r,s]:ne(de,t)??[(e,t)=>t]]];return j(f,a),{as:e=>a[0]=e}},having:(e,t)=>j(m,C(e)?e:n=>n(e)===t),param:e=>ne(u,e)});const R=te(v);if(q(R))return Ie;const T=te(g);re(T,(e,[,t])=>b(ne(T,t),({3:t})=>p(e)?0:j(t,e)));const V=te(f);let S=h;if(q(V)&&x(m))S=w;else{Te(a,S,w);const s=te();re(V,(e,[t,n])=>ce(ae(s,t,le),[e,n]));const o=le();re(R,e=>W(s,e)?0:ce(o,e));const i=te(),d=(o,i,d,l)=>b(o,([c,u,v,g])=>{re(i,(a,[o])=>{const i=ae(c,a,te),u=ne(i,d),v=l?void 0:o;if(u!==v){const o=le([[u,v]]),l=A(i);se(i,d,v),H(ne(s,a),([s,a])=>{const d=((e,t,n,r,s,a=!1)=>{if(q(n))return;const[o,i,d,l]=s;return a||=p(e),H(r,([n,r])=>{a||(e=p(n)?i?.(e,r,t++):p(r)?d?.(e,n,t--):l?.(e,r,n,t),a||=p(e))}),a?o(B(n),A(n)):e})(g[s],l,i,o,a);g[s]=p((s=>{if(null===s)return"null";const a=e(s);return(e=>e==t||e==n)(a)||a==r&&y(s)?a:void 0})(d))?void 0:d})}}),q(u)||!I(m,e=>e(e=>g[e]))?w.delRow(a,v):p(v)?o[2]=w.addRow(a,g):w.setRow(a,v,g)});Re(S,a,S.addRowListener(a,null,(e,t,n,r)=>{const l=[],c=[],u=te(),v=S.hasRow(a,n);let g=!v;H(o,e=>{const[t,s,o]=r(a,n,e);j(l,s),j(c,o),g||=t}),re(s,e=>{const[t,,s]=r(a,n,e);(g||t)&&se(u,e,[s])}),g&&d(ie(i,l,void 0,([,e])=>(J(e,n),q(e))),u,n,1),v&&d(ie(i,c,()=>{const e={};return H(o,t=>e[t]=S.getCell(a,n,t)),[te(),le(),void 0,e]},([,e])=>{ce(e,n)}),u,n)}))}Te(a,s,S);const Q=(e,t,n,r)=>{const i=e=>s.getCell(t,n,e);M(r,t=>{const[n,,r,o,d]=ne(T,t),l=r?.(i,e),[c,u]=ne(d,e)??[];l!=c&&(p(u)||ye(a,u),se(d,e,p(l)?void 0:[l,...me(a,1,s.addRowListener(n,l,()=>Q(e,n,l,o)))]))}),(e=>{const t=(t,n)=>s.getCell(...p(n)?[o,e,t]:t===o?[o,e,n]:[ne(T,t)?.[0],ne(ne(T,t)?.[4],e)?.[0],n]);S.transaction(()=>I(L,e=>e(t))?re(R,(n,r)=>((e,t,n,r,s)=>p(s)?e.delCell(t,n,r,!0):e.setCell(t,n,r,s))(S,a,e,n,r(t,e))):S.delRow(a,e))})(e)},{3:E}=ne(T,void 0);return S.transaction(()=>me(a,1,s.addRowListener(o,null,(e,t,n)=>{s.hasRow(o,n)?Q(n,o,n,E):(S.delRow(a,n),H(T,({4:e})=>b(ne(e,n),([,t])=>{ye(a,t),se(e,n)})))}))),Ie},Ce=(e,t,n)=>{const r=le([...Y(t),...Y(n)]);let s=0;H(r,r=>{const a=$(n,r);E($(t,r),a)||(s=1,k(R,[e,r],a))}),s&&k(m,[e],n)},Ve=(e,t,n=0)=>(b(ve(e),([r,s])=>{!n&&_(oe(s),t,E)||w.transaction(()=>be(e,ue(e),r,t))}),Ie),Pe=e=>oe(ve(e)?.[1]),Se=(e,t)=>ne(ve(e)?.[1],t),Ie={setQueryDefinition:be,delQueryDefinition:e=>{const t=Pe(e);return pe(e),he(e),Ce(e,t,{}),Ie},getParamValues:Pe,getParamValue:Se,setParamValues:Ve,setParamValue:(e,t,n)=>(E(Se(e,t),n)||Ve(e,{...Pe(e),[t]:n},1),Ie),getStore:z,getQueryIds:N,forEachQuery:X,hasQuery:ee,getTableId:ue,addQueryIdsListener:e=>we(()=>e(Ie)),addParamValuesListener:(e,t)=>T((e,n,r)=>t(Ie,n,r),m,[e]),addParamValueListener:(e,t,n)=>T((e,t,r,s)=>n(Ie,t,r,s),R,[e,t]),delListener:e=>(D(e),Ie),destroy:fe,getListenerStats:()=>{const{tables:e,tableIds:t,transaction:n,...r}=w.getListenerStats();return{...r,paramValues:F(m),paramValue:O(R)}}};return Qe=([e,t],n)=>{M(e?["get","has","forEach"]:["get"],e=>Ie[e+o+n]=(...t)=>w[e+n](...t)),Ie["add"+o+n+a]=(...e)=>{return w["add"+n+a](...(r=e,s=t,r.slice(0,s)),(n,...r)=>e[t](Ie,...r),!0);var r,s}},((e=[])=>{K.fromEntries(e)})(((e,t)=>((e,t)=>e.map(t))(U(e),([e,n])=>t(n,e)))({[d]:[1,1],[d+L]:[0,1],[c]:[0,1],[u]:[0,1],[v]:[0,5],[l]:[1,2],[L]:[0,2],[g]:[1,3]},(e,t)=>[t,Qe(e,t)])),Z(Ie);var Qe})(i)),s.get(i))})();export{ue as createQueries};