blob: f71659ffb4472cbb8eef59a86fee24e337194204 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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
|