mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	fix(iter): ArrayIter:last returns nil when filtered to empty #34697
Problem: After filtering out all elements, ArrayIter:last still returns a stale element. Solution: Add check for self._head == self._tail and return nil early. Fix #34696
This commit is contained in:
		| @@ -1010,6 +1010,9 @@ end | ||||
|  | ||||
| ---@private | ||||
| function ArrayIter:last() | ||||
|   if self._head >= self._tail then | ||||
|     return nil | ||||
|   end | ||||
|   local inc = self._head < self._tail and 1 or -1 | ||||
|   local v = self._table[self._tail - inc] | ||||
|   self._head = self._tail | ||||
|   | ||||
| @@ -405,6 +405,15 @@ describe('vim.iter', function() | ||||
|     local s = 'abcdefghijklmnopqrstuvwxyz' | ||||
|     eq('z', vim.iter(vim.split(s, '')):last()) | ||||
|     eq('z', vim.iter(vim.gsplit(s, '')):last()) | ||||
|     eq( | ||||
|       nil, | ||||
|       vim | ||||
|         .iter({ 1, 2, 3, 4, 5 }) | ||||
|         :filter(function() | ||||
|           return false | ||||
|         end) | ||||
|         :last() | ||||
|     ) | ||||
|   end) | ||||
|  | ||||
|   it('enumerate()', function() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 glepnir
					glepnir