Module:TableBuilder : Différence entre versions
(set et tinsert : + vérification du type ldes 'élément fournit.) |
m (A protégé « Module:TableBuilder » : Modèle très utilisé : à la demande de son créateur ([Modifier=Autoriser uniquement les administrateurs] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini))) |
||
(Une révision intermédiaire par un autre utilisateur non affichée) | |||
Ligne 1 : | Ligne 1 : | ||
--Module appliquant aux fonctions de la librairie Table une inteface fluide. | --Module appliquant aux fonctions de la librairie Table une inteface fluide. | ||
− | local meta = { | + | local meta = { |
− | + | insert = function ( t, ... ) | |
− | + | table.insert( t, ... ) | |
− | + | return t | |
− | end | + | end, |
− | + | ||
− | + | remove = function ( t, ... ) | |
− | + | table.remove( t, ... ) | |
− | + | return t | |
− | end | + | end, |
− | + | ||
− | + | sort = function ( t, ... ) | |
− | + | table.sort( t, ... ) | |
− | + | return t | |
− | end | + | end, |
− | + | ||
− | + | maxn = function ( t ) | |
− | + | return table.maxn( t ) | |
− | end | + | end, |
− | + | ||
− | + | concat = function ( t, ... ) | |
− | + | return table.concat( t, ... ) | |
− | end | + | end, |
+ | |||
+ | minsert = function( t, ... ) | ||
+ | local sel | ||
+ | for i = 1, select( '#', ... ) do | ||
+ | sel = select( i, ... ) | ||
+ | if sel then | ||
+ | table.insert( t, 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 | ||
+ | table.insert( t, tab[i] ) | ||
+ | end | ||
+ | end | ||
+ | return t | ||
+ | end, | ||
+ | } | ||
meta.__index = function ( t, key ) | meta.__index = function ( t, key ) | ||
Ligne 32 : | Ligne 53 : | ||
end | end | ||
end | end | ||
+ | |||
+ | -- fin des fonctions de la meta-table | ||
+ | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
local TableBuilder = { | local TableBuilder = { | ||
new = function( ... ) | new = function( ... ) | ||
Ligne 65 : | Ligne 69 : | ||
end | end | ||
return t | return t | ||
− | end | + | 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 | return TableBuilder |
Version actuelle datée du 30 septembre 2013 à 19:18
La documentation pour ce module peut être créée à Module:TableBuilder/doc
--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, ... ) local sel for i = 1, select( '#', ... ) do sel = select( i, ... ) if sel then table.insert( t, 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 table.insert( t, 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