diff options
author | Will Hopkins <willothyh@gmail.com> | 2023-12-12 12:27:24 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-12 14:27:24 -0600 |
commit | 69ffbb76c237fcbba24de80f1b5346d92642e800 (patch) | |
tree | f6a59d9e31dedaff08b08a183e5484d04ee50d3f /runtime/lua | |
parent | 1907abb4c27857fe7f4e7394f32e130f9955a2e7 (diff) | |
download | rneovim-69ffbb76c237fcbba24de80f1b5346d92642e800.tar.gz rneovim-69ffbb76c237fcbba24de80f1b5346d92642e800.tar.bz2 rneovim-69ffbb76c237fcbba24de80f1b5346d92642e800.zip |
feat(iter): add `Iter.take` (#26525)
Diffstat (limited to 'runtime/lua')
-rw-r--r-- | runtime/lua/vim/iter.lua | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/runtime/lua/vim/iter.lua b/runtime/lua/vim/iter.lua index e9c2b66bf2..8e602c406a 100644 --- a/runtime/lua/vim/iter.lua +++ b/runtime/lua/vim/iter.lua @@ -592,6 +592,41 @@ function ListIter.rfind(self, f) -- luacheck: no unused args self._head = self._tail 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). --- --- Example: |