X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Farray.lua;h=d4ab1771111cb543db105942892005177dbbd612;hb=59224f73ca26a00292f127e081af3cf47f57ae1f;hp=9bf215af72c9d73b0b09e1fb31ccaf95fa8a6f4a;hpb=37105ec863ddbb6fe6885269d816e0a48f82bbf5;p=prosody.git diff --git a/util/array.lua b/util/array.lua index 9bf215af..d4ab1771 100644 --- a/util/array.lua +++ b/util/array.lua @@ -11,8 +11,10 @@ local t_insert, t_sort, t_remove, t_concat local setmetatable = setmetatable; local math_random = math.random; +local math_floor = math.floor; local pairs, ipairs = pairs, ipairs; local tostring = tostring; +local type = type; local array = {}; local array_base = {}; @@ -84,6 +86,25 @@ function array_base.pluck(outa, ina, key) return outa; end +function array_base.reverse(outa, ina) + local len = #ina; + if ina == outa then + local middle = math_floor(len/2); + len = len + 1; + local o; -- opposite + for i = 1, middle do + o = len - i; + outa[i], outa[o] = outa[o], outa[i]; + end + else + local off = len + 1; + for i = 1, len do + outa[i] = ina[off - i]; + end + end + return outa; +end + --- These methods only mutate the array function array_methods:shuffle(outa, ina) local len = #self; @@ -94,15 +115,6 @@ function array_methods:shuffle(outa, ina) return self; end -function array_methods:reverse() - local len = #self-1; - for i=len,1,-1 do - self:push(self[i]); - self:pop(i); - end - return self; -end - function array_methods:append(array) local len,len2 = #self, #array; for i=1,len2 do @@ -157,7 +169,4 @@ for method, f in pairs(array_base) do end end -_G.array = array; -module("array"); - return array;