
- Lua Tutorial
- Lua - Home
- Lua Basics
- Lua - Overview
- Lua - Environment
- Lua - Basic Syntax
- Lua - Comments
- Lua - Print Hello World
- Lua - Variables
- Lua - Data Types
- Lua - Operators
- Lua - Loops
- Lua - Generic For
- Lua - Decision Making
- Lua - Date and Time
- Lua Functions
- Lua - Functions
- Lua - Multiple Results
- Lua - Named Arguments
- Lua - Default/Optional Arguments
- Lua - Closures
- Lua - Uses of Closures
- Lua - Local Functions
- Lua - Anonymous Functions
- Lua - Functions in Table
- Lua - Proper Tail Calls
- Lua Strings
- Lua - Strings
- Lua - String Concatenation
- Lua - Loop Through String
- Lua - String to Int
- Lua - Split String
- Lua - Check String is NULL
- Lua Arrays
- Lua - Arrays
- Lua - Multi-dimensional Arrays
- Lua - Array Length
- Lua - Iterating Over Arrays
- Lua - Slicing Arrays
- Lua - Sorting Arrays
- Lua - Merging Arrays
- Lua - Sparse Arrays
- Lua - Searching Arrays
- Lua - Resizing Arrays
- Lua - Array to String Conversion
- Lua - Array as Stack
- Lua - Array as Queue
- Lua - Array with Metatables
- Lua - Immutable Arrays
- Lua - Shuffling Arrays
- Lua Iterators
- Lua - Iterators
- Lua - Stateless Iterators
- Lua - Stateful Iterators
- Lua - Built-in Iterators
- Lua - Custom Iterators
- Lua - Iterator Closures
- Lua - Infinite Iterators
- Lua - File Iterators
- Lua - Table Iterators
- Lua - Numeric Iterators
- Lua - Reverse Iterators
- Lua - Filter Iterators
- Lua - Range Iterators
- Lua - Chaining Iterators
- Lua Tables
- Lua - Tables
- Lua - Tables as Arrays
- Lua - Tables as Dictionaries
- Lua - Tables as Sets
- Lua - Table Length
- Lua - Table Iteration
- Lua - Table Constructors
- Lua - Loop through Table
- Lua - Merge Tables
- Lua - Nested Tables
- Lua - Accessing Table Fields
- Lua - Copy Table by Value
- Lua - Get Entries from Table
- Lua - Table Metatables
- Lua - Tables as Objects
- Lua - Table Inheritance
- Lua - Table Cloning
- Lua - Table Sorting
- Lua - Table Searching
- Lua - Table Serialization
- Lua - Weak Tables
- Lua - Table Memory Management
- Lua - Tables as Stacks
- Lua - Tables as Queues
- Lua - Sparse Tables
- Lua Lists
- Lua - Lists
- Lua - Inserting Elements into Lists
- Lua - Removing Elements from Lists
- Lua - Iterating Over Lists
- Lua - Reverse Iterating Over Lists
- Lua - Accessing List Elements
- Lua - Modifying List Elements
- Lua - List Length
- Lua - Concatenate Lists
- Lua - Slicing Lists
- Lua - Sorting Lists
- Lua - Reversing Lists
- Lua - Searching in Lists
- Lua - Shuffling List
- Lua - Multi-dimensional Lists
- Lua - Sparse Lists
- Lua - Lists as Stacks
- Lua - Lists as Queues
- Lua - Functional Operations on Lists
- Lua - Immutable Lists
- Lua - List Serialization
- Lua - Metatables with Lists
- Lua Modules
- Lua - Modules
- Lua - Returning Functions from Modules
- Lua - Returning Functions Table from Modules
- Lua - Module Scope
- Lua - SubModule
- Lua - Module Caching
- Lua - Custom Module Loaders
- Lua - Namespaces
- Lua - Singleton Modules
- Lua - Sharing State Between Modules
- Lua - Module Versioning
- Lua Metatables
- Lua - Metatables
- Lua - Chaining Metatables
- Lua Coroutines
- Lua - Coroutines
- Lua File Handling
- Lua - File I/O
- Lua - Opening Files
- Lua - Modes for File Access
- Lua - Reading Files
- Lua - Writing Files
- Lua - Closing Files
- Lua - Renaming Files
- Lua - Deleting Files
- Lua - File Buffers and Flushing
- Lua - Reading Files Line by Line
- Lua - Binary File Handling
- Lua - File Positioning
- Lua - Appending to Files
- Lua - Error Handling in File Operations
- Lua - Checking if File exists
- Lua - Checking if File is Readable
- Lua - Checking if File is Writable
- Lua - Checking if File is ReadOnly
- Lua - File Descriptors
- Lua - Creating Temporary Files
- Lua - Working with Large Files
- Lua Advanced
- Lua - Error Handling
- Lua - Debugging
- Lua - Garbage Collection
- Lua - Object Oriented
- Lua - Web Programming
- Lua - Database Access
- Lua - Game Programing
- Lua Useful Resources
- Lua - Quick Guide
- Lua - Useful Resources
- Lua - Discussion
Lua - Chaining Iterator
Lua is not having built-in support for chaining iterators. But we can create our own chaining iterator by table manipulations. Goal of this chain iterator is to iterate multiple iterables sequentially as they are single iterable. In this chapter, we'll discuss various options to create a chaining iterator with examples.
Example - Create a Custom Chaining Iterator
We're creating a function which can take multiple iterables represented by tables and it will return a single iterator which iterates through each iterables one by one and we'll print each values.
main.lua
-- function representing chain iterator function chainIterator(...) local iterables = {...} local iterable_index = 1 local index = 1 return function() while iterable_index <= #iterables do local iterable = iterables[iterable_index] if type(iterable) ~= "table" then -- if argument is not a table error("Invalid input. Only table can be passed.") end -- iterate through table entries if index <= #iterable then local value = iterable[index] index = index + 1 return value else -- go to next table iterable_index = iterable_index + 1 index = 1 -- Reset index for the next table end end return -- end of iteration end end local list1 = {1, 2, 3, 4} local list2 = {'a', 'b', 'c'} local list3 = {10, 20} for item in chainIterator(list1, list2, list3) do print(item) end
Output
When the above code is built and executed, it produces the following result −
1 2 3 4 a b c 10 20
Explanation
chainIterator(...) function takes variable arguments as tables and stored in itearable table.
iterable_index is to track current table and index is to track current item of a table.
Using return function() we've returned an anonymous function which acts as an iterator to give the next item.
while iterable_index <= #iterables do loop is to iterate all tables.
if index <= #iterable then is used to return item of current iterable. Once current iterable is done, we're moving to next iterable.
Example - Chaining into a New Table
Instead of creating a chaining iterator, we can combine tables as well as shown in example below −
main.lua
function combineTables(...) local result = {} -- iterate through each table for i = 1, select('#', ...) do -- get the iterator local iterable = select(i, ...) if type(iterable) ~= "table" then error("Invalid input. Only table can be passed.") end -- iterate through table values and insert into result table for _, value in ipairs(iterable) do table.insert(result, value) end end -- return the combined table return result end local list1 = {1, 2, 3, 4} local list2 = {'a', 'b', 'c'} local list3 = {10, 20} local combinedList = combineTables(list1, list2, list3) for _,item in ipairs(combinedList) do print(item) end
Output
When the above code is built and executed, it produces the following result −
1 2 3 4 a b c 10 20
Explanation
combineTables(...) function takes variable arguments as tables and returns a combined table of all values of the table passed.
result represents the combined table. Using for loop, we're navigating through each table.
Using ipairs, we're iterating each element of the input table and values are inserted to combined table as result.
Finally result is returned.