106 665
contributi
(Inserite funzioni deepSearch e map) |
(Rimossi parametri sequential e inPlace da table.map: il primo era inutile, il secondo dava problemi con table.filter, quindi è stato rimosso per uniformità, essendo una feature non indispensabile. Aggiunti metodi table.equal, table.merge e table.filt...) |
||
has been found, thus returning
--]]
local
return k, unpack(valueKeys), last
end
end
--[[
Applica una funzione ad ogni elemento di una table
ritornandone un'altra con i risultati aventi la stessa
chiave dell'elemento dato in ingresso alla funzione
La funzione riceve in ingresso un elemento e la sua
placeholder.
--]]
table.map = function(tab, funct)
local dest = {}
for key, value in pairs(tab) do
dest[key] = funct(value, key)
end
return dest
end
t.map = table.map
--[[
Indica se due tables sono uguali, nel più
brutale dei possibili significati: stessi
elementi associati alle stesse chiavi.
Per comodità, ritorna true anche se gli
argomenti non sono tables, purché siano
uguali.
--]]
table.
--[[
Si confrontano direttamente gli argomenti se
uno dei due ha il metamethod __eq o se uno
dei due non è una table
--]]
local mt1 = getmetatable(tab1)
local mt2 = getmetatable(tab2)
if mt1 and mt1.__eq or mt2 and mt2.__eq
or type(tab1) ~= 'table'
or type(tab2) ~= 'table' then
return tab1 == tab2
end
--[[
Se si hanno due riferimenti alla stessa
table si evitano molte computazioni inutili
--]]
if tab1 == tab2 then
return true
end
--[[
Se il numero di elementi è diverso le due
tables non possono essere uguali. Inoltre
gestisce anche il caso in cui tab1 sia vuota
e tab2 no, che porterebbe a tornare true
poiché il loop viene skippato, e quello in
cui tab1 sia un sottoinsieme di tab2 poiché
si controllano solo gli indici della prima.
--]]
if table.getn(tab1) ~= table.getn(tab2) then
return false
end
for key, value in pairs(tab1) do
--[[
Stante la type safety di table.equal, è
più comodo fare così
--]]
if not table.equal(value, tab2[key]) then
return false
end
end
return true
end
table.eq = table.equal
t.equal, t.eq = table.qual, table.equal
--[[
Ritorna una table risultato della fusione delle
due passate. Gli indici numerici della seconda
seguiranno quelli della prima; gli altri sono
lasciati invariati, ed in caso di uguaglianza
quelli della seconda sovrascrivono quelli della
prima.
--]]
table.merge = function(tab1, tab2, inPlace)
local dest = mw.clone(tab1)
--[[
È necessario il doppio ciclo per avere
le chiavi intere in ordine
--]]
for key, value in ipairs(tab2) do
table.insert(dest, value)
end
for key, value in pairs(tab2) do
if type(key) ~= 'number'
or key ~= math.floor(key) then
dest[key] = value
end
end
return dest
end
t.
--[[
Ritorna una table con i soli elementi che
rispettano la condizione passata. Tale
funzione deve quindi ritornare un booleano,
avendo in ingresso un elemento e la sua
chiave, in quest'ordine perché la chiave
non è sempre necessaria e sarebbe fastidioso
avere un argomento placeholder.
Le chiavi rimangono invariate con la sola
eccezione di quelle numeriche, che sono
rese continue
--]]
table.filter = function(tab, cond)
local dest = {}
--[[
È necessario il doppio ciclo per avere
le chiavi intere in ordine
--]]
for key, value in ipairs(tab) do
if cond(value, key) then
table.insert(dest, value)
end
end
for key, value in pairs(tab) do
if (type(key) ~= 'number'
or key ~= math.floor(key))
and cond(value, key) then
dest[key] = value
end
end
return dest
end
t.filter = table.filter
return t
|