mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.8 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.
 | |
| --- @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
 | 
