Returns an array constructor that produces a table that has a number of functions available as methods: the table
library functions, and various vanilla Lua functions and functions from Module:table and Module:fun that operate on arrays or on tables with integer keys.
local Array = require("Module:array")
local nums = Array() -- or Array:new()
nums:type() --> "array"
for i = 1, 5 do
nums:insert(i)
end
nums:concat(", ") --> "1, 2, 3, 4, 5"
local squares = nums:map(function (num) return num ^ 2 end) -- Returns new array.
squares:concat(', ') --> "1, 4, 9, 16, 25"
local even_squares = squares:filter(function (square) return square % 2 == 0 end)
even_squares:concat(", ") --> "4, 16"
The functions from Module:table and Module:fun are loaded as needed.
Functions from Module:table:
compressSparseArray
(alias compress
), contains
, invert
, isArray
, length
, listToSet
(alias toSet
), maxIndex
, numKeys
, removeDuplicates
, reverse
, reverseIpairs
, serialCommaJoin
, sparseIpairs
Functions from Module:fun. These have a function as the second argument (first argument of method):
all
, filter
, fold
, map
, some
These functions are included in a funcs
subtable of an array (awkward):
keysToList
, numKeys
The following functions return an array (with the array metatable):
compressSparseArray
, keysToList
, numKeys
, removeDuplicates
, reverse
The names with underscores instead of camel case can be used as aliases: for instance, arr:to_set()
instead of arr:toSet()
.
The array constructor behaves differently depending on the arguments supplied to it. Without arguments, it creates an empty table. Given a single table, it adds the metatable to it. If the table has been loaded with mw.loadData
, it duplicates the table, removing the metatable that is found in tables loaded with mw.loadData
. Otherwise, it creates a new table (array) containing the arguments.
The array constructor does this by adding a metatable. This is similar to how all strings have a metatable that allows the string
library functions to be used as methods: for instance, ("abc"):sub(1, 1)
for string.sub("abc", 1, 1)
.