neovim/runtime/lua/vim/func.lua

43 lines
1.8 KiB
Lua

local M = {}
-- TODO(lewis6991): Private for now until:
-- - There are other places in the codebase that could benefit from this
-- (e.g. LSP), but might require other changes to accommodate.
-- - Invalidation of the cache needs to be controllable. Using weak tables
-- is an acceptable invalidation policy, but it shouldn't be the only
-- one.
-- - I don't think the story around `hash` is completely thought out. We
-- may be able to have a good default hash by hashing each argument,
-- so basically a better 'concat'.
-- - Need to support multi level caches. Can be done by allow `hash` to
-- return multiple values.
--
--- Memoizes a function {fn} using {hash} to hash the arguments.
---
--- Internally uses a |lua-weaktable| to cache the results of {fn} meaning the
--- cache will be invalidated whenever Lua does garbage collection.
---
--- The memoized function returns shared references so be wary about
--- mutating return values.
---
--- @generic F: function
--- @param hash integer|string|function Hash function to create a hash to use as a key to
--- store results. Possible values:
--- - When integer, refers to the index of an argument of {fn} to hash.
--- This argument can have any type.
--- - When function, is evaluated using the same arguments passed to {fn}.
--- - When `concat`, the hash is determined by string concatenating all the
--- arguments passed to {fn}.
--- - When `concat-n`, the hash is determined by string concatenating the
--- first n arguments passed to {fn}.
---
--- @param fn F Function to memoize.
--- @param strong? boolean Do not use a weak table
--- @return F # Memoized version of {fn}
--- @nodoc
function M._memoize(hash, fn, strong)
return require('vim.func._memoize')(hash, fn, strong)
end
return M