Module:TableTools/doc: Difference between revisions

Jump to navigation Jump to search
imported>Pppery
(Suppress inapplicable tracking category)
(Blanked the page)
Line 1: Line 1:
{{used in system}}
{{module rating|protected}}
{{lua|Module:Exponential search|noprotcat=yes}}
This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke.


== Loading the module ==
To use any of the functions, first you must load the module.
<syntaxhighlight lang="lua">
local TableTools = require('Module:TableTools')
</syntaxhighlight>
== isPositiveInteger ==
<syntaxhighlight lang="lua">
TableTools.isPositiveInteger(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is a positive integer, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a given table key is in the array part or the hash part of a table.
== isNan ==
<syntaxhighlight lang="lua">
TableTools.isNan(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is a [[NaN]] value, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a value can be a valid table key. (Lua will generate an error if a NaN value is used as a table key.)
== shallowClone ==
<syntaxhighlight lang="lua">
TableTools.shallowClone(t)
</syntaxhighlight>
Returns a clone of a table. The value returned is a new table, but all subtables and functions are shared. Metamethods are respected, but the returned table will have no metatable of its own. If you want to make a new table with no shared subtables and with metatables transferred, you can use <code>[[mw:Extension:Scribunto/Lua reference manual#mw.clone|mw.clone]]</code> instead. If you want to make a new table with no shared subtables and without metatables transferred, use <code>[[#deepCopy|deepCopy]]</code> with the <code>noMetatable</code> option.
== removeDuplicates ==
<syntaxhighlight lang="lua">
TableTools.removeDuplicates(t)
</syntaxhighlight>
Removes duplicate values from an array. This function is only designed to work with standard arrays: keys that are not positive integers are ignored, as are all values after the first <code>nil</code> value. (For arrays containing <code>nil</code> values, you can use <code>[[#compressSparseArray|compressSparseArray]]</code> first.) The function tries to preserve the order of the array: the earliest non-unique value is kept, and all subsequent duplicate values are removed. For example, for the table {{code|code={5, 4, 4, 3, 4, 2, 2, 1}|lang=lua}} <code>removeDuplicates</code> will return {{code|code={5, 4, 3, 2, 1}|lang=lua}}.
== numKeys ==
<syntaxhighlight lang="lua">
TableTools.numKeys(t)
</syntaxhighlight>
Takes a table <code>''t''</code> and returns an array containing the numbers of any positive integer keys that have non-nil values, sorted in numerical order. For example, for the table {{code|code={'foo', nil, 'bar', 'baz', a = 'b'}|lang=lua}}, <code>numKeys</code> will return {{code|code={1, 3, 4}|lang=lua}}.
== affixNums ==
<syntaxhighlight lang="lua">
TableTools.affixNums(t, prefix, suffix)
</syntaxhighlight>
Takes a table <code>''t''</code> and returns an array containing the numbers of keys with the optional prefix <code>''prefix''</code> and the optional suffix <code>''suffix''</code>. For example, for the table {{code|code={a1 = 'foo', a3 = 'bar', a6 = 'baz'}|lang=lua}} and the prefix <code>'a'</code>, <code>affixNums</code> will return {{code|code={1, 3, 6}|lang=lua}}. All characters in <code>''prefix''</code> and <code>''suffix''</code> are interpreted literally.
== numData ==
<syntaxhighlight lang="lua">
TableTools.numData(t, compress)
</syntaxhighlight>
Given a table with keys like <code>"foo1"</code>, <code>"bar1"</code>, <code>"foo2"</code>, and <code>"baz2"</code>, returns a table of subtables in the format {{code|code={ [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }|lang=lua}}. Keys that don't end with an integer are stored in a subtable named <code>"other"</code>. The compress option compresses the table so that it can be iterated over with <code>ipairs</code>.
== compressSparseArray ==
<syntaxhighlight lang="lua">
TableTools.compressSparseArray(t)
</syntaxhighlight>
Takes an array <code>''t''</code> with one or more nil values, and removes the nil values while preserving the order, so that the array can be safely traversed with <code>ipairs</code>. Any keys that are not positive integers are removed. For example, for the table {{code|code={1, nil, foo = 'bar', 3, 2}|lang=lua}}, <code>compressSparseArray</code> will return {{code|code={1, 3, 2}|lang=lua}}.
== sparseIpairs ==
<syntaxhighlight lang="lua">
TableTools.sparseIpairs(t)
</syntaxhighlight>
This is an iterator function for traversing a sparse array <code>''t''</code>. It is similar to <code>[[mw:Extension:Scribunto/Lua reference manual#ipairs|ipairs]]</code>, but will continue to iterate until the highest numerical key, whereas <code>ipairs</code> may stop after the first <code>nil</code> value. Any keys that are not positive integers are ignored.
Usually <code>sparseIpairs</code> is used in a generic <code>for</code> loop.
<syntaxhighlight lang="lua">
for i, v in TableTools.sparseIpairs(t) do
  -- code block
end
</syntaxhighlight>
Note that <code>sparseIpairs</code> uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function in its implementation. Although some table keys appear to be ignored, all table keys are accessed when it is run.
== size ==
<syntaxhighlight lang="lua">
TableTools.size(t)
</syntaxhighlight>
Finds the size of a key/value pair table. For example, for the table {{code|code={foo = 'foo', bar = 'bar'}|lang=lua}}, <code>size</code> will return <code>2</code>. The function will also work on arrays, but for arrays it is more efficient to use the <code>#</code> operator. Note that to find the table size, this function uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function to iterate through all of the table keys.
== keysToList ==
<syntaxhighlight lang="lua">
TableTools.keysToList(t, keySort, checked)
</syntaxhighlight>
Returns a list of the keys in a table, sorted using either a default comparison function or a custom <code>''keySort''</code> function, which follows the same rules as the <code>comp</code> function supplied to <code>[[mw:Extension:Scribunto/Lua reference manual#table.sort|table.sort]]</code>. If <code>''keySort''</code> is <code>false</code>, no sorting is done. Set <code>''checked''</code> to <code>true</code> to skip the internal type checking.
== sortedPairs ==
<syntaxhighlight lang="lua">
TableTools.sortedPairs(t, keySort)
</syntaxhighlight>
Iterates through a table, with the keys sorted using the <code>keysToList</code> function. If there are only numerical keys, <code>sparseIpairs</code> is probably more efficient.
== isArray ==
<syntaxhighlight lang="lua">
TableTools.isArray(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is a table and all keys are consecutive integers starting at 1.
== isArrayLike ==
<syntaxhighlight lang="lua">
TableTools.isArrayLike(value)
</syntaxhighlight>
Returns <code>true</code> if <code>''value''</code> is iterable and all keys are consecutive integers starting at 1.
== invert ==
<syntaxhighlight lang="lua">
TableTools.invert(arr)
</syntaxhighlight>
Transposes the keys and values in an array. For example, {{code|invert{ "a", "b", "c" }|lua}} yields {{code|code={ a=1, b=2, c=3 }|lang=lua}}.
== listToSet ==
<syntaxhighlight lang="lua">
TableTools.listToSet(arr)
</syntaxhighlight>
Creates a set from the array part of the table <code>''arr''</code>. Indexing the set by any of the values of the array returns <code>true</code>. For example, {{code|listToSet{ "a", "b", "c" }|lua}} yields {{code|code={ a=true, b=true, c=true }|lang=lua}}. See also [[Module:Lua set]] for more advanced ways to create a set.
== deepCopy ==
<syntaxhighlight lang="lua">
TableTools.deepCopy(orig, noMetatable, alreadySeen)
</syntaxhighlight>
Creates a copy of the table <code>''orig''</code>. As with <code>mw.clone</code>, all values that are not functions are duplicated and the identity of tables is preserved. If <code>''noMetatable''</code> is <code>true</code>, then the metatable (if any) is not copied. Can copy tables loaded with <code>mw.loadData</code>.
Similar to <code>mw.clone</code>, but <code>mw.clone</code> cannot copy tables loaded with <code>mw.loadData</code> and does not allow metatables <em>not</em> to be copied.
== sparseConcat ==
<syntaxhighlight lang="lua">
TableTools.sparseConcat(t, sep, i, j)
</syntaxhighlight>
Concatenates all values in the table that are indexed by a positive integer, in order. For example, {{code|sparseConcat{ "a", nil, "c", "d" }|lua}} yields {{code|"acd"|lua}} and {{code|sparseConcat{ nil, "b", "c", "d" }|lua}} yields {{code|"bcd"|lua}}.
== length ==
<syntaxhighlight lang="lua">
TableTools.length(t, prefix)
</syntaxhighlight>
Finds the length of an array or of a quasi-array with keys with an optional <code>''prefix''</code> such as "data1", "data2", etc. It uses an [[exponential search]] algorithm to find the length, so as to use as few table lookups as possible.
This algorithm is useful for arrays that use metatables (e.g. [[mw:Extension:Scribunto/Lua reference manual#frame.args|frame.args]]) and for quasi-arrays. For normal arrays, just use the [[mw:Extension:Scribunto/Lua reference manual#Length operator|# operator]], as it is implemented in [[C (programming language)|C]] and will be quicker.
== inArray ==
<syntaxhighlight lang="lua">
TableTools.inArray(arr, valueToFind)
</syntaxhighlight>
Returns <code>true</code> if <code>''valueToFind''</code> is a member of the array <code>''arr''</code>, and <code>false</code> otherwise.
<includeonly>{{Sandbox other||
[[Category:Lua metamodules|TableTools]]
}}</includeonly>

Revision as of 17:45, 28 January 2023