util/set.lua
author Kim Alvefur <zash@zash.se>
Wed, 15 Jan 2020 21:18:30 +0100
changeset 10598 13d5fb74648f
parent 9491 a96a2fbcc6c0
child 11564 3bbb1af92514
permissions -rw-r--r--
util.set: Fix equality metamethod in Lua 5.3
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
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
     9
local ipairs, pairs, 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
    10
      ipairs, pairs, setmetatable, next, tostring;
10598
13d5fb74648f util.set: Fix equality metamethod in Lua 5.3
Kim Alvefur <zash@zash.se>
parents: 9491
diff changeset
    11
local getmetatable = getmetatable;
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
    12
local t_concat = table.concat;
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
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
    14
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8525
diff changeset
    15
-- luacheck: std none
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
8525
073e517a1487 util.set: Add a __name field to metatable
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    17
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
    18
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
    19
	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
    20
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
    21
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
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
    23
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
    24
	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
    25
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
    26
9491
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    27
function set_mt:__freeze()
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    28
	local a, i = {}, 1;
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    29
	for item in self._items do
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    30
		a[i], i = item, i+1;
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    31
	end
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    32
	return a;
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    33
end
a96a2fbcc6c0 util.set: Add freeze metamethod
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    34
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
    35
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
    36
	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
    37
	local set = { _items = items };
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    38
6677
a0ce52e11122 util.set: Add luacheck annotation for methods not referencing 'self'
Matthew Wild <mwild1@gmail.com>
parents: 6676
diff changeset
    39
	-- 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
    40
	--luacheck: ignore 212/self
a0ce52e11122 util.set: Add luacheck annotation for methods not referencing 'self'
Matthew Wild <mwild1@gmail.com>
parents: 6676
diff changeset
    41
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    42
	function set:add(item)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
		items[item] = true;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
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:contains(item)
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    47
		return items[item];
904
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: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
    51
		return next, items;
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:remove(item)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
		items[item] = nil;
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
6678
cb5b56ddabfd util.set: Rename method argument to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6677
diff changeset
    58
	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
    59
		if item_list then
cb5b56ddabfd util.set: Rename method argument to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6677
diff changeset
    60
			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
    61
				items[item] = true;
316e2b09a562 util.set: Accept nil to add_list()
Matthew Wild <mwild1@gmail.com>
parents: 3540
diff changeset
    62
			end
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
		end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    65
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    66
	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
    67
		for item in otherset do
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
			items[item] = true;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
		end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
	end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    72
	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
    73
		for item in otherset do
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
			items[item] = nil;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
		end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    77
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
    78
	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
    79
		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
    80
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    81
905
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    82
	if list then
6169597d5574 util.set: Fix to make constructor work, and functions defined correctly
Matthew Wild <mwild1@gmail.com>
parents: 904
diff changeset
    83
		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
    84
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    85
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
    86
	return setmetatable(set, set_mt);
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
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
    89
local function union(set1, set2)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
	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
    91
	local items = set._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
    92
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
    93
	for item in pairs(set1._items) do
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
		items[item] = true;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
	end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
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(set2._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
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   100
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
	return set;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
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
   104
local function difference(set1, set2)
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
	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
   106
	local items = set._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   107
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   108
	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
   109
		items[item] = (not set2._items[item]) or nil;
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
	end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
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
	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
   113
end
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   114
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
   115
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
   116
	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
   117
	local items = set._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   118
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   119
	set1, set2 = set1._items, set2._items;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   120
917
f12f88b3d4a1 util.set: Rename private items container, optimise set.difference() and add set.intersection()
Matthew Wild <mwild1@gmail.com>
parents: 905
diff changeset
   121
	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
   122
		items[item] = (not not set2[item]) or nil;
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   123
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4908
diff changeset
   124
904
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
	return set;
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
end
0205dcd0854a util.set: New util library
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
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
   128
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
   129
	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
   130
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
   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
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
   133
	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
   134
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
   135
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
   136
	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
   137
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
   138
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
   139
	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
   140
	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
   141
	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
   142
		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
   143
		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
   144
			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
   145
		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
   146
	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
   147
	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
   148
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
   149
function set_mt.__eq(set1, set2)
10598
13d5fb74648f util.set: Fix equality metamethod in Lua 5.3
Kim Alvefur <zash@zash.se>
parents: 9491
diff changeset
   150
	if getmetatable(set1) ~= set_mt or getmetatable(set2) ~= set_mt then
13d5fb74648f util.set: Fix equality metamethod in Lua 5.3
Kim Alvefur <zash@zash.se>
parents: 9491
diff changeset
   151
		-- Lua 5.3+ calls this if both operands are tables, even if metatables differ
13d5fb74648f util.set: Fix equality metamethod in Lua 5.3
Kim Alvefur <zash@zash.se>
parents: 9491
diff changeset
   152
		return false;
13d5fb74648f util.set: Fix equality metamethod in Lua 5.3
Kim Alvefur <zash@zash.se>
parents: 9491
diff changeset
   153
	end
13d5fb74648f util.set: Fix equality metamethod in Lua 5.3
Kim Alvefur <zash@zash.se>
parents: 9491
diff changeset
   154
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
   155
	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
   156
	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
   157
		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
   158
			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
   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
	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
   161
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
	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
   163
		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
   164
			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
   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
	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
   167
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
	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
   169
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
   170
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
   171
	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
   172
	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
   173
		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
   174
	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
   175
	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
   176
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
   177
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
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
   179
	new = 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
   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
};