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