core.configmanager: Make components use 'component' module by default if none specified
[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] = true;
72         end
73
74         for item in pairs(set2.items) do
75                 items[item] = nil;
76         end
77         
78         return set;
79 end
80
81 return _M;