tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 3.7 kB
JavaScript
const e=e=>typeof e,t="",r=e(t),n=e(e),s=Math,i=s.max,o=s.min,c=isFinite,a=e=>void 0===e,d=e=>null===e,l=(u=a,(e,t,r)=>u(e)?r?.():t(e));var u;const v=e=>Array.isArray(e),h=e=>e.length,f=()=>{},g=(e,t)=>e.forEach(t),M=e=>L(e,(e,t)=>e+t,0),L=(e,t,r)=>e.reduce(t,r),m=(e,...t)=>e.push(...t),w=e=>e?.size??0,y=(p=w,e=>L(x(e),(e,t)=>e+p(t),0));var p;const b=(e,t)=>e?.has(t)??!1,I=e=>a(e)||0==w(e),x=e=>[...e?.values()??[]],E=e=>e.clear(),R=(e,t)=>e?.forEach(t),S=(e,t)=>e?.delete(t),T=Object.freeze,k=e=>new Map(e),z=(e,t)=>e?.get(t),A=(e,t)=>R(e,(e,r)=>t(r,e)),D=(e,t,r)=>a(r)?(S(e,t),e):e?.set(t,r),N=(e,t,r,n)=>(b(e,t)?n?.(z(e,t)):D(e,t,r()),z(e,t)),j=(e,t,r,n,s=0)=>l((r?N:z)(e,t[s],s>h(t)-2?r:k),i=>{if(s>h(t)-2)return n?.(i)&&D(e,t[s]),i;const o=j(i,t,r,n,s+1);return I(i)&&D(e,t[s]),o}),C=k([["avg",[(e,t)=>M(e)/t,(e,t,r)=>e+(t-e)/(r+1),(e,t,r)=>e+(e-t)/(r-1),(e,t,r,n)=>e+(t-r)/n]],["max",[e=>i(...e),(e,t)=>i(t,e),(e,t)=>t==e?void 0:e,(e,t,r)=>r==e?void 0:i(t,e)]],["min",[e=>o(...e),(e,t)=>o(t,e),(e,t)=>t==e?void 0:e,(e,t,r)=>r==e?void 0:o(t,e)]],["sum",[e=>M(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,r)=>e-r+t]]]),F=e=>new Set(v(e)||a(e)?e:[e]),O=(e,t)=>e?.add(t),W=/^\d+$/,$=(()=>{const s=new WeakMap;return i=>(s.has(i)||s.set(i,(s=>{const i=k(),[o,u,M]=(()=>{let e;const[r,n]=(()=>{const e=[];let r=0;return[n=>(n?e.shift():null)??t+r++,t=>{W.test(t)&&h(e)<1e3&&m(e,t)}]})(),s=k();return[(n,i,o,c=[],a=()=>[])=>{e??=U;const d=r(1);return D(s,d,[n,i,o,c,a]),O(j(i,o??[t],F),d),d},(r,n,...i)=>g(((e,r=[t])=>{const n=[],s=(e,t)=>t==h(r)?m(n,e):d(r[t])?R(e,e=>s(e,t+1)):g([r[t],null],r=>s(z(e,r),t+1));return s(e,0),n})(r,n),t=>R(t,t=>z(s,t)[0](e,...n??[],...i))),e=>l(z(s,e),([,r,i])=>(j(r,i??[t],void 0,t=>(S(t,e),I(t)?1:0)),D(s,e),n(e),i)),t=>l(z(s,t),([t,,r=[],n,s])=>{const i=(...o)=>{const c=h(o);c==h(r)?t(e,...o,...s(o)):d(r[c])?g(n[c]?.(...o)??[],e=>i(...o,e)):i(...o,r[c])};i()})]})(),[L,p,$,q,B,G,H,,J,K,P,Q]=((e,r,n,s,i)=>{const o=e.hasRow,c=k(),d=k(),u=k(),f=k(),M=k(),L=k(),m=(t,r,...n)=>{const s=N(L,t,F);return g(n,t=>O(s,t)&&r&&e.callListener(t)),n},w=(t,...r)=>l(z(L,t),n=>{g(0==h(r)?x(n):r,t=>{e.delListener(t),S(n,t)}),I(n)&&D(L,t)}),y=(e,t)=>{D(c,e,t),b(d,e)||(D(d,e,r()),D(f,e,k()),D(M,e,k()),i(u))},p=e=>{D(c,e),D(d,e),D(f,e),D(M,e),w(e),i(u)};return[()=>e,()=>{return e=c,[...e?.keys()??[]];var e},e=>A(d,e),e=>b(d,e),e=>z(c,e),e=>z(d,e),(e,t)=>D(d,e,t),y,(r,n,s,i,c)=>{y(r,n);const d=k(),l=k(),u=z(f,r),L=z(M,r),p=r=>{const s=t=>e.getCell(n,r,t),f=z(u,r),g=o(n,r)?(M=i(s,r),isNaN(M)||a(M)||!0===M||!1===M||M===t?void 0:1*M):void 0;var M,m,w,y;if(f===g||v(f)&&v(g)&&(w=g,h(m=f)===h(w)&&(y=(e,t)=>w[t]===e,m.every(y)))||D(d,r,[f,g]),!a(c)){const e=z(L,r),t=o(n,r)?c(s,r):void 0;e!=t&&D(l,r,t)}},I=e=>{s(()=>{R(d,([,e],t)=>D(u,t,e)),R(l,(e,t)=>D(L,t,e))},d,l,u,L,e),E(d),E(l)};A(u,p),e.hasTable(n)&&g(e.getRowIds(n),e=>{b(u,e)||p(e)}),I(!0),w(r),m(r,0,e.addRowListener(n,null,(e,t,r)=>p(r)),e.addTableListener(n,()=>I()))},p,e=>s(e,u),()=>A(L,p),m,w]})(s,f,0,o,u),U={setMetricDefinition:(t,s,o,d,l,v,h)=>{const f=e(o)==n?[o,l,v,h]:z(C,o)??z(C,"sum");return J(t,s,(e,r,n,s,o,d)=>{const l=G(t),v=w(s);d||=a(l),e();let h=((e,t,r,n,s,i=!1)=>{if(I(r))return;const[o,c,d,l]=s;return i||=a(e),R(n,([r,n])=>{i||(e=a(r)?c?.(e,n,t++):a(n)?d?.(e,r,t--):l?.(e,n,r,t),i||=a(e))}),i?o(x(r),w(r)):e})(l,v,s,r,f,d);c(h)||(h=void 0),h!=l&&(H(t,h),u(i,[t],h,l))},e(g=d)==r?e=>e(g):g??(()=>1)),U;var g},delMetricDefinition:e=>(K(e),U),getStore:L,getMetricIds:p,forEachMetric:$,hasMetric:q,getTableId:B,getMetric:G,addMetricIdsListener:P,addMetricListener:(e,t)=>o(t,i,[e]),delListener:e=>(M(e),U),destroy:Q,getListenerStats:()=>({metric:y(i)})};return T(U)})(i)),s.get(i))})();export{$ as createMetrics};