Jump to content

Module:TableTools: Difference between revisions

fix the valueUnion function for NaNs (and make it a lot simpler to boot)
m>Mr. Stradivarius
(remove shallowClone - hardly worth having this in here)
m>Mr. Stradivarius
(fix the valueUnion function for NaNs (and make it a lot simpler to boot))
Line 17: Line 17:
local infinity = math.huge
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkType = libraryUtil.checkType
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key.
local nan = {}


--[[
--[[
Line 140: Line 137:
function p.valueUnion(...)
function p.valueUnion(...)
local lim = select('#', ...)  
local lim = select('#', ...)  
if lim == 0 then
if lim < 2 then
error("no arguments passed to 'valueUnion'", 2)
error(lim .. ' argument' .. (lim == 1 and '' or 's') .. " passed to 'valueUnion' (minimum is 2)", 2)
end
end
local vals, ret = {}, {}
local isNan = p.isNan
local ret, exists = {}, {}
for i = 1, lim do
for i = 1, lim do
local t = select(i, ...)
local t = select(i, ...)
checkType('valueUnion', i, t, 'table')
checkType('valueUnion', i, t, 'table')
for k, v in pairs(t) do
for k, v in pairs(t) do
if type(v) == 'number' and tostring(v) == '-nan' then
if isNan(v) then
v = nan -- NaN cannot be a table key, so use a proxy variable.
ret[#ret + 1] = v
elseif not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
vals[v] = true
end
end
for val in pairs(vals) do
if val == nan then
-- This ensures that we output a NaN when we had one as input, although
-- they may have been generated in a completely different way.
val = 0/0
end
end
ret[#ret + 1] = val
end
end
return ret
return ret
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.