From 2ee8ace217b8e4405822d3ab1bed5a20bedc4b04 Mon Sep 17 00:00:00 2001 From: Gregory Anders <8965202+gpanders@users.noreply.github.com> Date: Wed, 9 Aug 2023 15:41:45 -0500 Subject: fix(iter): make pipeline termination conditions consistent (#24614) If an iterator pipeline stage returns nil as its first return value, the other return values are ignored and it is treated as if that stage returned only nil (the semantics of returning nil are different between different stages). This is consistent with how for loops work in Lua more generally, where the for loop breaks when the first return value from the function iterator is nil (see :h for-in for details). --- test/functional/lua/iter_spec.lua | 38 +++----------------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) (limited to 'test/functional') diff --git a/test/functional/lua/iter_spec.lua b/test/functional/lua/iter_spec.lua index 3b603c9911..ffa28e7b11 100644 --- a/test/functional/lua/iter_spec.lua +++ b/test/functional/lua/iter_spec.lua @@ -154,6 +154,9 @@ describe('vim.iter', function() eq({1, 2}, vim.iter(t):slice(1, 2):totable()) eq({10}, vim.iter(t):slice(10, 10):totable()) eq({8, 9, 10}, vim.iter(t):slice(8, 11):totable()) + + local it = vim.iter(vim.gsplit('a|b|c|d', '|')) + matches('slice%(%) requires a list%-like table', pcall_err(it.slice, it, 1, 3)) end) it('nth()', function() @@ -396,39 +399,4 @@ describe('vim.iter', function() { item_3 = 'test' }, }, output) end) - - it('handles nil values', function() - local t = {1, 2, 3, 4, 5} - do - local it = vim.iter(t):enumerate():map(function(i, v) - if i % 2 == 0 then - return nil, v*v - end - return v, nil - end) - eq({ - { [1] = 1 }, - { [2] = 4 }, - { [1] = 3 }, - { [2] = 16 }, - { [1] = 5 }, - }, it:totable()) - end - - do - local it = vim.iter(ipairs(t)):map(function(i, v) - if i % 2 == 0 then - return nil, v*v - end - return v, nil - end) - eq({ - { [1] = 1 }, - { [2] = 4 }, - { [1] = 3 }, - { [2] = 16 }, - { [1] = 5 }, - }, it:totable()) - end - end) end) -- cgit