Modul:array/doc
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
(aliascompress
),contains
,invert
,isArray
,length
,listToSet
(aliastoSet
),maxIndex
,numKeys
,removeDuplicates
,reverse
,reverseIpairs
,serialCommaJoin
,sparseIpairs
Functions from Module:fun. These have a function as the second argument:
all
,filter
,map
,some
These functions are included in a funcs
subtable of an array (awkward):
affixNums
,keysToList
,numKeys
The following functions return an array (with the array metatable):
affixNums
,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)
.