UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 5.66 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};