neovim/runtime/lua/vim/func.lua
Lewis Russell 877d04d0fb 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'.
2023-09-20 13:42:41 +01:00

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