<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://the.satanic.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ASet</id>
	<title>Module:Set - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://the.satanic.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ASet"/>
	<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:Set&amp;action=history"/>
	<updated>2026-04-20T01:25:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=11068&amp;oldid=prev</id>
		<title>WikiGOD at 05:50, 2 May 2021</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=11068&amp;oldid=prev"/>
		<updated>2021-05-02T05:50:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://the.satanic.wiki/index.php?title=Module:Set&amp;amp;diff=11068&amp;amp;oldid=11067&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=11067&amp;oldid=prev</id>
		<title>WikiGOD at 05:47, 2 May 2021</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=11067&amp;oldid=prev"/>
		<updated>2021-05-02T05:47:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:47, 2 May 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l8&quot;&gt;Line 8:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 8:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- @TODO Consider adding a `clone` function, since `mw.clone` doesn&amp;#039;t work.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- @TODO Consider adding a `clone` function, since `mw.clone` doesn&amp;#039;t work.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- @TODO Consider using `pairs` internally, to cut down on (en|de)coding.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- @TODO Consider using `pairs` internally, to cut down on (en|de)coding.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- @TODO Consider using `&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dev&lt;/del&gt;:Inspect` for `tostring`.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- @TODO Consider using `&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Module:&lt;/ins&gt;:Inspect` for `tostring`.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local p = {}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local p = {}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key zzegtzyr_mw19226-mwjf_:diff:1.41:old-11052:rev-11067:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=11052&amp;oldid=prev</id>
		<title>WikiGOD at 05:22, 2 May 2021</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=11052&amp;oldid=prev"/>
		<updated>2021-05-02T05:22:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:22, 2 May 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l32&quot;&gt;Line 32:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 32:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     __mode = &amp;quot;k&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     __mode = &amp;quot;k&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     __index = function ()&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     __index = function ()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         error(&quot;This set has not been initialized correctly. Please use `&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dev&lt;/del&gt;:Set.init` to construct new instances&quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         error(&quot;This set has not been initialized correctly. Please use `&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Module&lt;/ins&gt;:Set.init` to construct new instances&quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     end,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     end,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;})&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;})&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l137&quot;&gt;Line 137:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 137:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local function size(set)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local function size(set)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if not is(set) then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if not is(set) then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         error(&quot;bad argument #1 to &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dev&lt;/del&gt;:Set.size&#039; (set expected, got &quot; .. type(set) .. &quot;)&quot;, 2)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         error(&quot;bad argument #1 to &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Module&lt;/ins&gt;:Set.size&#039; (set expected, got &quot; .. type(set) .. &quot;)&quot;, 2)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key zzegtzyr_mw19226-mwjf_:diff:1.41:old-10954:rev-11052:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=10954&amp;oldid=prev</id>
		<title>WikiGOD: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=10954&amp;oldid=prev"/>
		<updated>2021-04-30T02:24:02Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:24, 30 April 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key zzegtzyr_mw19226-mwjf_:diff:1.41:old-10953:rev-10954 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiGOD</name></author>
	</entry>
	<entry>
		<id>https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=10953&amp;oldid=prev</id>
		<title>Mediawiki&gt;Siroopwafel: Remove pretty comment before module return (produces catastrophic defect in LuaDoc/LDoc/Docbunto)</title>
		<link rel="alternate" type="text/html" href="https://the.satanic.wiki/index.php?title=Module:Set&amp;diff=10953&amp;oldid=prev"/>
		<updated>2020-06-02T20:10:12Z</updated>

		<summary type="html">&lt;p&gt;Remove pretty comment before module return (produces catastrophic defect in LuaDoc/LDoc/Docbunto)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Library for building and manipulating sets.&lt;br /&gt;
--&lt;br /&gt;
-- @author [[User:DarthKitty]]&lt;br /&gt;
-- @version 0.5.0&lt;br /&gt;
--&lt;br /&gt;
-- @TODO Consider adding a `clone` function, since `mw.clone` doesn&amp;#039;t work.&lt;br /&gt;
-- @TODO Consider using `pairs` internally, to cut down on (en|de)coding.&lt;br /&gt;
-- @TODO Consider using `Dev:Inspect` for `tostring`.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Pass-by-reference placeholders for values that cannot be used as table keys.&lt;br /&gt;
-- We use functions instead of tables, since the latter are mutable.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local placeholders = {&lt;br /&gt;
    [&amp;quot;nil&amp;quot;] = function () end,&lt;br /&gt;
    [&amp;quot;NaN&amp;quot;] = function () end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- An ephemeron table is the closest approximation of JavaScript&amp;#039;s `WeakMap`&lt;br /&gt;
-- object, and can be used to store private, per-instance data. This is more&lt;br /&gt;
-- efficient than using a closure, since it doesn&amp;#039;t rebuild the whole&lt;br /&gt;
-- metatable for every instance.&lt;br /&gt;
--&lt;br /&gt;
-- @see &amp;lt;http://fitzgeraldnick.com/2014/01/13/hiding-implementation-details-with-e6-weakmaps.html&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local internals = setmetatable({}, {&lt;br /&gt;
    __mode = &amp;quot;k&amp;quot;,&lt;br /&gt;
    __index = function ()&lt;br /&gt;
        error(&amp;quot;This set has not been initialized correctly. Please use `Dev:Set.init` to construct new instances&amp;quot;)&lt;br /&gt;
    end,&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Metatable for set instances. Provides method syntax and overloaded operators&lt;br /&gt;
-- for convenience.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local Set = {&lt;br /&gt;
    __index = {},&lt;br /&gt;
    __newindex = function ()&lt;br /&gt;
        error(&amp;quot;cannot change a protected table&amp;quot;)&lt;br /&gt;
    end,&lt;br /&gt;
    __metatable = false,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Wraps a given value for use as a table key.&lt;br /&gt;
--&lt;br /&gt;
-- @param {*} value&lt;br /&gt;
--     The value to wrap.&lt;br /&gt;
-- @returns {*}&lt;br /&gt;
--     The wrapped value.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function encode(value)&lt;br /&gt;
    -- Per IEEE 754, NaN is the only value which does not equal itself. Tables&lt;br /&gt;
    -- cannot generate false-positives, since the `__eq` metamethod is not&lt;br /&gt;
    -- called if the values being compared are primitively equal.&lt;br /&gt;
    local isNaN = value ~= value&lt;br /&gt;
&lt;br /&gt;
    if value == nil then&lt;br /&gt;
        return placeholders[&amp;quot;nil&amp;quot;]&lt;br /&gt;
    elseif isNaN then&lt;br /&gt;
        return placeholders[&amp;quot;NaN&amp;quot;]&lt;br /&gt;
    else&lt;br /&gt;
        return value&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Unwraps a given value after being used as a table key.&lt;br /&gt;
--&lt;br /&gt;
-- @param {*} value&lt;br /&gt;
--     The value to unwrap.&lt;br /&gt;
-- @returns {*}&lt;br /&gt;
--     The unwrapped value.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function decode(value)&lt;br /&gt;
    if value == placeholders[&amp;quot;nil&amp;quot;] then&lt;br /&gt;
        return nil&lt;br /&gt;
    elseif value == placeholders[&amp;quot;NaN&amp;quot;] then&lt;br /&gt;
        return 0 / 0 -- There&amp;#039;s no `NaN` literal.&lt;br /&gt;
    else&lt;br /&gt;
        return value&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Constructs a set instance.&lt;br /&gt;
--&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     A new set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function init()&lt;br /&gt;
    local set = setmetatable({}, Set)&lt;br /&gt;
&lt;br /&gt;
    internals[set] = {&lt;br /&gt;
        elements = {},&lt;br /&gt;
        size = 0,&lt;br /&gt;
        prevElement = nil,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.init = init&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Checks if a value is a set, as defined by this library.&lt;br /&gt;
--&lt;br /&gt;
-- @param {*} value&lt;br /&gt;
--     The value to check.&lt;br /&gt;
-- @returns {boolean}&lt;br /&gt;
--     Whether the value is a set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function is(value)&lt;br /&gt;
    return (pcall(function ()&lt;br /&gt;
        return internals[value]&lt;br /&gt;
    end))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.is = is&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Fetches the number of elements in a set.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Cardinality]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {number}&lt;br /&gt;
--     The number of elements in the set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function size(set)&lt;br /&gt;
    if not is(set) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.size&amp;#039; (set expected, got &amp;quot; .. type(set) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return internals[set].size&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.size = size&lt;br /&gt;
Set.__index.size = size&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Checks if a set has a particular element.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set&lt;br /&gt;
--     The set to search.&lt;br /&gt;
-- @param {*} element&lt;br /&gt;
--     The element to search for.&lt;br /&gt;
-- @returns {boolean}&lt;br /&gt;
--     Whether the set contains the element.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function contains(set, element)&lt;br /&gt;
    if not is(set) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.contains&amp;#039; (set expected, got &amp;quot; .. type(set) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return not not internals[set].elements[encode(element)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.contains = contains&lt;br /&gt;
Set.__index.contains = contains&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Fetches the &amp;quot;next&amp;quot; element in a set, wrapping around to the &amp;quot;beginning&amp;quot; if&lt;br /&gt;
-- the &amp;quot;previous&amp;quot; was also the &amp;quot;last&amp;quot;. Since sets are unordered, the meaning of&lt;br /&gt;
-- those terms is determined by the built-in `next` function.&lt;br /&gt;
--&lt;br /&gt;
-- This method is provided as a workaround for Lua&amp;#039;s horribly-designed iterator&lt;br /&gt;
-- &amp;quot;protocol&amp;quot;. Iterators use `nil` to signal the end of a sequence, but since&lt;br /&gt;
-- this &amp;quot;class&amp;quot; accepts `nil` elements, it is impossible to write an iterator&lt;br /&gt;
-- which will always loop over every element. Furthermore, because sets are not&lt;br /&gt;
-- ordered, such an iterator would stop at an arbitrary position.&lt;br /&gt;
--&lt;br /&gt;
-- Instead, combining this method with `Dev:Set.size` allows users to loop over&lt;br /&gt;
-- a set numerically, much like the `&amp;quot;n&amp;quot;` field trick utilized for sequential&lt;br /&gt;
-- tables with holes.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {*}&lt;br /&gt;
--     An element in the set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function nextElement(set)&lt;br /&gt;
    if not is(set) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.nextElement&amp;#039; (set expected, got &amp;quot; .. type(set) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local element = next(internals[set].elements, internals[set].prevElement)&lt;br /&gt;
&lt;br /&gt;
    -- If we&amp;#039;ve reached the end of the set, start over from the beginning.&lt;br /&gt;
    if element == nil then&lt;br /&gt;
        element = next(internals[set].elements, element)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Advance the pointer.&lt;br /&gt;
    internals[set].prevElement = element&lt;br /&gt;
&lt;br /&gt;
    return decode(element)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.nextElement = nextElement&lt;br /&gt;
Set.__index.nextElement = nextElement&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Adds one element to a set.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set&lt;br /&gt;
--     The set to add to.&lt;br /&gt;
-- @param {*} element&lt;br /&gt;
--     The element to add.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     The same set instance.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function add(set, element)&lt;br /&gt;
    if not is(set) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.add&amp;#039; (set expected, got &amp;quot; .. type(set) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not contains(set, element) then&lt;br /&gt;
        internals[set].elements[encode(element)] = true&lt;br /&gt;
        internals[set].size = internals[set].size + 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.add = add&lt;br /&gt;
Set.__index.add = add&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Removes one element from a set.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set&lt;br /&gt;
--     The set to remove from.&lt;br /&gt;
-- @param {*} element&lt;br /&gt;
--     The element to remove.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     The same set instance.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function remove(set, element)&lt;br /&gt;
    if not is(set) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.remove&amp;#039; (set expected, got &amp;quot; .. type(set) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if contains(set, element) then&lt;br /&gt;
        internals[set].elements[encode(element)] = nil&lt;br /&gt;
        internals[set].size = internals[set].size - 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.remove = remove&lt;br /&gt;
Set.__index.remove = remove&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Removes all elements from a set.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set&lt;br /&gt;
--     The set to remove from.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     The same set instance.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function clear(set)&lt;br /&gt;
    if not is(set) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.clear&amp;#039; (set expected, got &amp;quot; .. type(set) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, size(set) do&lt;br /&gt;
        remove(set, nextElement(set))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.clear = clear&lt;br /&gt;
Set.__index.clear = clear&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Constructs a set with one or more elements.&lt;br /&gt;
--&lt;br /&gt;
-- @param {...*} ...&lt;br /&gt;
--     The elements to add.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     The set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function of(...)&lt;br /&gt;
    local set = init()&lt;br /&gt;
&lt;br /&gt;
    for i = 1, select(&amp;quot;#&amp;quot;, ...) do&lt;br /&gt;
        add(set, select(i, ...))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.of = of&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Constructs a set from a the key-value pairs of a table, adding keys that&lt;br /&gt;
-- correspond to &amp;quot;truthy&amp;quot; values and ignoring the rest.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} tbl&lt;br /&gt;
--     The table to iterate over.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     The set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function fromPairs(tbl)&lt;br /&gt;
    local typ = type(tbl)&lt;br /&gt;
&lt;br /&gt;
    if typ ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.fromPairs&amp;#039; (table expected, got &amp;quot; .. typ .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local set = init()&lt;br /&gt;
&lt;br /&gt;
    for key, value in pairs(tbl) do&lt;br /&gt;
        if value then&lt;br /&gt;
            add(set, key)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fromPairs = fromPairs&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Builds a new set from two existing ones, where each element of the former is&lt;br /&gt;
-- also an element of both of the latter.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Intersection (set theory)]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} oldSet1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} oldSet2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     A new set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function intersection(oldSet1, oldSet2)&lt;br /&gt;
    if not is(oldSet1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.intersection&amp;#039; (set expected, got &amp;quot; .. type(oldSet1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(oldSet1) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.intersection&amp;#039; (set expected, got &amp;quot; .. type(oldSet2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local newSet = init()&lt;br /&gt;
&lt;br /&gt;
    for i = 1, size(oldSet1) do&lt;br /&gt;
        local element = nextElement(oldSet1)&lt;br /&gt;
&lt;br /&gt;
        if contains(oldSet2, element) then&lt;br /&gt;
            add(newSet, element)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return newSet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.intersection = intersection&lt;br /&gt;
Set.__index.intersection = intersection&lt;br /&gt;
Set.__mul = intersection&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Builds a new set from two existing ones, where each element of the former is&lt;br /&gt;
-- also an element of either of the latter.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Union (set theory)]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} oldSet1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} oldSet2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     A new set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function union(oldSet1, oldSet2)&lt;br /&gt;
    if not is(oldSet1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.union&amp;#039; (set expected, got &amp;quot; .. type(oldSet1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(oldSet2) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.union&amp;#039; (set expected, got &amp;quot; .. type(oldSet2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local newSet = init()&lt;br /&gt;
&lt;br /&gt;
    for _, oldSet in ipairs{oldSet1, oldSet2} do&lt;br /&gt;
        for i = 1, size(oldSet) do&lt;br /&gt;
            add(newSet, nextElement(oldSet))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return newSet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.union = union&lt;br /&gt;
Set.__index.union = union&lt;br /&gt;
Set.__add = union&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Builds a new set from two existing ones, where each element of the former is&lt;br /&gt;
-- also an element of the first of the latter, but not the second.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Complement (set theory)#Relative complement]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} oldSet1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} oldSet2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     A new set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function difference(oldSet1, oldSet2)&lt;br /&gt;
    if not is(oldSet1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.difference&amp;#039; (set expected, got &amp;quot; .. type(oldSet1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(oldSet1) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.difference&amp;#039; (set expected, got &amp;quot; .. type(oldSet2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local newSet = init()&lt;br /&gt;
&lt;br /&gt;
    for i = 1, size(oldSet1) do&lt;br /&gt;
        local element = nextElement(oldSet1)&lt;br /&gt;
&lt;br /&gt;
        if not contains(oldSet2, element) then&lt;br /&gt;
            add(newSet, element)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return newSet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.difference = difference&lt;br /&gt;
Set.__index.difference = difference&lt;br /&gt;
Set.__sub = difference&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Builds a new set from two existing ones, where each element of the former is&lt;br /&gt;
-- also an element of one of the latter, but not both.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Symmetric difference]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} oldSet1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} oldSet2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     A new set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function symmetricDifference(oldSet1, oldSet2)&lt;br /&gt;
    if not is(oldSet1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.symmetricDifference&amp;#039; (set expected, got &amp;quot; .. type(oldSet1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(oldSet1) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.symmetricDifference&amp;#039; (set expected, got &amp;quot; .. type(oldSet2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local newSet = init()&lt;br /&gt;
&lt;br /&gt;
    for _, oldSet in ipairs{oldSet1, oldSet2} do&lt;br /&gt;
        for i = 1, size(oldSet) do&lt;br /&gt;
            local element = nextElement()&lt;br /&gt;
&lt;br /&gt;
            if contains(newSet, element) then&lt;br /&gt;
                remove(newSet, element)&lt;br /&gt;
            else&lt;br /&gt;
                add(newSet, element)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return newSet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.symmetricDifference = symmetricDifference&lt;br /&gt;
Set.__index.symmetricDifference = symmetricDifference&lt;br /&gt;
Set.__pow = symmetricDifference&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Checks if two sets have no elements in common.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Disjoint sets]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} set2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {boolean}&lt;br /&gt;
--     Whether the two sets have no elements in common.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function isDisjointFrom(set1, set2)&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.isDisjointFrom&amp;#039; (set expected, got &amp;quot; .. type(set1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.isDisjointFrom&amp;#039; (set expected, got &amp;quot; .. type(set2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, size(set1) do&lt;br /&gt;
        if contains(set2, nextElement(set1)) then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.isDisjointFrom = isDisjointFrom&lt;br /&gt;
