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