util/set.lua
author Jonas Schäfer <jonas@wielicki.name>
Mon, 10 Jan 2022 18:23:54 +0100
branch0.11
changeset 12185 783056b4e448
parent 11546 c358537c0878
child 11564 3bbb1af92514
permissions -rw-r--r--
util.xml: Do not allow doctypes, comments or processing instructions Yes. This is as bad as it sounds. CVE pending. In Prosody itself, this only affects mod_websocket, which uses util.xml to parse the <open/> frame, thus allowing unauthenticated remote DoS using Billion Laughs. However, third-party modules using util.xml may also be affected by this. This commit installs handlers which disallow the use of doctype declarations and processing instructions without any escape hatch. It, by default, also introduces such a handler for comments, however, there is a way to enable comments nontheless. This is because util.xml is used to parse human-facing data, where comments are generally a desirable feature, and also because comments are generally harmless.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1030
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
     4
--
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1030
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1030
diff changeset
     6
-- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1030
diff changeset
     7
--
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1030
diff changeset
     8
11546
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
     9
local ipairs, pairs, getmetatable, setmetatable, next, tostring =
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
    10
      ipairs, pairs, getmetatable, setmetatable, next, tostring;
1028
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    11
local t_concat = table.concat;
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
    13
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8525
diff changeset
    14
-- luacheck: std none
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
8525
073e517a1487 util.set: Add a __name field to metatable
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    16
local set_mt = { __name = "set" };
1028
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    17
function set_mt.__call(set, _, k)
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    18
	return next(set._items, k);
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    19
end
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    20
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    21
local items_mt = {};
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    22
function items_mt.__call(items, _, k)
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    23
	return next(items, k);
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    24
end
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    25
9491
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    26
function set_mt:__freeze()
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    27
	local a, i = {}, 1;
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    28
	for item in self._items do
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    29
		a[i], i = item, i+1;
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    30
	end
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    31
	return a;
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    32
end
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    33
11546
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
    34
local function is_set(o)
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
    35
	local mt = getmetatable(o);
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
    36
	return mt == set_mt;
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
    37
end
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
    38
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
    39
local function new(list)
1028
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    40
	local items = setmetatable({}, items_mt);
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
    41
	local set = { _items = items };
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    42
6677
a0ce52e11122 util.set: Add luacheck annotation for methods not referencing 'self'
Matthew Wild <mwild1@gmail.com>
parents: 6676
diff changeset
    43
	-- We access the set through an upvalue in these methods, so ignore 'self' being unused
a0ce52e11122 util.set: Add luacheck annotation for methods not referencing 'self'
Matthew Wild <mwild1@gmail.com>
parents: 6676
diff changeset
    44
	--luacheck: ignore 212/self
a0ce52e11122 util.set: Add luacheck annotation for methods not referencing 'self'
Matthew Wild <mwild1@gmail.com>
parents: 6676
diff changeset
    45
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    46
	function set:add(item)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
		items[item] = true;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    49
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    50
	function set:contains(item)
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    51
		return items[item];
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    53
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    54
	function set:items()
5817
6e087f3b8f3b util.set: :items() now returns an iterator instead of the underlying table. This is much more efficient than 'for item in set' (which still works for now). Current access to _items is generally done directly, this may change.
Matthew Wild <mwild1@gmail.com>
parents: 5814
diff changeset
    55
		return next, items;
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    57
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    58
	function set:remove(item)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
		items[item] = nil;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    61
6678
cb5b56ddabfd util.set: Rename method argument to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6677
diff changeset
    62
	function set:add_list(item_list)
cb5b56ddabfd util.set: Rename method argument to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6677
diff changeset
    63
		if item_list then
cb5b56ddabfd util.set: Rename method argument to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6677
diff changeset
    64
			for _, item in ipairs(item_list) do
4544
316e2b09a562 util.set: Accept nil to add_list()
Matthew Wild <mwild1@gmail.com>
parents: 3540
diff changeset
    65
				items[item] = true;
316e2b09a562 util.set: Accept nil to add_list()
Matthew Wild <mwild1@gmail.com>
parents: 3540
diff changeset
    66
			end
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
		end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    69
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    70
	function set:include(otherset)
5813
c888f548876b util.set: Fix :include() and :exclude() methods to iterate the input set correctly
Matthew Wild <mwild1@gmail.com>
parents: 4908
diff changeset
    71
		for item in otherset do
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
			items[item] = true;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
		end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
	end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    76
	function set:exclude(otherset)
