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