Comparison

util/set.lua @ 6054:7a5ddbaf758d

Merge 0.9->0.10
author Matthew Wild <mwild1@gmail.com>
date Wed, 02 Apr 2014 17:41:38 +0100
parent 5908:081a91507e4f
child 6673:b123fcd65d2e
comparison
equal deleted inserted replaced
6053:2f93a04564b2 6054:7a5ddbaf758d
1 -- Prosody IM 1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild 2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain 3 -- Copyright (C) 2008-2010 Waqas Hussain
4 -- 4 --
5 -- This project is MIT/X11 licensed. Please see the 5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information. 6 -- COPYING file in the source package for more information.
7 -- 7 --
8 8
9 local ipairs, pairs, setmetatable, next, tostring = 9 local ipairs, pairs, setmetatable, next, tostring =
38 for item in pairs(set1) do 38 for item in pairs(set1) do
39 if not set2[item] then 39 if not set2[item] then
40 return false; 40 return false;
41 end 41 end
42 end 42 end
43 43
44 for item in pairs(set2) do 44 for item in pairs(set2) do
45 if not set1[item] then 45 if not set1[item] then
46 return false; 46 return false;
47 end 47 end
48 end 48 end
49 49
50 return true; 50 return true;
51 end 51 end
52 function set_mt.__tostring(set) 52 function set_mt.__tostring(set)
53 local s, items = { }, set._items; 53 local s, items = { }, set._items;
54 for item in pairs(items) do 54 for item in pairs(items) do
63 end 63 end
64 64
65 function new(list) 65 function new(list)
66 local items = setmetatable({}, items_mt); 66 local items = setmetatable({}, items_mt);
67 local set = { _items = items }; 67 local set = { _items = items };
68 68
69 function set:add(item) 69 function set:add(item)
70 items[item] = true; 70 items[item] = true;
71 end 71 end
72 72
73 function set:contains(item) 73 function set:contains(item)
74 return items[item]; 74 return items[item];
75 end 75 end
76 76
77 function set:items() 77 function set:items()
78 return items; 78 return next, items;
79 end 79 end
80 80
81 function set:remove(item) 81 function set:remove(item)
82 items[item] = nil; 82 items[item] = nil;
83 end 83 end
84 84
85 function set:add_list(list) 85 function set:add_list(list)
86 if list then 86 if list then
87 for _, item in ipairs(list) do 87 for _, item in ipairs(list) do
88 items[item] = true; 88 items[item] = true;
89 end 89 end
90 end 90 end
91 end 91 end
92 92
93 function set:include(otherset) 93 function set:include(otherset)
94 for item in otherset do 94 for item in otherset do
95 items[item] = true; 95 items[item] = true;
96 end 96 end
97 end 97 end
99 function set:exclude(otherset) 99 function set:exclude(otherset)
100 for item in otherset do 100 for item in otherset do
101 items[item] = nil; 101 items[item] = nil;
102 end 102 end
103 end 103 end
104 104
105 function set:empty() 105 function set:empty()
106 return not next(items); 106 return not next(items);
107 end 107 end
108 108
109 if list then 109 if list then
110 set:add_list(list); 110 set:add_list(list);
111 end 111 end
112 112
113 return setmetatable(set, set_mt); 113 return setmetatable(set, set_mt);
114 end 114 end
115 115
116 function union(set1, set2) 116 function union(set1, set2)
117 local set = new(); 117 local set = new();
118 local items = set._items; 118 local items = set._items;
119 119
120 for item in pairs(set1._items) do 120 for item in pairs(set1._items) do
121 items[item] = true; 121 items[item] = true;
122 end 122 end
123 123
124 for item in pairs(set2._items) do 124 for item in pairs(set2._items) do
125 items[item] = true; 125 items[item] = true;
126 end 126 end
127 127
128 return set; 128 return set;
129 end 129 end
130 130
131 function difference(set1, set2) 131 function difference(set1, set2)
132 local set = new(); 132 local set = new();
133 local items = set._items; 133 local items = set._items;
134 134
135 for item in pairs(set1._items) do 135 for item in pairs(set1._items) do
136 items[item] = (not set2._items[item]) or nil; 136 items[item] = (not set2._items[item]) or nil;
137 end 137 end
138 138
139 return set; 139 return set;
140 end 140 end
141 141
142 function intersection(set1, set2) 142 function intersection(set1, set2)
143 local set = new(); 143 local set = new();
144 local items = set._items; 144 local items = set._items;
145 145
146 set1, set2 = set1._items, set2._items; 146 set1, set2 = set1._items, set2._items;
147 147
148 for item in pairs(set1) do 148 for item in pairs(set1) do
149 items[item] = (not not set2[item]) or nil; 149 items[item] = (not not set2[item]) or nil;
150 end 150 end
151 151
152 return set; 152 return set;
153 end 153 end
154 154
155 function xor(set1, set2) 155 function xor(set1, set2)
156 return union(set1, set2) - intersection(set1, set2); 156 return union(set1, set2) - intersection(set1, set2);