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