51 lines
898 B
Lua
51 lines
898 B
Lua
local private_state = ...
|
|
local mod_storage = private_state.mod_storage
|
|
|
|
function futil.memoize1(func)
|
|
local memo = {}
|
|
return function(arg)
|
|
if arg == nil then
|
|
return func(arg)
|
|
end
|
|
local rv = memo[arg]
|
|
|
|
if not rv then
|
|
rv = func(arg)
|
|
memo[arg] = rv
|
|
end
|
|
|
|
return rv
|
|
end
|
|
end
|
|
|
|
function futil.memoize_dumpable(func)
|
|
local memo = {}
|
|
return function(...)
|
|
local key = dump({ ... })
|
|
local rv = memo[key]
|
|
|
|
if not rv then
|
|
rv = func(...)
|
|
memo[key] = rv
|
|
end
|
|
|
|
return rv
|
|
end
|
|
end
|
|
|
|
function futil.memoize1_modstorage(id, func)
|
|
local key_format = ("%%s:%s:memoize"):format(id)
|
|
return function(arg)
|
|
local key_key = key_format:format(tostring(arg))
|
|
local rv = mod_storage:get(key_key)
|
|
|
|
if not rv then
|
|
rv = func(arg)
|
|
mod_storage:set_string(key_key, tostring(rv))
|
|
end
|
|
|
|
return rv
|
|
end
|
|
end
|
|
|
|
futil.memoize1ms = futil.memoize1_modstorage -- backwards compatibility
|