diff options
author | 2016-11-02 08:36:07 +0100 | |
---|---|---|
committer | 2016-11-02 08:36:07 +0100 | |
commit | 6c390127c2fcd0bfeef0ff01cbf55a12fd1a2922 (patch) | |
tree | 1d7ec90b0c1796c900a1cc98911926610a1e75e9 /3rdparty/genie/src/base/set.lua | |
parent | 7fc31a0776473664273c399ae4d36c4c9884f1b2 (diff) |
Update to latest GENie (nw)
Diffstat (limited to '3rdparty/genie/src/base/set.lua')
-rw-r--r-- | 3rdparty/genie/src/base/set.lua | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/3rdparty/genie/src/base/set.lua b/3rdparty/genie/src/base/set.lua new file mode 100644 index 00000000000..04936560d40 --- /dev/null +++ b/3rdparty/genie/src/base/set.lua @@ -0,0 +1,77 @@ +Set_mt = {} + +function Set(t) + local set = {} + for k, l in ipairs(t) do + set[l] = true + end + setmetatable(set, Set_mt) + return set +end + +function Set_mt.union(a, b) + local res = Set{} + for k in pairs(a) do res[k] = true end + for k in pairs(b) do res[k] = true end + return res +end + +function Set_mt.intersection(a, b) + local res = Set{} + for k in pairs(a) do + res[k] = b[k] + end + return res +end + +local function get_cache(a) + if not rawget(a, "__cache") then + rawset(a, "__cache", Set_mt.totable(a)) + end + return rawget(a, "__cache") +end + +function Set_mt.len(a) + return #get_cache(a) +end + +function Set_mt.implode(a, sep) + return table.concat(get_cache(a), sep) +end + +function Set_mt.totable(a) + local res = {} + for k in pairs(a) do + table.insert(res, k) + end + return res +end + +function Set_mt.difference(a, b) + if getmetatable(b) ~= Set_mt then + if type(b) ~= "table" then + error(type(b).." is not a Set or table") + end + b=Set(b) + end + + local res = Set{} + for k in pairs(a) do + res[k] = not b[k] or nil + end + rawset(res, "__cache", nil) + return res +end + +function Set_mt.__index(a, i) + if type(i) == "number" then + return get_cache(a)[i] + end + return Set_mt[i] or rawget(a, i) +end + +Set_mt.__add = Set_mt.union +Set_mt.__mul = Set_mt.intersection +Set_mt.__sub = Set_mt.difference +Set_mt.__len = Set_mt.len +Set_mt.__concat = Set_mt.implode
\ No newline at end of file |