Bounded LRU cache built on Nim OrderedTable
Nim
import std/[options, tables]
type LruCache[K, V] = ref object
cap: int
data: OrderedTable[K, V]
proc put[K, V](c: LruCache[K, V]; k: K; v: V) =
if k in c.data: c.data.del(k)
elif c.data.len >= c.cap:
for old in c.data.keys(): c.data.del(old); break # evict LRU
c.data[k] = v
proc get[K, V](c: LruCache[K, V]; k: K): Option[V] =
if k notin c.data: return none(V)
result = some(c.data[k])
c.put(k, c.data[k]) # touch
var c = LruCache[string, int](cap: 2)
c.put("a", 1); c.put("b", 2); c.put("a", 10); c.put("c", 3)
echo c.get("b").get(0), " ", c.data.len