Lua bounded LRU cache with recency eviction

Lua
local function lru_cache(capacity)
  assert(capacity >= 1, 'capacity must be positive')
  local data, size, tick = {}, 0, 0
  local function bump(e) tick = tick + 1; e.used = tick; return e.value end
  local function get(key) local e = data[key]
    if e then return bump(e) end
  end
  local function put(key, value) local e = data[key]
    if e then e.value = value; bump(e); return end
    if size == capacity then
      local oldest = next(data)
      for k, other in pairs(data) do
        if other.used < data[oldest].used then oldest = k end
      end
      data[oldest] = nil; size = size - 1
    end
    size = size + 1; data[key] = { value = value, used = tick + 1 }; tick = tick + 1
  end
  return { get = get, put = put }
end

return lru_cache