blob: dc5add5fcf2c5da8c647467759c70b2bb8d6fe0b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
---------------------------------------------------------------------------
-- @author Uli Schlachter
-- @copyright 2015 Uli Schlachter
-- @classmod gears.cache
---------------------------------------------------------------------------
local select = select
local setmetatable = setmetatable
local unpack = unpack or table.unpack -- luacheck: globals unpack (compatibility with Lua 5.1)
local cache = {}
--- Get an entry from the cache, creating it if it's missing.
-- @param ... Arguments for the creation callback. These are checked against the
-- cache contents for equality.
-- @return The entry from the cache
function cache:get(...)
local result = self._cache
for i = 1, select("#", ...) do
local arg = select(i, ...)
local next = result[arg]
if not next then
next = {}
result[arg] = next
end
result = next
end
local ret = result._entry
if not ret then
ret = { self._creation_cb(...) }
result._entry = ret
end
return unpack(ret)
end
--- Create a new cache object. A cache keeps some data that can be
-- garbage-collected at any time, but might be useful to keep.
-- @param creation_cb Callback that is used for creating missing cache entries.
-- @return A new cache object.
function cache.new(creation_cb)
return setmetatable({
_cache = setmetatable({}, { __mode = "v" }),
_creation_cb = creation_cb
}, {
__index = cache
})
end
return setmetatable(cache, { __call = function(_, ...) return cache.new(...) end })
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|