Home Explore Blog CI



neovim

54th chunk of `runtime/doc/lua.txt`
d618aff4d99de579f78e45ccda685471f485fe50125c3b240000000100000fc3
 first stage depends on the type passed to
`vim.iter()`:
• Lists or arrays (|lua-list|) yield only the value of each element.
  • Holes (nil values) are allowed (but discarded).
  • Use pairs() to treat array/list tables as dicts (preserve holes and
    non-contiguous integer keys): `vim.iter(pairs(…))`.
  • Use |Iter:enumerate()| to also pass the index to the next stage.
    • Or initialize with ipairs(): `vim.iter(ipairs(…))`.
• Non-list tables (|lua-dict|) yield both the key and value of each element.
• Function |iterator|s yield all values returned by the underlying function.
• Tables with a |__call()| metamethod are treated as function iterators.

The iterator pipeline terminates when the underlying |iterable| is exhausted
(for function iterators this means it returned nil).

Note: `vim.iter()` scans table input to decide if it is a list or a dict; to
avoid this cost you can wrap the table with an iterator e.g.
`vim.iter(ipairs({…}))`, but that precludes the use of |list-iterator|
operations such as |Iter:rev()|).

Examples: >lua
    local it = vim.iter({ 1, 2, 3, 4, 5 })
    it:map(function(v)
      return v * 3
    end)
    it:rev()
    it:skip(2)
    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()
    -- { 3, 4, 5 }

    local it = vim.iter(vim.gsplit('1,2,3,4,5', ','))
    it:map(function(s) return tonumber(s) end)
    for i, d in it:enumerate() do
      print(string.format("Column %d is %d", i, d))
    end
    -- Column 1 is 1
    -- Column 2 is 2
    -- Column 3 is 3
    -- Column 4 is 4
    -- Column 5 is 5

    vim.iter({ a = 1, b = 2, c = 3, z = 26 }):any(function(k, v)
      return k == 'z'
    end)
    -- true

    local rb = vim.ringbuf(3)
    rb:push("a")
    rb:push("b")
    vim.iter(rb):totable()
    -- { "a", "b" }
<


Iter:all({pred})                                                  *Iter:all()*
    Returns true if all items in the iterator match the given predicate.

    Parameters: ~
      • {pred}  (`fun(...):boolean`) Predicate function. Takes all values
                returned from the previous stage in the pipeline as arguments
                and returns true if the predicate matches.

Iter:any({pred})                                                  *Iter:any()*
    Returns true if any of the items in the iterator match the given
    predicate.

    Parameters: ~
      • {pred}  (`fun(...):boolean`) Predicate function. Takes all values
                returned from the previous stage in the pipeline as arguments
                and returns true if the predicate matches.

Iter:each({f})                                                   *Iter:each()*
    Calls a function once for each item in the pipeline, draining the
    iterator.

    For functions with side effects. To modify the values in the iterator, use
    |Iter:map()|.

    Parameters: ~
      • {f}  (`fun(...)`) Function to execute for each item in the pipeline.
             Takes all of the values returned by the previous stage in the
             pipeline as arguments.

Iter:enumerate()                                            *Iter:enumerate()*
    Yields the item index (count) and value for each item of an iterator
    pipeline.

    For list tables, this is more efficient: >lua
        vim.iter(ipairs(t))
<

    instead of: >lua
        vim.iter(t):enumerate()
<

    Example: >lua

        local it = vim.iter(vim.gsplit('abc', '')):enumerate()
        it:next()
        -- 1	'a'
        it:next()
        -- 2	'b'
        it:next()
        -- 3	'c'
<

    Return: ~
        (`Iter`)

Iter:filter({f})                                               *Iter:filter()*
    Filters an iterator pipeline.

    Example: >lua
        local bufs = vim.iter(vim.api.nvim_list_bufs()):filter(vim.api.nvim_buf_is_loaded)
<

    Parameters: ~
      • {f}  (`fun(...):boolean`)

Title: vim.iter Details and Examples, Iter:all, Iter:any, Iter:each, Iter:enumerate, Iter:filter
Summary
This section provides further details on using `vim.iter()`, including how it handles different types of input and how to optimize performance. It illustrates various scenarios with detailed examples, such as mapping values, reversing order, skipping elements, and converting to tables. Furthermore, the section defines the methods `Iter:all()`, `Iter:any()`, `Iter:each()`, `Iter:enumerate()`, and `Iter:filter()`, including parameters and usage examples.