util.set: New util library
[prosody.git] / util / set.lua
1
2 module "set"
3
4 function new(list)
5         local items = {};
6         local set = { items = items };
7         
8         function set:add(set, item)
9                 items[item] = true;
10         end
11         
12         function set:contains(set, item)
13                 return items[item]
14         end
15         
16         function set:items(set)
17                 return items;
18         end
19         
20         function set:remove(set, item)
21                 items[item] = nil;
22         end
23         
24         function set:add_list(set, list)
25                 for _, item in ipairs(list) do
26                         items[item] = true;
27                 end
28         end
29         
30         function set:include(set, otherset)
31                 for item in pairs(otherset) do
32                         items[item] = true;
33                 end
34         end
35
36         function set:exclude(set, otherset)
37                 for item in pairs(otherset) do
38                         items[item] = nil;
39                 end
40         end
41         
42         return set;
43 end
44
45 function union(set1, set2)
46         local set = new();
47         local items = set.items;
48         
49         for item in pairs(set1.items) do
50                 items[item] = true;
51         end
52
53         for item in pairs(set2.items) do
54                 items[item] = true;
55         end
56         
57         return set;
58 end
59
60 function difference(set1, set2)
61         local set = new();
62         local items = set.items;
63         
64         for item in pairs(set1.items) do
65                 items[item] = true;
66         end
67
68         for item in pairs(set2.items) do
69                 items[item] = nil;
70         end
71         
72         return set;
73 end
74
75 return _M;