mirror of
https://github.com/neovim/neovim.git
synced 2024-12-25 13:45:15 -07:00
877d04d0fb
Memoizes a function, using a custom function to hash the arguments. 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_fn` is completely thought out. We may be able to have a good default hash_fn by hashing each argument, so basically a better 'concat'.
42 lines
1.7 KiB
Lua
42 lines
1.7 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.
|
|
--- @return F # Memoized version of {fn}
|
|
--- @nodoc
|
|
function M._memoize(hash, fn)
|
|
return require('vim.func._memoize')(hash, fn)
|
|
end
|
|
|
|
return M
|