mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	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'.
		
			
				
	
	
		
			42 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			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
 |