Software / code / prosody
Comparison
util/array.lua @ 7019:abcd5ec3ee41
util.array: Fix minory style issues
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 23 Dec 2015 08:32:13 +0100 |
| parent | 6777:5de6b93d0190 |
| child | 7020:6ab9c691c4c6 |
comparison
equal
deleted
inserted
replaced
| 7018:5c3d4254d415 | 7019:abcd5ec3ee41 |
|---|---|
| 35 | 35 |
| 36 setmetatable(array, { __call = new_array }); | 36 setmetatable(array, { __call = new_array }); |
| 37 | 37 |
| 38 -- Read-only methods | 38 -- Read-only methods |
| 39 function array_methods:random() | 39 function array_methods:random() |
| 40 return self[math_random(1,#self)]; | 40 return self[math_random(1, #self)]; |
| 41 end | 41 end |
| 42 | 42 |
| 43 -- These methods can be called two ways: | 43 -- These methods can be called two ways: |
| 44 -- array.method(existing_array, [params [, ...]]) -- Create new array for result | 44 -- array.method(existing_array, [params [, ...]]) -- Create new array for result |
| 45 -- existing_array:method([params, ...]) -- Transform existing array into result | 45 -- existing_array:method([params, ...]) -- Transform existing array into result |
| 46 -- | 46 -- |
| 47 function array_base.map(outa, ina, func) | 47 function array_base.map(outa, ina, func) |
| 48 for k,v in ipairs(ina) do | 48 for k, v in ipairs(ina) do |
| 49 outa[k] = func(v); | 49 outa[k] = func(v); |
| 50 end | 50 end |
| 51 return outa; | 51 return outa; |
| 52 end | 52 end |
| 53 | 53 |
| 54 function array_base.filter(outa, ina, func) | 54 function array_base.filter(outa, ina, func) |
| 55 local inplace, start_length = ina == outa, #ina; | 55 local inplace, start_length = ina == outa, #ina; |
| 56 local write = 1; | 56 local write = 1; |
| 57 for read=1,start_length do | 57 for read = 1, start_length do |
| 58 local v = ina[read]; | 58 local v = ina[read]; |
| 59 if func(v) then | 59 if func(v) then |
| 60 outa[write] = v; | 60 outa[write] = v; |
| 61 write = write + 1; | 61 write = write + 1; |
| 62 end | 62 end |
| 63 end | 63 end |
| 64 | 64 |
| 65 if inplace and write <= start_length then | 65 if inplace and write <= start_length then |
| 66 for i=write,start_length do | 66 for i = write, start_length do |
| 67 outa[i] = nil; | 67 outa[i] = nil; |
| 68 end | 68 end |
| 69 end | 69 end |
| 70 | 70 |
| 71 return outa; | 71 return outa; |
| 78 t_sort(outa, ...); | 78 t_sort(outa, ...); |
| 79 return outa; | 79 return outa; |
| 80 end | 80 end |
| 81 | 81 |
| 82 function array_base.pluck(outa, ina, key) | 82 function array_base.pluck(outa, ina, key) |
| 83 for i=1,#ina do | 83 for i = 1, #ina do |
| 84 outa[i] = ina[i][key]; | 84 outa[i] = ina[i][key]; |
| 85 end | 85 end |
| 86 return outa; | 86 return outa; |
| 87 end | 87 end |
| 88 | 88 |
| 106 end | 106 end |
| 107 | 107 |
| 108 --- These methods only mutate the array | 108 --- These methods only mutate the array |
| 109 function array_methods:shuffle(outa, ina) | 109 function array_methods:shuffle(outa, ina) |
| 110 local len = #self; | 110 local len = #self; |
| 111 for i=1,#self do | 111 for i = 1, #self do |
| 112 local r = math_random(i,len); | 112 local r = math_random(i, len); |
| 113 self[i], self[r] = self[r], self[i]; | 113 self[i], self[r] = self[r], self[i]; |
| 114 end | 114 end |
| 115 return self; | 115 return self; |
| 116 end | 116 end |
| 117 | 117 |
| 118 function array_methods:append(array) | 118 function array_methods:append(array) |
| 119 local len,len2 = #self, #array; | 119 local len, len2 = #self, #array; |
| 120 for i=1,len2 do | 120 for i = 1, len2 do |
| 121 self[len+i] = array[i]; | 121 self[len+i] = array[i]; |
| 122 end | 122 end |
| 123 return self; | 123 return self; |
| 124 end | 124 end |
| 125 | 125 |
| 145 --- These methods always create a new array | 145 --- These methods always create a new array |
| 146 function array.collect(f, s, var) | 146 function array.collect(f, s, var) |
| 147 local t = {}; | 147 local t = {}; |
| 148 while true do | 148 while true do |
| 149 var = f(s, var); | 149 var = f(s, var); |
| 150 if var == nil then break; end | 150 if var == nil then break; end |
| 151 t_insert(t, var); | 151 t_insert(t, var); |
| 152 end | 152 end |
| 153 return setmetatable(t, array_mt); | 153 return setmetatable(t, array_mt); |
| 154 end | 154 end |
| 155 | 155 |