/* exported createCache */
'use strict';
// create a FIFO limit-size map.
function createCache({size = 1000, onDeleted} = {}) {
const map = new Map();
const buffer = Array(size);
let index = 0;
let lastIndex = 0;
return {
get,
set,
delete: delete_,
clear,
has: id => map.has(id),
entries: function *() {
for (const [id, item] of map) {
yield [id, item.data];
}
},
values: function *() {
for (const item of map.values()) {
yield item.data;
get size() {
return map.size;
};
function get(id) {
const item = map.get(id);
return item && item.data;
function set(id, data) {
if (map.size === size) {
// full
map.delete(buffer[lastIndex].id);
if (onDeleted) {
onDeleted(buffer[lastIndex].id, buffer[lastIndex].data);
lastIndex = (lastIndex + 1) % size;
const item = {id, data, index};
map.set(id, item);
buffer[index] = item;
index = (index + 1) % size;
function delete_(id) {
if (!item) {
return false;
map.delete(item.id);
const lastItem = buffer[lastIndex];
lastItem.index = item.index;
buffer[item.index] = lastItem;
onDeleted(item.id, item.data);
return true;
function clear() {
map.clear();
index = lastIndex = 0;