<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.statsape.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AEnum</id>
	<title>模块:Enum - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.statsape.com/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3AEnum"/>
	<link rel="alternate" type="text/html" href="https://wiki.statsape.com/index.php?title=%E6%A8%A1%E5%9D%97:Enum&amp;action=history"/>
	<updated>2026-04-04T09:37:38Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.statsape.com/index.php?title=%E6%A8%A1%E5%9D%97:Enum&amp;diff=503&amp;oldid=prev</id>
		<title>Zeroclanzhang：​创建页面，内容为“-- &lt;nowiki&gt; awawa local libraryUtil = require(&#039;libraryUtil&#039;) local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti local p = {} p.__index = p  setmetatable(p, { 	__call = function(_, enum) 		return p.new(enum) 	end })  function p.__tostring(enum) 	local dumpObject = require(&#039;Module:Logger&#039;).dumpObject 	setmetatable(enum, nil) 	return dumpObject(enum, {clean=true, collapseLimit=100}) end  function p.__concat(lhs, rhs) 	if type…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.statsape.com/index.php?title=%E6%A8%A1%E5%9D%97:Enum&amp;diff=503&amp;oldid=prev"/>
		<updated>2023-07-13T14:11:58Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“-- &amp;lt;nowiki&amp;gt; awawa local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libraryUtil.checkType local checkTypeMulti = libraryUtil.checkTypeMulti local p = {} p.__index = p  setmetatable(p, { 	__call = function(_, enum) 		return p.new(enum) 	end })  function p.__tostring(enum) 	local dumpObject = require(&amp;#039;Module:Logger&amp;#039;).dumpObject 	setmetatable(enum, nil) 	return dumpObject(enum, {clean=true, collapseLimit=100}) end  function p.__concat(lhs, rhs) 	if type…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt; awawa&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeMulti = libraryUtil.checkTypeMulti&lt;br /&gt;
local p = {}&lt;br /&gt;
p.__index = p&lt;br /&gt;
&lt;br /&gt;
setmetatable(p, {&lt;br /&gt;
	__call = function(_, enum)&lt;br /&gt;
		return p.new(enum)&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
function p.__tostring(enum)&lt;br /&gt;
	local dumpObject = require(&amp;#039;Module:Logger&amp;#039;).dumpObject&lt;br /&gt;
	setmetatable(enum, nil)&lt;br /&gt;
	return dumpObject(enum, {clean=true, collapseLimit=100})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__concat(lhs, rhs)&lt;br /&gt;
	if type(lhs) == &amp;#039;table&amp;#039; and type(rhs) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		return p.insert(lhs, rhs)&lt;br /&gt;
	else&lt;br /&gt;
		return tostring(lhs) .. tostring(rhs)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__unm(enum)&lt;br /&gt;
	return p.map(enum, function(x) return -x end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mathTemplate(lhs, rhs, funName, fun)&lt;br /&gt;
	checkTypeMulti(&amp;#039;Module:Enum.&amp;#039; .. funName, 1, lhs, {&amp;#039;number&amp;#039;, &amp;#039;table&amp;#039;})&lt;br /&gt;
	checkTypeMulti(&amp;#039;Module:Enum.&amp;#039; .. funName, 2, rhs, {&amp;#039;number&amp;#039;, &amp;#039;table&amp;#039;})&lt;br /&gt;
	local res = setmetatable({}, getmetatable(lhs) or getmetatable(rhs))&lt;br /&gt;
&lt;br /&gt;
	if type(lhs) == &amp;#039;number&amp;#039; or type(rhs) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		local scalar, vector&lt;br /&gt;
		if type(lhs) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			scalar = lhs&lt;br /&gt;
			vector = rhs&lt;br /&gt;
		else&lt;br /&gt;
			scalar = rhs&lt;br /&gt;
			vector = lhs&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		for i = 1, #vector do&lt;br /&gt;
			res[i] = fun(vector[i], scalar)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		assert(#lhs == #rhs, &amp;#039;Tables are not equal length&amp;#039;)&lt;br /&gt;
		for i = 1, #lhs do&lt;br /&gt;
			res[i] = fun(lhs[i], rhs[i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__add(lhs, rhs)&lt;br /&gt;
	return mathTemplate(lhs, rhs, &amp;#039;__add&amp;#039;, function(x, y) return x + y end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__sub(lhs, rhs)&lt;br /&gt;
	return mathTemplate(lhs, rhs, &amp;#039;__sub&amp;#039;, function(x, y) return x - y end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__mul(lhs, rhs)&lt;br /&gt;
	return mathTemplate(lhs, rhs, &amp;#039;__mul&amp;#039;, function(x, y) return x * y end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__div(lhs, rhs)&lt;br /&gt;
	return mathTemplate(lhs, rhs, &amp;#039;__div&amp;#039;, function(x, y) return x / y end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__pow(lhs, rhs)&lt;br /&gt;
	return mathTemplate(lhs, rhs, &amp;#039;__pow&amp;#039;, function(x, y) return x ^ y end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__lt(lhs, rhs)&lt;br /&gt;
	for i = 1, math.min(#lhs, #rhs) do&lt;br /&gt;
		if lhs[i] &amp;gt;= rhs[i] then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__le(lhs, rhs)&lt;br /&gt;
	for i = 1, math.min(#lhs, #rhs) do&lt;br /&gt;
		if lhs[i] &amp;gt; rhs[i] then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.__eq(lhs, rhs)&lt;br /&gt;
	if #lhs ~= #rhs then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, #lhs do&lt;br /&gt;
		if lhs[i] ~= rhs[i] then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.all(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.all&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.all&amp;#039;, 2, fn, &amp;#039;function&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.all&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	fn = fn or function(item) return item end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if not fn(enum[i], i) then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.any(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.any&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.any&amp;#039;, 2, fn, &amp;#039;function&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.any&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	fn = fn or function(item) return item end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if fn(enum[i], i) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.contains(enum, elem, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.contains&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.contains&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum); elem = mw.clone(elem) end&lt;br /&gt;
	return p.any(enum, function(item) return item == elem end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.each(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.each&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.each&amp;#039;, 2, fn, &amp;#039;function&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.each&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		fn(enum[i], i)&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.filter(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.filter&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.filter&amp;#039;, 2, fn, &amp;#039;function&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.filter&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	fn = fn or function(item) return item end&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local len = 0&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if fn(enum[i], i) then&lt;br /&gt;
			len = len + 1&lt;br /&gt;
			r[len] = enum[i]&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.find(enum, fn, default, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.find&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.find&amp;#039;, 2, fn, &amp;#039;function&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.find&amp;#039;, 4, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum); default = mw.clone(default) end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if fn(enum[i], i) then&lt;br /&gt;
			return enum[i], i&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return default&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.find_index(enum, fn, default, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.find_index&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.find_index&amp;#039;, 2, fn, &amp;#039;function&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.find_index&amp;#039;, 4, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum); default = mw.clone(default) end&lt;br /&gt;
	fn = fn or function(item) return item end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if fn(enum[i], i) then&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return default&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.newIncrementor(start, step)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.newIncrementor&amp;#039;, 1, start, &amp;#039;number&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.newIncrementor&amp;#039;, 2, step, &amp;#039;number&amp;#039;, true)&lt;br /&gt;
	step = step or 1&lt;br /&gt;
	local n = (start or 1) - step&lt;br /&gt;
	local obj = {}&lt;br /&gt;
	return setmetatable(obj, {&lt;br /&gt;
		__call = function() n = n + step return n end,&lt;br /&gt;
		__tostring = function() return n end,&lt;br /&gt;
		__index = function() return n end,&lt;br /&gt;
		__newindex = function(self, k, v)&lt;br /&gt;
			if k == &amp;#039;step&amp;#039; and type(v) == &amp;#039;number&amp;#039; then&lt;br /&gt;
				step = v&lt;br /&gt;
			elseif type(v) == &amp;#039;number&amp;#039; then&lt;br /&gt;
				n = v&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
		__concat = function(x, y) return tostring(x) .. tostring(y) end&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.intersect(enum1, enum2, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.intersect&amp;#039;, 1, enum1, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.intersect&amp;#039;, 2, enum2, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.intersect&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum1 = mw.clone(enum1); enum2 = mw.clone(enum2) end&lt;br /&gt;
	local enum2Elements = {}&lt;br /&gt;
	local res = setmetatable({}, getmetatable(enum1) or getmetatable(enum2))&lt;br /&gt;
	local len = 0&lt;br /&gt;
	p.each(enum2, function(item) enum2Elements[item] = true end)&lt;br /&gt;
	p.each(enum1, function(item)&lt;br /&gt;
		if enum2Elements[item] then&lt;br /&gt;
			len = len + 1&lt;br /&gt;
			res[len] = item&lt;br /&gt;
		end&lt;br /&gt;
	end)&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.intersects(enum1, enum2, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.intersects&amp;#039;, 1, enum1, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.intersects&amp;#039;, 2, enum2, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.intersects&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum1 = mw.clone(enum1); enum2 = mw.clone(enum2) end&lt;br /&gt;
	local small = {}&lt;br /&gt;
	local large&lt;br /&gt;
	if #enum1 &amp;lt;= #enum2 then&lt;br /&gt;
		p.each(enum1, function(item) small[item] = true end)&lt;br /&gt;
		large = enum2&lt;br /&gt;
	else&lt;br /&gt;
		p.each(enum2, function(item) small[item] = true end)&lt;br /&gt;
		large = enum1&lt;br /&gt;
	end&lt;br /&gt;
	return p.any(large, function(item) return small[item] end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.insert(enum1, enum2, index, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.insert&amp;#039;, 1, enum1, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.insert&amp;#039;, 2, enum2, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.insert&amp;#039;, 3, index, &amp;#039;number&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.insert&amp;#039;, 4, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum1 = mw.clone(enum1); enum2 = mw.clone(enum2) end&lt;br /&gt;
	local len1 = #enum1&lt;br /&gt;
	local len2 = #enum2&lt;br /&gt;
	index = index or (len1 + 1)&lt;br /&gt;
	local res = setmetatable({}, getmetatable(enum1) or getmetatable(enum2))&lt;br /&gt;
&lt;br /&gt;
	for i = 1, (len1 + len2) do&lt;br /&gt;
		if i &amp;lt; index then&lt;br /&gt;
			res[i] = enum1[i]&lt;br /&gt;
		elseif i &amp;lt; (index + len2) then&lt;br /&gt;
			res[i] = enum2[i - index + 1]&lt;br /&gt;
		else&lt;br /&gt;
			res[i] = enum1[i - len2]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.map(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.map&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.map&amp;#039;, 2, fn, &amp;#039;function&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.map&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	local len = 0&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		local tmp = fn(enum[i], i)&lt;br /&gt;
		if tmp ~= nil then&lt;br /&gt;
			len = len + 1&lt;br /&gt;
			r[len] = tmp&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.max_by(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.max_by&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.max_by&amp;#039;, 2, fn, &amp;#039;function&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.max_by&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	return unpack(p.reduce(enum, function(new, old)&lt;br /&gt;
		local y = fn(new)&lt;br /&gt;
		return y &amp;gt; old[2] and {new, y} or old&lt;br /&gt;
	end, {enum[1], -math.huge}))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.new(enum)&lt;br /&gt;
	for _, v in pairs(enum) do&lt;br /&gt;
		if type(v) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			p.new(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if getmetatable(enum) == nil then&lt;br /&gt;
		setmetatable(enum, p)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return enum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.range(start, stop, step)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.range&amp;#039;, 1, start, &amp;#039;number&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.range&amp;#039;, 2, stop, &amp;#039;number&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.range&amp;#039;, 3, step, &amp;#039;number&amp;#039;, true)&lt;br /&gt;
	local array = setmetatable({}, p)&lt;br /&gt;
	local len = 0&lt;br /&gt;
	if not stop then&lt;br /&gt;
		stop = start&lt;br /&gt;
		start = 1&lt;br /&gt;
	end&lt;br /&gt;
	for i = start, stop, step or 1 do&lt;br /&gt;
		len = len + 1&lt;br /&gt;
		array[len] = i&lt;br /&gt;
	end&lt;br /&gt;
	return array&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.reduce(enum, fn, accumulator, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.reduce&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.reduce&amp;#039;, 2, fn, &amp;#039;function&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.reduce&amp;#039;, 4, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum); accumulator = mw.clone(accumulator) end&lt;br /&gt;
	local acc = accumulator&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if i == 1 and not accumulator then&lt;br /&gt;
			acc = enum[i]&lt;br /&gt;
		else&lt;br /&gt;
			acc = fn(enum[i], acc)&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return acc&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.reject(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.reject&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkTypeMulti(&amp;#039;Module:Enum.reject&amp;#039;, 2, fn, {&amp;#039;function&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;nil&amp;#039;})&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.reject&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	fn = fn or function(item) return item end&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local len = 0&lt;br /&gt;
	if type(fn) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		local i = 1&lt;br /&gt;
		while enum[i] ~= nil do&lt;br /&gt;
			if not fn(enum[i], i) then&lt;br /&gt;
				len = len + 1&lt;br /&gt;
				r[len] = enum[i]&lt;br /&gt;
			end&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local rejectMap = {}&lt;br /&gt;
		p.each(fn, function(item) rejectMap[item] = true end)&lt;br /&gt;
		local i = 1&lt;br /&gt;
		while enum[i] ~= nil do&lt;br /&gt;
			if not rejectMap[enum[i]] then&lt;br /&gt;
				len = len + 1&lt;br /&gt;
				r[len] = enum[i]&lt;br /&gt;
			end&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.rep(val, n, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.rep&amp;#039;, 2, n, &amp;#039;number&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.reject&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then val = mw.clone(val) end&lt;br /&gt;
	local r = setmetatable({}, p)&lt;br /&gt;
	for i = 1, n do&lt;br /&gt;
		r[i] = val&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.scan(enum, fn, accumulator, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.scan&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.scan&amp;#039;, 2, fn, &amp;#039;function&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.scan&amp;#039;, 4, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum); accumulator = mw.clone(accumulator) end&lt;br /&gt;
	local acc = accumulator&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if i == 1 and not accumulator then&lt;br /&gt;
			acc = enum[i]&lt;br /&gt;
		else&lt;br /&gt;
			acc = fn(enum[i], acc)&lt;br /&gt;
		end&lt;br /&gt;
		r[i] = acc&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.slice(enum, start, finish, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.slice&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.slice&amp;#039;, 2, start, &amp;#039;number&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.slice&amp;#039;, 3, finish, &amp;#039;number&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.slice&amp;#039;, 4, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	start = start or 1&lt;br /&gt;
	finish = finish or #enum&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local len = 0&lt;br /&gt;
	for i = start, finish do&lt;br /&gt;
		len = len + 1&lt;br /&gt;
		r[len] = enum[i]&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.split(enum, count, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.split&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.split&amp;#039;, 2, count, &amp;#039;number&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.split&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	if #enum &amp;lt; count then&lt;br /&gt;
		return enum, {}&lt;br /&gt;
	elseif count &amp;lt; 1 then&lt;br /&gt;
		return {}, enum&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local x = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local y = setmetatable({}, getmetatable(enum))&lt;br /&gt;
&lt;br /&gt;
	for i = 1, #enum do&lt;br /&gt;
		table.insert(i &amp;lt;= count and x or y, enum[i])&lt;br /&gt;
	end&lt;br /&gt;
	return x, y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sum(enum, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.sum&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.sum&amp;#039;, 2, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	return p.reduce(enum, function(x, y) return x + y end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.take(enum, count, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.take&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.take&amp;#039;, 2, count, &amp;#039;number&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.take&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	local x, _ = p.split(enum, count)&lt;br /&gt;
	return x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.take_every(enum, n, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.take_every&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.take_every&amp;#039;, 2, n, &amp;#039;number&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.take_every&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local len = 0&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		if (i - 1) % n == 0 then&lt;br /&gt;
			len = len + 1&lt;br /&gt;
			r[len] = enum[i]&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unique(enum, fn, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.unique&amp;#039;, 1, enum, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.unique&amp;#039;, 2, fn, &amp;#039;function&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.unique&amp;#039;, 3, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enum = mw.clone(enum) end&lt;br /&gt;
	fn = fn or function(item) return item end&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enum))&lt;br /&gt;
	local len = 0&lt;br /&gt;
	local hash = {}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while enum[i] ~= nil do&lt;br /&gt;
		local id = fn(enum[i])&lt;br /&gt;
		if not hash[id] then&lt;br /&gt;
			len = len + 1&lt;br /&gt;
			r[len] = enum[i]&lt;br /&gt;
			hash[id] = true&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.zip(enums, clone)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.zip&amp;#039;, 1, enums, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Module:Enum.zip&amp;#039;, 2, clone, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	if clone then enums = mw.clone(enums) end&lt;br /&gt;
	local r = setmetatable({}, getmetatable(enums))&lt;br /&gt;
	local _, longest = p.max_by(enums, function(enum) return #enum end)&lt;br /&gt;
	for i = 1, longest do&lt;br /&gt;
		local q = {}&lt;br /&gt;
		for j = 1, #enums do&lt;br /&gt;
			table.insert(q, enums[j][i])&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(r, q)&lt;br /&gt;
	end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zeroclanzhang</name></author>
	</entry>
</feed>