Mercurial > prosody-hg
comparison util/array.lua @ 5857:8613888d0f9e
util.array: Improve array:reverse() and make it work as both method and non-mutating function
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 06 Oct 2013 23:18:54 +0200 |
| parents | bd0ff8ae98a8 |
| children | 060b63a27e9b |
comparison
equal
deleted
inserted
replaced
| 5856:e3e593eb81d1 | 5857:8613888d0f9e |
|---|---|
| 9 local t_insert, t_sort, t_remove, t_concat | 9 local t_insert, t_sort, t_remove, t_concat |
| 10 = table.insert, table.sort, table.remove, table.concat; | 10 = table.insert, table.sort, table.remove, table.concat; |
| 11 | 11 |
| 12 local setmetatable = setmetatable; | 12 local setmetatable = setmetatable; |
| 13 local math_random = math.random; | 13 local math_random = math.random; |
| 14 local math_floor = math.floor; | |
| 14 local pairs, ipairs = pairs, ipairs; | 15 local pairs, ipairs = pairs, ipairs; |
| 15 local tostring = tostring; | 16 local tostring = tostring; |
| 16 | 17 |
| 17 local array = {}; | 18 local array = {}; |
| 18 local array_base = {}; | 19 local array_base = {}; |
| 82 outa[i] = ina[i][key]; | 83 outa[i] = ina[i][key]; |
| 83 end | 84 end |
| 84 return outa; | 85 return outa; |
| 85 end | 86 end |
| 86 | 87 |
| 88 function array_base.reverse(outa, ina) | |
| 89 local len = #ina; | |
| 90 if ina == outa then | |
| 91 local middle = math_floor(len/2); | |
| 92 len = len + 1; | |
| 93 local o; -- opposite | |
| 94 for i = 1, middle do | |
| 95 o = len - i; | |
| 96 outa[i], outa[o] = outa[o], outa[i]; | |
| 97 end | |
| 98 else | |
| 99 local off = len + 1; | |
| 100 for i = 1, len do | |
| 101 outa[i] = ina[off - i]; | |
| 102 end | |
| 103 end | |
| 104 return outa; | |
| 105 end | |
| 106 | |
| 87 --- These methods only mutate the array | 107 --- These methods only mutate the array |
| 88 function array_methods:shuffle(outa, ina) | 108 function array_methods:shuffle(outa, ina) |
| 89 local len = #self; | 109 local len = #self; |
| 90 for i=1,#self do | 110 for i=1,#self do |
| 91 local r = math_random(i,len); | 111 local r = math_random(i,len); |
| 92 self[i], self[r] = self[r], self[i]; | 112 self[i], self[r] = self[r], self[i]; |
| 93 end | |
| 94 return self; | |
| 95 end | |
| 96 | |
| 97 function array_methods:reverse() | |
| 98 local len = #self-1; | |
| 99 for i=len,1,-1 do | |
| 100 self:push(self[i]); | |
| 101 self:pop(i); | |
| 102 end | 113 end |
| 103 return self; | 114 return self; |
| 104 end | 115 end |
| 105 | 116 |
| 106 function array_methods:append(array) | 117 function array_methods:append(array) |
