Moduuli:Taivutustaulukkotyökalut

Wikisanakirjasta

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:Taivutustaulukkotyökalut/ohje

--- Taivutustaulukoissa käytettäviä hyödyllisiä työkaluja.

local m = {}

--- Kääntää annetun dictin siten, että sen arvot ovat palautetun dictin avaimia ja vastaavat avaimet luetellaan arvoissa.
--
-- Esim.
--   ryhmittele_arvoittain{
--     ["ind.p.y3"] = { "huoli" },
--     ["ind.i.y3"] = { "huoli" },
--     ["ind.kon"]  = { "huoli" },
--     ["kond.y3"]  = { "huolisi" },
--     ["kond.kon"] = { "huolisi" }
--   }
-- 
-- palauttaa
--   {
--     ["huoli"]   = { "ind.i.y3", "ind.kon", "ind.p.y3" },
--     ["huolisi"] = { "kond.kon", "kond.y3" }
--   }
-- 
-- Syötetaulukon arvot voivat olla joko merkkjonoja tai merkkijonotaulukoita. Esim.
-- yllä kaikki kohta voisi kirjoittaa myös ["ind.p.y3"] = "huoli".

function m.ryhmittele_arvoittain(dict_in)
    local dict_out = {}

    -- Lisätään dict_in:in avaimet arvojen mukaisilla avaimilla dict_outiin.
    for k, v in pairs(dict_in) do

        -- Jos arvo on taulukko, käsitellään jokainen taulukon arvo erikseen.
        if type(v) == "table" then
            for i, val in ipairs(v) do
                if not dict_out[val] then
                    dict_out[val] = {}
                end
                table.insert(dict_out[val], k)
            end
            
        else
            if not dict_out[v] then
                dict_out[v] = {}
            end
            table.insert(dict_out[v], k)
        end
    end

    -- Lajitellaan, että tuloslistat ovat aina samat samoilla arvoilla.
    for k, v in pairs(dict_out) do
        table.sort(v)
    end

    return dict_out
end

return m