Software /
code /
prosody
Comparison
util/array.lua @ 4449:ca74d8ed1a15
util.array: Avoid globals.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Fri, 09 Dec 2011 12:02:21 +0500 |
parent | 4448:d745f4c28294 |
child | 5085:cbc7eb5cfa8c |
comparison
equal
deleted
inserted
replaced
4448:d745f4c28294 | 4449:ca74d8ed1a15 |
---|---|
6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
7 -- | 7 -- |
8 | 8 |
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 | |
12 local setmetatable = setmetatable; | |
13 local math_random = math.random; | |
14 local pairs, ipairs = pairs, ipairs; | |
15 local tostring = tostring; | |
11 | 16 |
12 local array = {}; | 17 local array = {}; |
13 local array_base = {}; | 18 local array_base = {}; |
14 local array_methods = {}; | 19 local array_methods = {}; |
15 local array_mt = { __index = array_methods, __tostring = function (array) return array:concat(", "); end }; | 20 local array_mt = { __index = array_methods, __tostring = function (array) return array:concat(", "); end }; |
25 | 30 |
26 setmetatable(array, { __call = new_array }); | 31 setmetatable(array, { __call = new_array }); |
27 | 32 |
28 -- Read-only methods | 33 -- Read-only methods |
29 function array_methods:random() | 34 function array_methods:random() |
30 return self[math.random(1,#self)]; | 35 return self[math_random(1,#self)]; |
31 end | 36 end |
32 | 37 |
33 -- These methods can be called two ways: | 38 -- These methods can be called two ways: |
34 -- array.method(existing_array, [params [, ...]]) -- Create new array for result | 39 -- array.method(existing_array, [params [, ...]]) -- Create new array for result |
35 -- existing_array:method([params, ...]) -- Transform existing array into result | 40 -- existing_array:method([params, ...]) -- Transform existing array into result |
78 | 83 |
79 --- These methods only mutate the array | 84 --- These methods only mutate the array |
80 function array_methods:shuffle(outa, ina) | 85 function array_methods:shuffle(outa, ina) |
81 local len = #self; | 86 local len = #self; |
82 for i=1,#self do | 87 for i=1,#self do |
83 local r = math.random(i,len); | 88 local r = math_random(i,len); |
84 self[i], self[r] = self[r], self[i]; | 89 self[i], self[r] = self[r], self[i]; |
85 end | 90 end |
86 return self; | 91 return self; |
87 end | 92 end |
88 | 93 |
102 end | 107 end |
103 return self; | 108 return self; |
104 end | 109 end |
105 | 110 |
106 function array_methods:push(x) | 111 function array_methods:push(x) |
107 table.insert(self, x); | 112 t_insert(self, x); |
108 return self; | 113 return self; |
109 end | 114 end |
110 | 115 |
111 function array_methods:pop(x) | 116 function array_methods:pop(x) |
112 local v = self[x]; | 117 local v = self[x]; |
113 table.remove(self, x); | 118 t_remove(self, x); |
114 return v; | 119 return v; |
115 end | 120 end |
116 | 121 |
117 function array_methods:concat(sep) | 122 function array_methods:concat(sep) |
118 return table.concat(array.map(self, tostring), sep); | 123 return t_concat(array.map(self, tostring), sep); |
119 end | 124 end |
120 | 125 |
121 function array_methods:length() | 126 function array_methods:length() |
122 return #self; | 127 return #self; |
123 end | 128 end |
126 function array.collect(f, s, var) | 131 function array.collect(f, s, var) |
127 local t = {}; | 132 local t = {}; |
128 while true do | 133 while true do |
129 var = f(s, var); | 134 var = f(s, var); |
130 if var == nil then break; end | 135 if var == nil then break; end |
131 table.insert(t, var); | 136 t_insert(t, var); |
132 end | 137 end |
133 return setmetatable(t, array_mt); | 138 return setmetatable(t, array_mt); |
134 end | 139 end |
135 | 140 |
136 --- | 141 --- |