5813
c888f548876b util.set: Fix :include() and :exclude() methods to iterate the input set correctly
Matthew Wild <mwild1@gmail.com>
parents: 4908
diff changeset
    77
		for item in otherset do
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
			items[item] = nil;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
		end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    81
1029
4ead03974759 util.set: Add set:empty() to discover if the set is the empty set
Matthew Wild <mwild1@gmail.com>
parents: 1028
diff changeset
    82
	function set:empty()
4ead03974759 util.set: Add set:empty() to discover if the set is the empty set
Matthew Wild <mwild1@gmail.com>
parents: 1028
diff changeset
    83
		return not next(items);
4ead03974759 util.set: Add set:empty() to discover if the set is the empty set
Matthew Wild <mwild1@gmail.com>
parents: 1028
diff changeset
    84
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    85
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    86
	if list then
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    87
		set:add_list(list);
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    88
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    89
1028
594a07e753a0 util.set: Add metatable to sets to allow +, -, /, ==, tostring and to double as iterators
Matthew Wild <mwild1@gmail.com>
parents: 917
diff changeset
    90
	return setmetatable(set, set_mt);
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
    93
local function union(set1, set2)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
	local set = new();
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
    95
	local items = set._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    96
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
    97
	for item in pairs(set1._items) do
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    98
		items[item] = true;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    99
	end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   101
	for item in pairs(set2._items) do
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
		items[item] = true;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   104
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
	return set;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   108
local function difference(set1, set2)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109
	local set = new();
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   110
	local items = set._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   111
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   112
	for item in pairs(set1._items) do
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   113
		items[item] = (not set2._items[item]) or nil;
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
	end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   116
	return set;
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   117
end
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   118
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   119
local function intersection(set1, set2)
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   120
	local set = new();
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   121
	local items = set._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   122
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   123
	set1, set2 = set1._items, set2._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   124
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   125
	for item in pairs(set1) do
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   126
		items[item] = (not not set2[item]) or nil;
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   128
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   129
	return set;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   130
end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   131
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   132
local function xor(set1, set2)
1030
a82268d507fc util.set: Add set.xor() to get a set consisting of items not in both sets
Matthew Wild <mwild1@gmail.com>
parents: 1029
diff changeset
   133
	return union(set1, set2) - intersection(set1, set2);
a82268d507fc util.set: Add set.xor() to get a set consisting of items not in both sets
Matthew Wild <mwild1@gmail.com>
parents: 1029
diff changeset
   134
end
a82268d507fc util.set: Add set.xor() to get a set consisting of items not in both sets
Matthew Wild <mwild1@gmail.com>
parents: 1029
diff changeset
   135
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   136
function set_mt.__add(set1, set2)
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   137
	return union(set1, set2);
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   138
end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   139
function set_mt.__sub(set1, set2)
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   140
	return difference(set1, set2);
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   141
end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   142
function set_mt.__div(set, func)
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   143
	local new_set = new();
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   144
	local items, new_items = set._items, new_set._items;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   145
	for item in pairs(items) do
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   146
		local new_item = func(item);
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   147
		if new_item ~= nil then
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   148
			new_items[new_item] = true;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   149
		end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   150
	end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   151
	return new_set;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   152
end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   153
function set_mt.__eq(set1, set2)
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   154
	set1, set2 = set1._items, set2._items;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   155
	for item in pairs(set1) do
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   156
		if not set2[item] then
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   157
			return false;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   158
		end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   159
	end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   160
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   161
	for item in pairs(set2) do
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   162
		if not set1[item] then
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   163
			return false;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   164
		end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   165
	end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   166
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   167
	return true;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   168
end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   169
function set_mt.__tostring(set)
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   170
	local s, items = { }, set._items;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   171
	for item in pairs(items) do
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   172
		s[#s+1] = tostring(item);
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   173
	end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   174
	return t_concat(s, ", ");
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   175
end
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   176
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   177
return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   178
	new = new;
11546
c358537c0878 util.set: Add is_set() to test if an object is a set
Matthew Wild <mwild1@gmail.com>
parents: 9491
diff changeset
   179
	is_set = is_set;
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   180
	union = union;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   181
	difference = difference;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   182
	intersection = intersection;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   183
	xor = xor;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6678
diff changeset
   184
};