feat(func): allow manual cache invalidation for _memoize

This commit also adds some tests for the existing memoization
functionality.
This commit is contained in:
Riley Bruins
2024-09-01 16:54:30 -07:00
committed by Christian Clason
parent 54ac406649
commit b61051ccb4
4 changed files with 191 additions and 25 deletions

View File

@@ -3,9 +3,6 @@ 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'.
@@ -17,6 +14,10 @@ local M = {}
--- Internally uses a |lua-weaktable| to cache the results of {fn} meaning the
--- cache will be invalidated whenever Lua does garbage collection.
---
--- The cache can also be manually invalidated by calling `:clear()` on the returned object.
--- Calling this function with no arguments clears the entire cache; otherwise, the arguments will
--- be interpreted as function inputs, and only the cache entry at their hash will be cleared.
---
--- The memoized function returns shared references so be wary about
--- mutating return values.
---
@@ -32,11 +33,12 @@ local M = {}
--- first n arguments passed to {fn}.
---
--- @param fn F Function to memoize.
--- @param strong? boolean Do not use a weak table
--- @param weak? boolean Use a weak table (default `true`)
--- @return F # Memoized version of {fn}
--- @nodoc
function M._memoize(hash, fn, strong)
return require('vim.func._memoize')(hash, fn, strong)
function M._memoize(hash, fn, weak)
-- this is wrapped in a function to lazily require the module
return require('vim.func._memoize')(hash, fn, weak)
end
return M