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;