Created
July 22, 2025 21:30
-
-
Save Sheraff/40b0e1a79b4a4ac47c7efc039d2cf8bb to your computer and use it in GitHub Desktop.
Fast LRU cache
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| export type LRUCache<K, V> = { | |
| get: (key: K) => V | undefined | |
| set: (key: K, value: V) => void | |
| } | |
| export function createLRUCache<K, V>(max: number): LRUCache<K, V> { | |
| type Node = { prev?: Node; next?: Node; key: K, value: V } | |
| const cache = new Map<K, Node>() | |
| let oldest: Node | undefined | |
| let newest: Node | undefined | |
| const touch = (entry: Node) => { | |
| if (!entry.next) return | |
| if (!entry.prev) { | |
| entry.next.prev = undefined | |
| oldest = entry.next | |
| entry.next = undefined | |
| if (newest) { | |
| entry.prev = newest | |
| newest.next = entry | |
| } | |
| } else { | |
| entry.prev.next = entry.next | |
| entry.next.prev = entry.prev | |
| entry.next = undefined | |
| if (newest) { | |
| newest.next = entry | |
| entry.prev = newest | |
| } | |
| } | |
| newest = entry | |
| } | |
| return { | |
| get(key) { | |
| const entry = cache.get(key) | |
| if (!entry) return undefined | |
| touch(entry) | |
| return entry.value | |
| }, | |
| set(key, value) { | |
| if (cache.size >= max && oldest) { | |
| const toDelete = oldest | |
| cache.delete(toDelete.key) | |
| if (toDelete.next) { | |
| oldest = toDelete.next | |
| toDelete.next.prev = undefined | |
| } | |
| if (toDelete === newest) { | |
| newest = undefined | |
| } | |
| } | |
| const existing = cache.get(key) | |
| if (existing) { | |
| existing.value = value | |
| touch(existing) | |
| } else { | |
| const entry: Node = { key, value, prev: newest } | |
| if (newest) newest.next = entry | |
| newest = entry | |
| if (!oldest) oldest = entry | |
| cache.set(key, entry) | |
| } | |
| }, | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment