aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-03-25 03:00:09 +0000
committerMatthew Wild <mwild1@gmail.com>2009-03-25 03:00:09 +0000
commit7b1eacf880c960310c3557065345156763f5fb8b (patch)
treeeb76afe4b3884a634e775b41027216cda08df22c
parentdb2a808e1412fa6f25b2a16a84cc5e250ca9da03 (diff)
downloadprosody-7b1eacf880c960310c3557065345156763f5fb8b.tar.gz
prosody-7b1eacf880c960310c3557065345156763f5fb8b.zip
util.array: New array library
-rw-r--r--util/array.lua45
1 files changed, 45 insertions, 0 deletions
diff --git a/util/array.lua b/util/array.lua
new file mode 100644
index 00000000..5b535fc1
--- /dev/null
+++ b/util/array.lua
@@ -0,0 +1,45 @@
+local array_methods = {};
+local array_mt = { __index = array_methods, __tostring = function (array) return array:concat(", "); end };
+
+local function array(t)
+ return setmetatable(t or {}, array_mt);
+end
+
+function array_methods:map(func, t2)
+ local t2 = t2 or array{};
+ for k,v in ipairs(self) do
+ t2[k] = func(v);
+ end
+ return t2;
+end
+
+function array_methods:filter(func, t2)
+ local t2 = t2 or array{};
+ for k,v in ipairs(self) do
+ if func(v) then
+ t2:push(v);
+ end
+ end
+ return t2;
+end
+
+
+array_methods.push = table.insert;
+array_methods.pop = table.remove;
+array_methods.sort = table.sort;
+array_methods.concat = table.concat;
+array_methods.length = function (t) return #t; end
+
+function array_methods:random()
+ return self[math.random(1,#self)];
+end
+
+function array_methods:shuffle()
+ local len = #self;
+ for i=1,#self do
+ local r = math.random(i,len);
+ self[i], self[r] = self[r], self[i];
+ end
+end
+
+_G.array = array