12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- 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
|