aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/iter.lua
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/vim/iter.lua')
-rw-r--r--runtime/lua/vim/iter.lua22
1 files changed, 17 insertions, 5 deletions
diff --git a/runtime/lua/vim/iter.lua b/runtime/lua/vim/iter.lua
index a278e96a5f..56c130dd0c 100644
--- a/runtime/lua/vim/iter.lua
+++ b/runtime/lua/vim/iter.lua
@@ -6,11 +6,14 @@
--- Each pipeline stage receives as input the output values from the prior stage. The values used in
--- the first stage of the pipeline depend on the type passed to this function:
---
---- - List tables pass only the value of each element
---- - Non-list (dict) tables pass both the key and value of each element
+--- - List tables (arrays) pass only the value of each element
+--- - Non-list tables (dictionaries) pass both the key and value of each element
--- - Function |iterator|s pass all of the values returned by their respective function
--- - Tables with a metatable implementing |__call()| are treated as function iterators
---
+--- The iterator pipeline terminates when the original table or function iterator runs out of values
+--- (for function iterators, this means that the first value returned by the function is nil).
+---
--- Examples:
--- <pre>lua
--- local it = vim.iter({ 1, 2, 3, 4, 5 })
@@ -22,6 +25,7 @@
--- it:totable()
--- -- { 9, 6, 3 }
---
+--- -- ipairs() is a function iterator which returns both the index (i) and the value (v)
--- vim.iter(ipairs({ 1, 2, 3, 4, 5 })):map(function(i, v)
--- if i > 2 then return v end
--- end):totable()
@@ -111,7 +115,7 @@ end
---@return boolean True if the iterator stage should continue, false otherwise
---@return any Function arguments.
local function continue(...)
- if select('#', ...) > 0 then
+ if select(1, ...) ~= nil then
return false, ...
end
return true
@@ -127,7 +131,7 @@ end
---@return boolean True if the iterator pipeline should continue, false otherwise
---@return any Return values of f
local function apply(f, ...)
- if select('#', ...) > 0 then
+ if select(1, ...) ~= nil then
return continue(f(...))
end
return false
@@ -258,7 +262,7 @@ end
--- in the pipeline as arguments.
function Iter.each(self, f)
local function fn(...)
- if select('#', ...) > 0 then
+ if select(1, ...) ~= nil then
f(...)
return true
end
@@ -740,6 +744,12 @@ end
---@param last number
---@return Iter
function Iter.slice(self, first, last) -- luacheck: no unused args
+ error('slice() requires a list-like table')
+ return self
+end
+
+---@private
+function ListIter.slice(self, first, last)
return self:skip(math.max(0, first - 1)):skipback(math.max(0, self._tail - last - 1))
end
@@ -912,6 +922,8 @@ function Iter.new(src, ...)
--- Use a closure to handle var args returned from iterator
local function fn(...)
+ -- Per the Lua 5.1 reference manual, an iterator is complete when the first returned value is
+ -- nil (even if there are other, non-nil return values). See |for-in|.
if select(1, ...) ~= nil then
var = select(1, ...)
return ...