diff options
author | Matthew Wild <mwild1@gmail.com> | 2009-02-26 16:55:46 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2009-02-26 16:55:46 +0000 |
commit | b9636951c1d64ec398a18a40b55ff92d83f50009 (patch) | |
tree | 015f9a1a92204815661b9144d47bb3df5ac3856c | |
parent | 073db87d448354024c663a695be2e4c62e8f506d (diff) | |
download | prosody-b9636951c1d64ec398a18a40b55ff92d83f50009.tar.gz prosody-b9636951c1d64ec398a18a40b55ff92d83f50009.zip |
util.multitable: Add mt:search(), use nil for wildcard keys
-rw-r--r-- | util/multitable.lua | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/util/multitable.lua b/util/multitable.lua index e5e87521..397f9ebe 100644 --- a/util/multitable.lua +++ b/util/multitable.lua @@ -82,6 +82,53 @@ local function remove(self, ...) end +local function s(t, n, results, _end, ...) + if t == nil then return; end + local k = select(n, ...); + if n == _end then + if k == nil then + for _, v in pairs(t) do + t_insert(results, v); + end + else + t_insert(results, t[k]); + end + return; + end + if k then + v = t[k]; + if v then + s(v, n+1, results, _end, ...); + end + else + for _,b in pairs(t) do + s(b, n+1, results, _end, ...); + end + end +end + +-- Search for keys, nil == wildcard +local function search(self, ...) + local _end = select('#', ...); + for n = _end,1 do + if select(n, ...) then _end = n; break; end + end + local results = {}; + s(self.data, 1, results, _end, ...); + return results; +end + +-- Append results to an existing list +local function search_add(self, results, ...) + if not results then results = {}; end + local _end = select('#', ...); + for n = _end,1 do + if select(n, ...) then _end = n; break; end + end + s(self.data, 1, results, _end, ...); + return results; +end + function new() return { data = {}; @@ -89,6 +136,8 @@ function new() add = add; set = set; remove = remove; + search = search; + search_add = search_add; }; end |