UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 3.33 kB
const e=e=>null==e,t=(t,n,r)=>e(t)?r?.():n(t),n=e=>e.length,r=(e,t)=>e.includes(t),s=(e,t)=>e.forEach(t),o=e=>0==n(e),l=(e,...t)=>e.push(...t),c=e=>e.pop(),i=e=>e.shift(),a=e=>e?.size??0,d=(u=a,e=>{return t=(e,t)=>e+u(t),g(e).reduce(t,0);var t});var u;const h=(e,t)=>e?.has(t)??!1,p=t=>e(t)||0==a(t),g=e=>[...e?.values()??[]],k=(e,t)=>e?.forEach(t),C=(e,t)=>e?.delete(t),f=Object.freeze,v=e=>new Map(e),L=(e,t)=>e?.get(t),w=(t,n,r)=>e(r)?(C(t,n),t):t?.set(n,r),S=(e,t,n,r)=>(h(e,t)?r?.(L(e,t)):w(e,t,n()),L(e,t)),y=(e,r,s,o,l=0)=>t((s?S:L)(e,r[l],l>n(r)-2?s:v),(t=>{if(l>n(r)-2)return o?.(t)&&w(e,r[l]),t;const c=y(t,r,s,o,l+1);return p(t)&&w(e,r[l]),c})),z=t=>new Set(Array.isArray(t)||e(t)?t:[t]),E=/^\d+$/,I=(()=>{const a=new WeakMap;return u=>{a.has(u)||a.set(u,(a=>{let u,g,I,V=100,A=v(),F=v(),M=1;const _=v(),b=v(),[j,x,B]=(()=>{let r;const[o,c]=(()=>{const e=[];let t=0;return[n=>(n?i(e):null)??""+t++,t=>{E.test(t)&&n(e)<1e3&&l(e,t)}]})(),a=v();return[(e,t,n,s=[],l=()=>[])=>{r??=ee;const c=o(1);var i,d;return w(a,c,[e,t,n,s,l]),i=y(t,n??[""],z),d=c,i?.add(d),c},(e,t,...o)=>s(((e,t=[""])=>{const r=[],o=(e,c)=>c==n(t)?l(r,e):null===t[c]?k(e,(e=>o(e,c+1))):s([t[c],null],(t=>o(L(e,t),c+1)));return o(e,0),r})(e,t),(e=>k(e,(e=>L(a,e)[0](r,...t??[],...o))))),e=>t(L(a,e),(([,t,n])=>(y(t,n??[""],void 0,(t=>(C(t,e),p(t)?1:0))),w(a,e),c(e),n))),o=>t(L(a,o),(([t,,o=[],l,c])=>{const i=(...a)=>{const d=n(a);d==n(o)?t(r,...a,...c(a)):e(o[d])?s(l[d]?.(...a)??[],(e=>i(...a,e))):i(...a,o[d])};i()}))]})(),O=v(),T=v(),W=[],$=[],m=(t,n)=>{M=0,a.transaction((()=>{const[r,s]=L(O,n);k(r,((n,r)=>k(n,((n,s)=>k(n,((n,o)=>((t,n,r,s,o)=>e(o)?t.delCell(n,r,s,!0):t.setCell(n,r,s,o))(a,r,s,o,n[t]))))))),k(s,((n,r)=>((t,n,r)=>e(r)?t.delValue(n):t.setValue(n,r))(a,r,n[t])))})),M=1},q=e=>{w(O,e),w(T,e),x(b,[e])},D=(e,t)=>s(((e,t)=>e.splice(0,t))(e,t??n(e)),q),G=()=>D(W,n(W)-V),H=()=>t(u,(()=>{l(W,u),G(),D($),u=void 0,I=1})),J=()=>{u=c(W),I=1};let K,N;const P=(t="")=>(e(u)&&(u=""+g++,w(O,u,[A,F]),Y(u,t),A=v(),F=v(),I=1),u),Q=()=>{o(W)||(((e,...t)=>{e.unshift(...t)})($,P()),m(0,u),u=c(W),I=1)},R=()=>{o($)||(l(W,u),u=i($),m(1,u),I=1)},U=()=>{I&&(x(_),I=0)},X=e=>{const t=P(e);return U(),t},Y=(e,t)=>(Z(e)&&L(T,e)!==t&&(w(T,e,t),x(b,[e])),ee),Z=e=>h(O,e),ee={setSize:e=>(V=e,G(),ee),addCheckpoint:X,setCheckpoint:Y,getStore:()=>a,getCheckpointIds:()=>[[...W],u,[...$]],forEachCheckpoint:e=>{return t=e,k(T,((e,n)=>t(n,e)));var t},hasCheckpoint:Z,getCheckpoint:e=>L(T,e),goBackward:()=>(Q(),U(),ee),goForward:()=>(R(),U(),ee),goTo:t=>{const n=r(W,t)?Q:r($,t)?R:null;for(;!e(n)&&t!=u;)n();return U(),ee},addCheckpointIdsListener:e=>j(e,_),addCheckpointListener:(e,t)=>j(t,b,[e]),delListener:e=>(B(e),ee),clear:()=>(D(W),D($),e(u)||q(u),u=void 0,g=0,X(),ee),clearForward:()=>(o($)||(D($),x(_)),ee),destroy:()=>{a.delListener(K),a.delListener(N)},getListenerStats:()=>({checkpointIds:d(_),checkpoint:d(b)}),_registerListeners:()=>{K=a.addCellListener(null,null,null,((e,t,n,r,s,o)=>{if(M){H();const e=S(A,t,v),l=S(e,n,v),c=S(l,r,(()=>[o,void 0]));c[1]=s,c[0]===s&&p(w(l,r))&&p(w(e,n))&&p(w(A,t))&&J(),U()}})),N=a.addValueListener(null,((e,t,n,r)=>{if(M){H();const e=S(F,t,(()=>[r,void 0]));e[1]=n,e[0]===n&&p(w(F,t))&&J(),U()}}))}};return f(ee.clear())})(u));const g=a.get(u);return g._registerListeners(),g}})();export{I as createCheckpoints};