---@meta

---@class resty.lrucache : table
local lrucache = {
	_VERSION = "0.11",
}

--- User flags value associated with the item to be stored.
---
--- It can be retrieved later with the item. The user flags are stored as an
--- unsigned 32-bit integer internally, and thus must be specified as a Lua
--- number. If not specified, flags will have a default value of 0. This
--- argument was added in the v0.10 release.
---
---@alias resty.lrucache.flags integer

--- Creates a new cache instance.
---
--- Upon failure, returns nil and a string describing the error.
---
---@param  max_items       number specifies the maximal number of items this cache can hold.
---@return resty.lrucache? cache
---@return string?         error
function lrucache.new(max_items) end

--- Sets a key with a value and an expiration time.
---
--- When the cache is full, the cache will automatically evict the least
--- recently used item.
---
---
---@param key    string
---@param value  any
---@param ttl?   number Expiration time, in seconds. If omitted, the value never expires.
---@param flags? resty.lrucache.flags
function lrucache:set(key, value, ttl, flags) end

--- Fetches a value with the key.
---
--- If the key does not exist in the cache or has already expired, `nil` will
--- be returned.
---
--- Starting from v0.03, the stale data is also returned as the second return
--- value if available.
---
---@param  key                   string
---@return any?                  data
---@return any?                  stale_data
---@return resty.lrucache.flags? integer
function lrucache:get(key) end

--- Removes an item specified by the key from the cache.
---
---@param key string
function lrucache:delete(key) end

--- Returns the number of items currently stored in the cache, including expired
--- items if any.
---
--- The returned count value will always be greater or equal to 0 and smaller
--- than or equal to the size argument given to cache:new.
---
--- This method was added in the v0.10 release.
---
---@return integer
function lrucache:count() end

--- Returns the maximum number of items the cache can hold.
---
--- The return value is the same as the size argument given to
--- `resty.lrucache.new()` when the cache was created.
---
--- This method was added in the v0.10 release.
---
---@return integer
function lrucache:capacity() end

--- Fetch the list of keys currently inside the cache, up to `max_count`.
---
--- The keys will be ordered in MRU fashion (Most-Recently-Used keys first).
---
--- This function returns a Lua (array) table (with integer keys) containing
--- the keys.
---
--- When `max_count` is `nil` or `0`, all keys (if any) will be returned.
---
--- When provided with a `res` table argument, this function will not allocate a
--- table and will instead insert the keys in `res`, along with a trailing `nil`
--- value.
---
--- This method was added in the v0.10 release.
---
---@param  max_count? integer
---@param  res?       table
---@return table      keys
function lrucache:get_keys(max_count, res) end

--- Flushes all the existing data (if any) in the current cache instance.
---
--- This is an O(1) operation and should be much faster than creating a brand
--- new cache instance.
---
--- Note however that the `flush_all()` method of `resty.lrucache.pureffi` is any
--- O(n) operation.
function lrucache:flush_all() end

return lrucache
