import has from './hasOwnProperty.js'; const DEFAULT_MAX_SIZE = 10000; export interface LRUCache { clear: () => void; has: (key: string) => boolean; get: (key: string) => T | undefined; set: (key: string, value: T) => T; } /** * Adapted from https://github.com/dominictarr/hashlru/ (MIT License) */ export default function(maxsize?: number): LRUCache { maxsize = +maxsize! || DEFAULT_MAX_SIZE; let curr: Record, prev: Record, size: number; const clear = () => { curr = {}; prev = {}; size = 0; }; const update = (key: string, value: T) => { if (++size > maxsize!) { prev = curr; curr = {}; size = 1; } return (curr[key] = value); }; clear(); return { clear, has: (key: string) => has(curr, key) || has(prev, key), get: (key: string) => has(curr, key) ? curr[key] : has(prev, key) ? update(key, prev[key]) : undefined, set: (key: string, value: T) => has(curr, key) ? (curr[key] = value) : update(key, value) }; }