X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Farray.lua;h=2d58e7fb72d623169faa0deeada3dac881154462;hb=9b722d883624f335ef92ad4b9bf89e0924df8778;hp=cbb051d30a972ae620d983e0785e5f6ea7a2ee2f;hpb=94e9a641f46f9079dba8298da118d45d4929f27f;p=prosody.git diff --git a/util/array.lua b/util/array.lua index cbb051d3..2d58e7fb 100644 --- a/util/array.lua +++ b/util/array.lua @@ -9,12 +9,20 @@ local t_insert, t_sort, t_remove, t_concat = table.insert, table.sort, table.remove, table.concat; +local setmetatable = setmetatable; +local math_random = math.random; +local pairs, ipairs = pairs, ipairs; +local tostring = tostring; + local array = {}; local array_base = {}; local array_methods = {}; -local array_mt = { __index = array_methods, __tostring = function (array) return array:concat(", "); end }; +local array_mt = { __index = array_methods, __tostring = function (array) return "{"..array:concat(", ").."}"; end }; -local function new_array(_, t) +local function new_array(self, t, _s, _var) + if type(t) == "function" then -- Assume iterator + t = self.collect(t, _s, _var); + end return setmetatable(t or {}, array_mt); end @@ -27,7 +35,7 @@ setmetatable(array, { __call = new_array }); -- Read-only methods function array_methods:random() - return self[math.random(1,#self)]; + return self[math_random(1,#self)]; end -- These methods can be called two ways: @@ -80,7 +88,7 @@ end function array_methods:shuffle(outa, ina) local len = #self; for i=1,#self do - local r = math.random(i,len); + local r = math_random(i,len); self[i], self[r] = self[r], self[i]; end return self; @@ -104,17 +112,18 @@ function array_methods:append(array) end function array_methods:push(x) - table.insert(self, x); + t_insert(self, x); + return self; end function array_methods:pop(x) local v = self[x]; - table.remove(self, x); + t_remove(self, x); return v; end function array_methods:concat(sep) - return table.concat(array.map(self, tostring), sep); + return t_concat(array.map(self, tostring), sep); end function array_methods:length() @@ -127,7 +136,7 @@ function array.collect(f, s, var) while true do var = f(s, var); if var == nil then break; end - table.insert(t, var); + t_insert(t, var); end return setmetatable(t, array_mt); end