array.lua

Tue, 21 Sep 2010 10:22:30 +0100

author
will@willthompson.co.uk
date
Tue, 21 Sep 2010 10:22:30 +0100
changeset 5
db500386b9c4
parent 0
d17a1b659852
permissions
-rw-r--r--

Correctly close <title> tag in report.html

0
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 --
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 --
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local t_insert, t_sort, t_remove, t_concat
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 = table.insert, table.sort, table.remove, table.concat;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local array = {};
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local array_base = {};
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local array_methods = {};
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local array_mt = { __index = array_methods, __tostring = function (array) return array:concat(", "); end };
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local function new_array(_, t)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 return setmetatable(t or {}, array_mt);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 function array_mt.__add(a1, a2)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local res = new_array();
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 return res:append(a1):append(a2);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 setmetatable(array, { __call = new_array });
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 function array_base.map(outa, ina, func)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 for k,v in ipairs(ina) do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 outa[k] = func(v);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 return outa;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 function array_base.filter(outa, ina, func)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local inplace, start_length = ina == outa, #ina;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 local write = 1;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 for read=1,start_length do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 local v = ina[read];
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 if func(v) then
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 outa[write] = v;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 write = write + 1;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 if inplace and write <= start_length then
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 for i=write,start_length do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 outa[i] = nil;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 return outa;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 function array_base.sort(outa, ina, ...)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 if ina ~= outa then
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 outa:append(ina);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 t_sort(outa, ...);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 return outa;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 --- These methods only mutate
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 function array_methods:random()
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 return self[math.random(1,#self)];
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 function array_methods:shuffle(outa, ina)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 local len = #self;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 for i=1,#self do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 local r = math.random(i,len);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 self[i], self[r] = self[r], self[i];
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 return self;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 function array_methods:reverse()
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 local len = #self-1;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 for i=len,1,-1 do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 self:push(self[i]);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 self:pop(i);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 return self;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 function array_methods:append(array)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 local len,len2 = #self, #array;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 for i=1,len2 do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 self[len+i] = array[i];
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 return self;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 array_methods.push = table.insert;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 array_methods.pop = table.remove;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 array_methods.concat = table.concat;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 array_methods.length = function (t) return #t; end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 --- These methods always create a new array
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 function array.collect(f, s, var)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 local t, var = {};
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 while true do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 var = f(s, var);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 if var == nil then break; end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 table.insert(t, var);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 return setmetatable(t, array_mt);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 ---
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 -- Setup methods from array_base
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 for method, f in pairs(array_base) do
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 local base_method = f;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 -- Setup global array method which makes new array
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 array[method] = function (old_a, ...)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 local a = new_array();
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 return base_method(a, old_a, ...);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 -- Setup per-array (mutating) method
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 array_methods[method] = function (self, ...)
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 return base_method(self, self, ...);
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 end
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 _G.array = array;
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 module("array");
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128
d17a1b659852 Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 return array;

mercurial