mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	feat(iter): add Iter.take (#26525)
				
					
				
			This commit is contained in:
		| @@ -3639,6 +3639,25 @@ Iter:slice({first}, {last})                                     *Iter:slice()* | |||||||
|     Return: ~ |     Return: ~ | ||||||
|         Iter |         Iter | ||||||
|  |  | ||||||
|  | Iter:take({n})                                                   *Iter:take()* | ||||||
|  |     Transforms an iterator to yield only the first n values. | ||||||
|  |  | ||||||
|  |     Example: >lua | ||||||
|  |         local it = vim.iter({ 1, 2, 3, 4 }):take(2) | ||||||
|  |         it:next() | ||||||
|  |         -- 1 | ||||||
|  |         it:next() | ||||||
|  |         -- 2 | ||||||
|  |         it:next() | ||||||
|  |         -- nil | ||||||
|  | < | ||||||
|  |  | ||||||
|  |     Parameters: ~ | ||||||
|  |       • {n}  (integer) | ||||||
|  |  | ||||||
|  |     Return: ~ | ||||||
|  |         Iter | ||||||
|  |  | ||||||
| Iter:totable()                                                *Iter:totable()* | Iter:totable()                                                *Iter:totable()* | ||||||
|     Collect the iterator into a table. |     Collect the iterator into a table. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -592,6 +592,41 @@ function ListIter.rfind(self, f) -- luacheck: no unused args | |||||||
|   self._head = self._tail |   self._head = self._tail | ||||||
| end | end | ||||||
|  |  | ||||||
|  | --- Transforms an iterator to yield only the first n values. | ||||||
|  | --- | ||||||
|  | --- Example: | ||||||
|  | --- | ||||||
|  | --- ```lua | ||||||
|  | --- local it = vim.iter({ 1, 2, 3, 4 }):take(2) | ||||||
|  | --- it:next() | ||||||
|  | --- -- 1 | ||||||
|  | --- it:next() | ||||||
|  | --- -- 2 | ||||||
|  | --- it:next() | ||||||
|  | --- -- nil | ||||||
|  | --- ``` | ||||||
|  | --- | ||||||
|  | ---@param n integer | ||||||
|  | ---@return Iter | ||||||
|  | function Iter.take(self, n) | ||||||
|  |   local next = self.next | ||||||
|  |   local i = 0 | ||||||
|  |   self.next = function() | ||||||
|  |     if i < n then | ||||||
|  |       i = i + 1 | ||||||
|  |       return next(self) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   return self | ||||||
|  | end | ||||||
|  |  | ||||||
|  | ---@private | ||||||
|  | function ListIter.take(self, n) | ||||||
|  |   local inc = self._head < self._tail and 1 or -1 | ||||||
|  |   self._tail = math.min(self._tail, self._head + n * inc) | ||||||
|  |   return self | ||||||
|  | end | ||||||
|  |  | ||||||
| --- "Pops" a value from a |list-iterator| (gets the last value and decrements the tail). | --- "Pops" a value from a |list-iterator| (gets the last value and decrements the tail). | ||||||
| --- | --- | ||||||
| --- Example: | --- Example: | ||||||
|   | |||||||
| @@ -203,6 +203,33 @@ describe('vim.iter', function() | |||||||
|     matches('skipback%(%) requires a list%-like table', pcall_err(it.nthback, it, 1)) |     matches('skipback%(%) requires a list%-like table', pcall_err(it.nthback, it, 1)) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
|  |   it('take()', function() | ||||||
|  |     do | ||||||
|  |       local t = { 4, 3, 2, 1 } | ||||||
|  |       eq({}, vim.iter(t):take(0):totable()) | ||||||
|  |       eq({ 4 }, vim.iter(t):take(1):totable()) | ||||||
|  |       eq({ 4, 3 }, vim.iter(t):take(2):totable()) | ||||||
|  |       eq({ 4, 3, 2 }, vim.iter(t):take(3):totable()) | ||||||
|  |       eq({ 4, 3, 2, 1 }, vim.iter(t):take(4):totable()) | ||||||
|  |       eq({ 4, 3, 2, 1 }, vim.iter(t):take(5):totable()) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |       local t = { 4, 3, 2, 1 } | ||||||
|  |       local it = vim.iter(t) | ||||||
|  |       eq({ 4, 3 }, it:take(2):totable()) | ||||||
|  |       -- tail is already set from the previous take() | ||||||
|  |       eq({ 4, 3 }, it:take(3):totable()) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |       local it = vim.iter(vim.gsplit('a|b|c|d', '|')) | ||||||
|  |       eq({ 'a', 'b' }, it:take(2):totable()) | ||||||
|  |       -- non-array iterators are consumed by take() | ||||||
|  |       eq({}, it:take(2):totable()) | ||||||
|  |     end | ||||||
|  |   end) | ||||||
|  |  | ||||||
|   it('any()', function() |   it('any()', function() | ||||||
|     local function odd(v) |     local function odd(v) | ||||||
|       return v % 2 ~= 0 |       return v % 2 ~= 0 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Will Hopkins
					Will Hopkins