util/set.lua
author Kim Alvefur <zash@zash.se>
Mon, 12 Dec 2022 07:03:31 +0100
branch0.11
changeset 12802 c4b1b5cbc20b
parent 11546 c358537c0878
child 11564 3bbb1af92514
permissions -rw-r--r--
Tag 0.11.14
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
};