Set.__index.isDisjointFrom = isDisjointFrom&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Checks if every element of one set is also an element of another.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Subset]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} set2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {boolean}&lt;br /&gt;
--     Whether every element of the first set is also an element of the second.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function isSubsetOf(set1, set2)&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.isSubsetOf&amp;#039; (set expected, got &amp;quot; .. type(set1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.isSubsetOf&amp;#039; (set expected, got &amp;quot; .. type(set2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i = 1, size(set1) do&lt;br /&gt;
        if not contains(set2, nextElement(set1)) then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.isSubsetOf = isSubsetOf&lt;br /&gt;
Set.__index.isSubsetOf = isSubsetOf&lt;br /&gt;
Set.__le = isSubsetOf&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Checks if every element of one set is also an element of another, but not the&lt;br /&gt;
-- inverse.&lt;br /&gt;
--&lt;br /&gt;
-- @see [[wikipedia:Subset]]&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} set2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {boolean}&lt;br /&gt;
--     Whether every element of the first set is also an element of the second,&lt;br /&gt;
--     but not the inverse.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function isProperSubsetOf(set1, set2)&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.isProperSubsetOf&amp;#039; (set expected, got &amp;quot; .. type(set1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.isProperSubsetOf&amp;#039; (set expected, got &amp;quot; .. type(set2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return size(set1) &amp;lt; size(set2) and isSubsetOf(set1, set2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.isProperSubsetOf = isProperSubsetOf&lt;br /&gt;
Set.__index.isProperSubsetOf = isProperSubsetOf&lt;br /&gt;
Set.__lt = isProperSubsetOf&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Checks if every element of one set is also an element of another, and vice&lt;br /&gt;
-- versa.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set1&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @param {table} set2&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {boolean}&lt;br /&gt;
--     Whether every element of the first set is also an element of the second,&lt;br /&gt;
--     and vice versa.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function equals(set1, set2)&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #1 to &amp;#039;Dev:Set.equals&amp;#039; (set expected, got &amp;quot; .. type(set1) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not is(set1) then&lt;br /&gt;
        error(&amp;quot;bad argument #2 to &amp;#039;Dev:Set.equals&amp;#039; (set expected, got &amp;quot; .. type(set2) .. &amp;quot;)&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return size(set1) == size(set2) and isSubsetOf(set1, set2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.equals = equals&lt;br /&gt;
Set.__index.equals = equals&lt;br /&gt;
Set.__eq = equals&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Generates a string representation of a set.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table} set&lt;br /&gt;
--     A set.&lt;br /&gt;
-- @returns {string}&lt;br /&gt;
--     A string representation of the set.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function tostring_(set)&lt;br /&gt;
    local tmp = {}&lt;br /&gt;
&lt;br /&gt;
    for i = 1, size(set) do&lt;br /&gt;
        tmp[i] = tostring(nextElement(set))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;Set { &amp;quot; .. table.concat(tmp, &amp;quot;, &amp;quot;) .. &amp;quot; }&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Set.__tostring = tostring_&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Makes it slightly more convenient to construct set instances, by allowing&lt;br /&gt;
-- users to omit &amp;quot;.of&amp;quot;.&lt;br /&gt;
return setmetatable(p, {&lt;br /&gt;
    __call = function (self, ...)&lt;br /&gt;
        return self.of(...)&lt;br /&gt;
    end,&lt;br /&gt;
})&lt;/div&gt;</summary>
		<author><name>Mediawiki&gt;Siroopwafel</name></author>
	</entry>
</feed>