tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 3.94 kB
JavaScript
const e=e=>typeof e,t="",n=e(t),s=e=>t+e,r=e=>null==e,o=(e,t,n)=>r(e)?n?.():t(e),d=e=>Array.isArray(e),c=e=>e.length,l=(e,t)=>e.every(t),a=(e,t)=>l(e,((n,s)=>0==s||t(e[s-1],n)<=0)),i=(e,t)=>e.sort(t),u=(e,t)=>e.forEach(t),I=(e,...t)=>e.push(...t),h=e=>t=>{return n=(t,n)=>t+e(n),S(t).reduce(n,0);var n},f=e=>e?.size??0,g=h(f),v=h(g),w=(e,t)=>e?.has(t)??!1,L=e=>r(e)||0==f(e),S=e=>[...e?.values()??[]],x=e=>e.clear(),p=(e,t)=>e?.forEach(t),y=(e,t)=>e?.delete(t),R=Object.freeze,E=e=>new Map(e),b=e=>[...e?.keys()??[]],T=(e,t)=>e?.get(t),k=(e,t)=>p(e,((e,n)=>t(n,e))),z=(e,t,n)=>r(n)?(y(e,t),e):e?.set(t,n),A=(e,t,n,s)=>(w(e,t)?s?.(T(e,t)):z(e,t,n()),T(e,t)),C=(e,t,n,s,r=0)=>o((n?A:T)(e,t[r],r>c(t)-2?n:E),(o=>{if(r>c(t)-2)return s?.(o)&&z(e,t[r]),o;const d=C(o,t,n,s,r+1);return L(o)&&z(e,t[r]),d})),D=e=>new Set(d(e)||r(e)?e:[e]),M=(e,t)=>e?.add(t),j=(s,r)=>e(s)==n?e=>e(s):s??(()=>r??t),m=(e,t)=>(e??0)<(t??0)?-1:1,O=/^\d+$/,W=(()=>{const e=new WeakMap;return n=>(e.has(n)||e.set(n,(e=>{const n=E(),h=E(),[f,W,$]=(()=>{let e;const[n,s]=(()=>{const e=[];let n=0;return[s=>(s?e.shift():null)??t+n++,t=>{O.test(t)&&c(e)<1e3&&I(e,t)}]})(),d=E();return[(s,r,o,c=[],l=()=>[])=>{e??=X;const a=n(1);return z(d,a,[s,r,o,c,l]),M(C(r,o??[t],D),a),a},(n,s,...r)=>u(((e,n=[t])=>{const s=[],r=(e,t)=>t==c(n)?I(s,e):null===n[t]?p(e,(e=>r(e,t+1))):u([n[t],null],(n=>r(T(e,n),t+1)));return r(e,0),s})(n,s),(t=>p(t,(t=>T(d,t)[0](e,...s??[],...r))))),e=>o(T(d,e),(([,n,r])=>(C(n,r??[t],void 0,(t=>(y(t,e),L(t)?1:0))),z(d,e),s(e),r))),t=>o(T(d,t),(([t,,n=[],s,o])=>{const d=(...l)=>{const a=c(l);a==c(n)?t(e,...l,...o(l)):r(n[a])?u(s[a]?.(...l)??[],(e=>d(...l,e))):d(...l,n[a])};d()}))]})(),[q,B,F,G,H,J,K,,N,P,Q,U]=((e,t,n,s,a)=>{const i=e.hasRow,I=E(),h=E(),f=E(),g=E(),v=E(),R=E(),C=(t,n,...s)=>{const r=A(R,t,D);return u(s,(t=>M(r,t)&&n&&e.callListener(t))),s},j=(t,...n)=>o(T(R,t),(s=>{u(0==c(n)?S(s):n,(t=>{e.delListener(t),y(s,t)})),L(s)&&z(R,t)})),m=(e,n)=>{z(I,e,n),w(h,e)||(z(h,e,t()),z(g,e,E()),z(v,e,E()),a(f))},O=e=>{z(I,e),z(h,e),z(g,e),z(v,e),j(e),a(f)};return[()=>e,()=>b(I),e=>k(h,e),e=>w(h,e),e=>T(I,e),e=>T(h,e),(e,t)=>z(h,e,t),m,(t,s,o,a,I)=>{m(t,s);const h=E(),f=E(),L=T(g,t),S=T(v,t),y=t=>{const o=n=>e.getCell(s,t,n),u=T(L,t),g=i(s,t)?n(a(o,t)):void 0;var v,w;if(u===g||d(u)&&d(g)&&(w=g,c(v=u)===c(w)&&l(v,((e,t)=>w[t]===e)))||z(h,t,[u,g]),!r(I)){const e=T(S,t),n=i(s,t)?I(o,t):void 0;e!=n&&z(f,t,n)}},R=e=>{o((()=>{p(h,(([,e],t)=>z(L,t,e))),p(f,((e,t)=>z(S,t,e)))}),h,f,L,S,e),x(h),x(f)};k(L,y),e.hasTable(s)&&u(e.getRowIds(s),(e=>{w(L,e)||y(e)})),R(!0),j(t),C(t,0,e.addRowListener(s,null,((e,t,n)=>y(n))),e.addTableListener(s,(()=>R())))},O,e=>s(e,f),()=>k(R,O),C,j]})(e,E,(e=>{return r(e)?t:d(e)?(n=s,e.map(n)):s(e);var n}),f,W),V=(t,n,s)=>{const r=H(t);p(s,((t,s)=>n(s,(n=>p(t,(t=>n(t,(n=>e.forEachCell(r,t,n)))))))))},X={setIndexDefinition:(e,t,s,d,c,l=m)=>{const u=r(c)?void 0:([e],[t])=>c(e,t);return N(e,t,((t,s,c,I,f,g)=>{let v=0;const S=D(),x=D(),R=J(e);if(p(s,(([e,t],n)=>{const s=D(e),c=D(t);p(s,(e=>y(c,e)?y(s,e):0)),p(s,(e=>{M(S,e),o(T(R,e),(t=>{y(t,n),L(t)&&(z(R,e),v=1)}))})),p(c,(e=>{M(S,e),w(R,e)||(z(R,e,D()),v=1),M(T(R,e),n),r(d)||M(x,e)}))})),t(),L(f)||(g?k(R,(e=>M(x,e))):k(c,(e=>o(T(I,e),(e=>M(x,e))))),p(x,(e=>{const t=(t,n)=>l(T(f,t),T(f,n),e),n=[...T(R,e)];a(n,t)||(z(R,e,D(i(n,t))),M(S,e))}))),(v||g)&&!r(u)){const t=[...R];a(t,u)||(K(e,E(i(t,u))),v=1)}v&&W(n,[e]),p(S,(t=>W(h,[e,t])))}),j(s),o(d,j)),X},delIndexDefinition:e=>(P(e),X),getStore:q,getIndexIds:B,forEachIndex:e=>F(((t,n)=>e(t,(e=>V(t,e,n))))),forEachSlice:(e,t)=>V(e,t,J(e)),hasIndex:G,hasSlice:(e,t)=>w(J(e),t),getTableId:H,getSliceIds:e=>b(J(e)),getSliceRowIds:(e,t)=>S(T(J(e),t)),addIndexIdsListener:Q,addSliceIdsListener:(e,t)=>f(t,n,[e]),addSliceRowIdsListener:(e,t,n)=>f(n,h,[e,t]),delListener:e=>($(e),X),destroy:U,getListenerStats:()=>({sliceIds:g(n),sliceRowIds:v(h)})};return R(X)})(n)),e.get(n))})();export{W as createIndexes};