tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 6.91 kB
JavaScript
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=e=>new Map(e),te=(e,t)=>e?.get(t),ne=(e,t)=>H(e,(e,n)=>t(n,e)),re=(e,t,n)=>p(n)?(J(e,t),e):e?.set(t,n),se=(e,t,n,r)=>(W(e,t)?r?.(te(e,t)):re(e,t,n()),te(e,t)),ae=(e,t,n,r)=>{const s={};return H(e,(e,t)=>{{const n=e;s[t]=n}}),s},oe=(e,t,n,r,s=0)=>b((n?se:te)(e,t[s],s>P(t)-2?n:ee),a=>{if(s>P(t)-2)return r?.(a)&&re(e,t[s]),a;const o=oe(a,t,n,r,s+1);return q(a)&&re(e,t[s]),o}),ie=ee([["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]]]),de=e=>new Set(V(e)||p(e)?e:[e]),le=(e,t)=>e?.add(t),ce=(()=>{const s=new WeakMap;return i=>(s.has(i)||s.set(i,(s=>{const i=s.createStore,h=i(),w=i(),f=ee(),m=ee(),R=ee(),{addListener:T,callListeners:k,delListener:D}=w,[z,N,X,ce,ue,ve,ge,Le,,he,we,fe,me,ye]=((e,t,n,r,s)=>{const a=e.hasRow,o=ee(),i=ee(),d=ee(),l=ee(),c=ee(),u=ee(),v=(t,n,...r)=>{const s=se(u,t,de);return M(r,t=>le(s,t)&&n&&e.callListener(t)),r},g=(t,...n)=>b(te(u,t),r=>{M(x(n)?B(r):n,t=>{e.delListener(t),J(r,t)}),q(r)&&re(u,t)}),L=(e,t)=>{re(o,e,t),W(i,e)||(re(i,e,[]),re(l,e,ee()),re(c,e,ee()),s(d))},h=e=>{re(o,e),re(i,e),re(l,e),re(c,e),g(e),s(d)};return[()=>e,()=>{return e=o,[...e?.keys()??[]];var e},e=>ne(i,e),e=>W(i,e),e=>te(o,e),e=>te(i,e),(e,t)=>re(i,e,t),L,(t,r,s,o,i)=>{L(t,r);const d=ee(),u=ee(),h=te(l,t),w=te(c,t),f=t=>{const s=n=>e.getCell(r,t,n),l=te(h,t),c=a(r,t)?n(o(s,t)):void 0;if(l===c||V(l)&&V(c)&&Q(l,c)||re(d,t,[l,c]),!p(i)){const e=te(w,t),n=a(r,t)?i(s,t):void 0;e!=n&&re(u,t,n)}},m=e=>{s(()=>{H(d,([,e],t)=>re(h,t,e)),H(u,(e,t)=>re(w,t,e))},d,u,h,w,e),G(d),G(u)};ne(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),()=>ne(u,h),v,g]})(s,0,S,T,k),Re=(e,t,...n)=>M(n,n=>le(se(se(f,t,ee),e,de),n)),pe=e=>{b(te(f,e),e=>{ne(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,[],ee()]]],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),[],ee()]];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]:te(ie,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=>te(u,e)});const R=ee(v);if(q(R))return Ie;const T=ee(g);ne(T,(e,[,t])=>b(te(T,t),({3:t})=>p(e)?0:j(t,e)));const V=ee(f);let S=h;if(q(V)&&x(m))S=w;else{Te(a,S,w);const s=ee();ne(V,(e,[t,n])=>le(se(s,t,de),[e,n]));const o=de();ne(R,e=>W(s,e)?0:le(o,e));const i=ee(),d=(o,i,d,l)=>b(o,([c,u,v,g])=>{ne(i,(a,[o])=>{const i=se(c,a,ee),u=te(i,d),v=l?void 0:o;if(u!==v){const o=de([[u,v]]),l=A(i);re(i,d,v),H(te(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=ee(),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}),ne(s,e=>{const[t,,s]=r(a,n,e);(g||t)&&re(u,e,[s])}),g&&d(oe(i,l,void 0,([,e])=>(J(e,n),q(e))),u,n,1),v&&d(oe(i,c,()=>{const e={};return H(o,t=>e[t]=S.getCell(a,n,t)),[ee(),de(),void 0,e]},([,e])=>{le(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]=te(T,t),l=r?.(i,e),[c,u]=te(d,e)??[];l!=c&&(p(u)||ye(a,u),re(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]:[te(T,t)?.[0],te(te(T,t)?.[4],e)?.[0],n]);S.transaction(()=>I(L,e=>e(t))?ne(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}=te(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(te(e,n),([,t])=>{ye(a,t),re(e,n)})))}))),Ie},Ce=(e,t,n)=>{const r=de([...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&&_(ae(s),t,E)||w.transaction(()=>be(e,ue(e),r,t))}),Ie),Pe=e=>ae(ve(e)?.[1]),Se=(e,t)=>te(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:ce,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{ce as createQueries};