1 line
2.3 KiB
JavaScript
1 line
2.3 KiB
JavaScript
"use strict";window.createLRU=function(r){var e=r.max;if(!(Number.isInteger(e)&&e>0))throw new TypeError("`max` must be a positive integer");var n=0,i=0,t=0,a=[],o=r.onEviction,l=new Map,f=new Array(e).fill(void 0),u=new Array(e).fill(void 0),v=new Array(e).fill(0),s=new Array(e).fill(0),p=function(r,e){if(r!==t){var n=v[r],a=s[r];r===i?i=n:("get"===e||0!==a)&&(v[a]=n),0!==n&&(s[n]=a),v[t]=r,s[r]=t,v[r]=0,t=r}},c=function(){var r=i,e=f[r];return null==o||o(e,u[r]),l.delete(e),f[r]=void 0,u[r]=void 0,0!==(i=v[r])&&(s[i]=0),0===--n&&(i=t=0),a.push(r),r};return{set:function(r,v){if(void 0!==r){var s=l.get(r);void 0===s?(s=n===e?c():a.length>0?a.pop():n,l.set(r,s),f[s]=r,n++):null==o||o(r,u[s]),u[s]=v,1===n?i=t=s:p(s,"set")}},get:function(r){var e=l.get(r);if(void 0!==e)return e!==t&&p(e,"get"),u[e]},peek:function(r){var e=l.get(r);return void 0!==e?u[e]:void 0},has:function(r){return l.has(r)},keys:function*(){for(var r=t,e=0;e<n;e++)yield f[r],r=s[r]},values:function*(){for(var r=t,e=0;e<n;e++)yield u[r],r=s[r]},entries:function*(){for(var r=t,e=0;e<n;e++)yield[f[r],u[r]],r=s[r]},forEach:function(r){for(var e=t,i=0;i<n;i++){var a=f[e];r(u[e],a),e=s[e]}},delete:function(r){var e=l.get(r);if(void 0===e)return!1;null==o||o(r,u[e]),l.delete(r),a.push(e),f[e]=void 0,u[e]=void 0;var p=s[e],c=v[e];return 0!==p&&(v[p]=c),0!==c&&(s[c]=p),e===i&&(i=c),e===t&&(t=p),n--,!0},evict:function(r){for(var e=Math.min(r,n);e>0;)c(),e--},clear:function(){if("function"==typeof o)for(var r=i,e=0;e<n;e++)o(f[r],u[r]),r=v[r];l.clear(),f.fill(void 0),u.fill(void 0),a=[],n=0,i=t=0},resize:function(r){if(!(Number.isInteger(r)&&r>0))throw new TypeError("`max` must be a positive integer");if(r!==e){if(r<e){for(var p=t,c=Math.min(n,r),d=n-c,y=new Array(r),g=new Array(r),h=new Array(r),w=new Array(r),A=1;A<=d;A++)null==o||o(f[A],u[A]);for(var m=c-1;m>=0;m--)y[m]=f[p],g[m]=u[p],h[m]=m+1,w[m]=m-1,l.set(y[m],m),p=s[p];i=0,t=c-1,n=c,f.length=r,u.length=r,v.length=r,s.length=r;for(var b=0;b<c;b++)f[b]=y[b],u[b]=g[b],v[b]=h[b],s[b]=w[b];a=[];for(var x=c;x<r;x++)a.push(x)}else{var E=r-e;f.push.apply(f,new Array(E).fill(void 0)),u.push.apply(u,new Array(E).fill(void 0)),v.push.apply(v,new Array(E).fill(0)),s.push.apply(s,new Array(E).fill(0))}e=r}},get max(){return e},get size(){return n},get available(){return e-n}}}; |