Software / code / prosody
Comparison
util/set.lua @ 1034:2b0aba0bb013
Merge with 0.4.1
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 22 Apr 2009 20:14:11 +0100 |
| parent | 1030:a82268d507fc |
| child | 1522:569d58d21612 |
comparison
equal
deleted
inserted
replaced
| 1025:efd71cae24ea | 1034:2b0aba0bb013 |
|---|---|
| 1 local ipairs, pairs = | 1 local ipairs, pairs, setmetatable, next, tostring = |
| 2 ipairs, pairs; | 2 ipairs, pairs, setmetatable, next, tostring; |
| 3 local t_concat = table.concat; | |
| 3 | 4 |
| 4 module "set" | 5 module "set" |
| 5 | 6 |
| 7 local set_mt = {}; | |
| 8 function set_mt.__call(set, _, k) | |
| 9 return next(set._items, k); | |
| 10 end | |
| 11 function set_mt.__add(set1, set2) | |
| 12 return _M.union(set1, set2); | |
| 13 end | |
| 14 function set_mt.__sub(set1, set2) | |
| 15 return _M.difference(set1, set2); | |
| 16 end | |
| 17 function set_mt.__div(set, func) | |
| 18 local new_set, new_items = _M.new(); | |
| 19 local items, new_items = set._items, new_set._items; | |
| 20 for item in pairs(items) do | |
| 21 if func(item) then | |
| 22 new_items[item] = true; | |
| 23 end | |
| 24 end | |
| 25 return new_set; | |
| 26 end | |
| 27 function set_mt.__eq(set1, set2) | |
| 28 local set1, set2 = set1._items, set2._items; | |
| 29 for item in pairs(set1) do | |
| 30 if not set2[item] then | |
| 31 return false; | |
| 32 end | |
| 33 end | |
| 34 | |
| 35 for item in pairs(set2) do | |
| 36 if not set1[item] then | |
| 37 return false; | |
| 38 end | |
| 39 end | |
| 40 | |
| 41 return true; | |
| 42 end | |
| 43 function set_mt.__tostring(set) | |
| 44 local s, items = { }, set._items; | |
| 45 for item in pairs(items) do | |
| 46 s[#s+1] = tostring(item); | |
| 47 end | |
| 48 return t_concat(s, ", "); | |
| 49 end | |
| 50 | |
| 51 local items_mt = {}; | |
| 52 function items_mt.__call(items, _, k) | |
| 53 return next(items, k); | |
| 54 end | |
| 55 | |
| 6 function new(list) | 56 function new(list) |
| 7 local items = {}; | 57 local items = setmetatable({}, items_mt); |
| 8 local set = { _items = items }; | 58 local set = { _items = items }; |
| 9 | 59 |
| 10 function set:add(item) | 60 function set:add(item) |
| 11 items[item] = true; | 61 items[item] = true; |
| 12 end | 62 end |
| 39 for item in pairs(otherset) do | 89 for item in pairs(otherset) do |
| 40 items[item] = nil; | 90 items[item] = nil; |
| 41 end | 91 end |
| 42 end | 92 end |
| 43 | 93 |
| 94 function set:empty() | |
| 95 return not next(items); | |
| 96 end | |
| 97 | |
| 44 if list then | 98 if list then |
| 45 set:add_list(list); | 99 set:add_list(list); |
| 46 end | 100 end |
| 47 | 101 |
| 48 return set; | 102 return setmetatable(set, set_mt); |
| 49 end | 103 end |
| 50 | 104 |
| 51 function union(set1, set2) | 105 function union(set1, set2) |
| 52 local set = new(); | 106 local set = new(); |
| 53 local items = set._items; | 107 local items = set._items; |
| 85 end | 139 end |
| 86 | 140 |
| 87 return set; | 141 return set; |
| 88 end | 142 end |
| 89 | 143 |
| 144 function xor(set1, set2) | |
| 145 return union(set1, set2) - intersection(set1, set2); | |
| 146 end | |
| 147 | |
| 90 return _M; | 148 return _M; |