Aller au contenu

Module:TableBuilder

Cette page est protégée.
Une page de Wikipédia, l'encyclopédie libre.

TableBuilder est un module qui applique aux fonctions de la librairie Table une interface fluide. Le code est ainsi Ă  la fois plus concis et plus clair.

Attention : ce module ne devrait ĂȘtre utilisĂ© que pour des tables sĂ©quences, ou au pire des tables dont les Ă©lĂ©ments sont connus et limitĂ©s. En effet, ajouter Ă  la table un Ă©lĂ©ment ayant pour index le nom d'une de ces fonctions remplace la fonction par cet Ă©lĂ©ment.

Utilisation

Vous devez premiĂšrement charger le module :

local TableBuilder = require('Module:TableBuilder')

DeuxiĂšmement, vous devez instancier le tableau, avec new pour une nouvelle table, avec set pour une table existante, ou en clonant une table existante.

local tab1 = TableBuilder.new()
TableBuilder.set(tab2)
local tab1 = TableBuilder.clone(tab3)

Ensuite, vous pouvez utiliser les méthodes énumérées dans la librairie Table (insert, remove, sort, maxn) ou une des fonctions spécifiques décrites ci-dessous.

Enfin, vous devez concatĂ©ner la table en utilisant la mĂ©thode concat() :

tab.concat()

Fonctions spécifiques

  • minsert( ... ) — permet des inserts multiples, pour ajouter en une opĂ©ration plusieurs Ă©lĂ©ments Ă  la fin de la table. Les paramĂštres passĂ©s Ă  la fonction valant false ou nil sont ignorĂ©s.
  • tinsert( table2, i, j ) — ajoute Ă  la fin de la table les Ă©lĂ©ments table2[i] Ă  table2[j]. La valeur par dĂ©faut de i est 1, et la valeur par dĂ©faut de j est la longueur de la table. Si i est plus grand que j aucun Ă©lĂ©ment n'est ajoutĂ©.

clone

TableBuilder.clone duplique une table existante, de façon récursive.

Contrairement à mw.clone, cette fonction ne clone pas la meta-table, mais utilise la meta-table de TableBuilder. Ceci permet notamment de modifier une table chargée par mw.loadData.

Cette fonction ne devrait pas ĂȘtre utilisĂ©e sur la totalitĂ© de la table chargĂ©e par loadData (utiliser require sera plus Ă©conome en mĂ©moire) mais sur une petite sous-table.

Exemples

local TableBuilder = require( 'Module:TableBuilder' )

local date = { 'Cet exemple a été modifié le' }

TableBuilder.set( date )

date.insert( "4" )
    .insert( "2013" )
    .insert( 3, "septembre" )

local time = TableBuilder.new()
local heure, minute = "12", "8"
local seconde

time.minsert( "Ă ", heure, "heures et", minute, "minutes", seconde, seconde and "secondes" )

date.tinsert( time )

local s = date.concat( ' ' ) .. "."
--s = 'Cet exemple a été modifié le 4 septembre 2013 à 12 h et 8 minutes.'
--Module appliquant aux fonctions de la librairie Table une inteface fluide.

local meta = {

    insert = function ( t, ... )
        table.insert( t, ... )
        return t
    end,

    remove = function ( t, ... )
        table.remove( t, ... )
        return t
    end,

    sort = function ( t, ... )
        table.sort( t, ... )
        return t
    end,

    maxn = function ( t )
        return table.maxn( t )
    end,

    concat = function ( t, ... )
        return table.concat( t, ... )
    end,

    minsert = function( t, ... )
        for i = 1, select( '#', ... ) do
            local sel = select( i, ... )
            if sel then
                t[#t+1] = sel
            end
        end
        return t
    end,

    tinsert = function( t, tab, first, last )
        if type( tab ) == 'table' then
            for i = ( tonumber( first ) or 1 ), ( tonumber( last ) or #tab ) do
                t[#t+1] = tab[i]
            end
        end
        return t
    end,
}

meta.__index = function ( t, key )
    local metafunc = meta[key]
    if type( metafunc ) == 'function' then
        return function ( ... ) return metafunc( t, ... ) end
    end
end

-- fin des fonctions de la meta-table


local TableBuilder = {
    new = function( ... )
        local t = { ... }
        setmetatable( t, meta )
        return t
    end,

    set = function( t )
        if type( t ) == 'table' then
            setmetatable( t, meta )
        end
        return t
    end,

    clone = function ( t )
        local tableRefs = { }
        local function recursiveClone( val )
            if type( val ) == 'table' then
                -- Encode circular references correctly
                if tableRefs[val] ~= nil then
                    return tableRefs[val]
                end

                local retVal = { }
                tableRefs[val] = setmetatable( retVal, meta )

                for key, elt in pairs( val ) do
                    retVal[key] = recursiveClone( elt )
                end
                return retVal
            else
                return val
            end
        end
        return recursiveClone( t )
    end,
}

return TableBuilder