Skip to content

Instantly share code, notes, and snippets.

@kevinfiol
Last active September 22, 2022 02:10
Show Gist options
  • Save kevinfiol/72414a6c12fff573440e40ecc9e48994 to your computer and use it in GitHub Desktop.
Save kevinfiol/72414a6c12fff573440e40ecc9e48994 to your computer and use it in GitHub Desktop.
lru cache
function Cache(max, ttl) {
let items = {},
size = 0,
first = undefined,
last = undefined;
return $ = {
has(key) {
return key in items;
},
clear() {
first = last = undefined;
size = 0;
items = {};
},
evict() {
if (size > 0) {
let item = last;
delete items[item.key];
size--;
if (size === 0) first = last = undefined;
else {
last = item.prev;
last.next = undefined;
}
}
},
delete(key) {
let item;
if (item = items[key]) {
delete items[key];
size--;
if (item.next) item.next.prev = item.prev;
if (item.prev) item.prev.next = item.next
if (item === first) first = item.next;
if (item === last) last = item.prev;
}
},
get(key) {
let item, value;
if (item = items[key]) {
if (ttl > 0 && item.expire <= new Date().getTime()) $.delete(key);
else {
value = item.value;
$.set(key, value); // move item to front of list
}
}
return value;
},
set(key, value) {
let item = items[key];
if (item) {
if (item !== first) {
let n = item.next,
p = item.prev;
if (item === last) last = item.prev;
item.prev = undefined;
item.next = first;
first.prev = item;
if (p) p.next = n;
if (n) n.prev = p;
}
} else {
if (size === max) $.evict();
item = items[key] = {
expire: ttl > 0 ? new Date().getTime() + ttl : ttl,
key,
prev: undefined,
next: first,
value
};
if (++size === 1) last = item;
else first.prev = item;
}
first = item;
}
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment