UNPKG

tinybase

Version:

A reactive data store and sync engine.

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