Difference between revisions of "Module:TableTools"

From Meta
Jump to navigation Jump to search
(finish sparseIpairs)
(add getAffixNums function)
Line 39: Line 39:
 
if isPositiveInteger(k) then
 
if isPositiveInteger(k) then
 
nums[#nums + 1] = k
 
nums[#nums + 1] = k
 +
end
 +
end
 +
table.sort(nums)
 +
return nums
 +
end
 +
 +
--[[
 +
-----------------------------------------------------------------------------------
 +
-- getAffixNums
 +
--
 +
-- This takes a table and returns an array containing the numbers of keys with the
 +
-- specified prefix and suffix. For example, for the table
 +
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
 +
-- return {1, 3, 6}.
 +
-----------------------------------------------------------------------------------
 +
--]]
 +
function p.getAffixNums(t, prefix, suffix)
 +
prefix = prefix or ''
 +
suffix = suffix or ''
 +
local nums = {}
 +
for k, v in pairs(t) do
 +
if type(k) == 'string' then
 +
local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
 +
if num then
 +
nums[#nums + 1] = tonumber(num)
 +
end
 
end
 
end
 
end
 
end

Revision as of 12:43, 15 December 2013

Documentation for this module may be created at Module:TableTools/doc

-- This module includes a number of functions that can be useful when dealing with Lua tables.

local p = {}

-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge

--[[
-----------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given number is a positive integer, and false
-- 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 the table.
-----------------------------------------------------------------------------------
--]]
function p.isPositiveInteger(num)
	if type(num) == 'number' and num >= 1 and floor(num) == num and num < infinity then
		return true
	else
		return false
	end
end

--[[
-----------------------------------------------------------------------------------
-- getNumKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
-----------------------------------------------------------------------------------
--]]
function p.getNumKeys(t)
	local isPositiveInteger = p.isPositiveInteger
	local nums = {}
	for k, v in pairs(t) do
		if isPositiveInteger(k) then
			nums[#nums + 1] = k
		end
	end
	table.sort(nums)
	return nums
end

--[[
-----------------------------------------------------------------------------------
-- getAffixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", getAffixNums will
-- return {1, 3, 6}.
-----------------------------------------------------------------------------------
--]]
function p.getAffixNums(t, prefix, suffix)
	prefix = prefix or ''
	suffix = suffix or ''
	local nums = {}
	for k, v in pairs(t) do
		if type(k) == 'string' then			
			local num = mw.ustring.match(k, '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$')
			if num then
				nums[#nums + 1] = tonumber(num)
			end
		end
	end
	table.sort(nums)
	return nums
end

--[[
-----------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
-----------------------------------------------------------------------------------
--]]
function p.compressSparseArray(t)
	local ret = {}
	local nums = p.getNumKeys(t)
	table.sort(nums)
	for _, num in ipairs(nums) do
		ret[#ret + 1] = t[num]
	end
	return ret
end

--[[
-----------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
-----------------------------------------------------------------------------------
--]]
function p.sparseIpairs(t)
	local nums = p.getNumKeys(t)
	local i = 0
	local lim = #nums
	return function ()
		i = i + 1
		if i <= lim then
			local key = nums[i]
			return key, t[key]
		end
	end
end

return p