mirror of
https://github.com/neovim/neovim.git
synced 2025-11-13 05:48:51 +00:00
feat(lua): add vim.func._memoize
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'.
This commit is contained in:
committed by
Lewis Russell
parent
11865dbe39
commit
877d04d0fb
41
runtime/lua/vim/func.lua
Normal file
41
runtime/lua/vim/func.lua
Normal file
@@ -0,0 +1,41 @@
|
||||
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
|
||||
Reference in New Issue
Block a user