<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Anumber_list%2Futils</id>
	<title>Module:number list/utils - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Anumber_list%2Futils"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:number_list/utils&amp;action=history"/>
	<updated>2026-05-23T23:06:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:number_list/utils&amp;diff=313960&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;local export = {}  -- Map a function over `list`, which may in fact be a list of strings, a single string or nil. In general, a single -- string is treated like a one-element list and nil is treated like a zero-element list. Any return values of the -- function will be collected into a flattened list, where a single string is again treated like a one-element list and -- nil is treated like a zero-element list. If the resulting list has one element (a string), that string...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:number_list/utils&amp;diff=313960&amp;oldid=prev"/>
		<updated>2023-06-29T21:34:51Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local export = {}  -- Map a function over `list`, which may in fact be a list of strings, a single string or nil. In general, a single -- string is treated like a one-element list and nil is treated like a zero-element list. Any return values of the -- function will be collected into a flattened list, where a single string is again treated like a one-element list and -- nil is treated like a zero-element list. If the resulting list has one element (a string), that string...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
-- Map a function over `list`, which may in fact be a list of strings, a single string or nil. In general, a single&lt;br /&gt;
-- string is treated like a one-element list and nil is treated like a zero-element list. Any return values of the&lt;br /&gt;
-- function will be collected into a flattened list, where a single string is again treated like a one-element list and&lt;br /&gt;
-- nil is treated like a zero-element list. If the resulting list has one element (a string), that string will be&lt;br /&gt;
-- returned, and if the resulting list has no elements, nil will be returned. When calling a function on a string, if&lt;br /&gt;
-- the string has modifiers (e.g. &amp;#039;vuitanta-vuit&amp;lt;tag:Central&amp;gt;&amp;#039; or &amp;#039;سیزده&amp;lt;tr:sizdah&amp;gt;&amp;#039;) and `include_modifiers` is not&lt;br /&gt;
-- specified, the function is called on the part without the modifiers, and the modifiers are then tacked onto the&lt;br /&gt;
-- return value(s) of the function. Strings with multiple modifiers such as &amp;#039;سیزده&amp;lt;tr:sizdah&amp;gt;&amp;lt;tag:Iranian&amp;gt;&amp;#039; are correctly&lt;br /&gt;
-- handled.&lt;br /&gt;
function export.map(fun, list, include_modifiers)&lt;br /&gt;
	if list == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if type(list) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local retval = {}&lt;br /&gt;
		for _, item in ipairs(list) do&lt;br /&gt;
			local mapret = export.map(fun, item, include_modifiers)&lt;br /&gt;
			if type(mapret) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				for _, ret in ipairs(mapret) do&lt;br /&gt;
					table.insert(retval, ret)&lt;br /&gt;
				end&lt;br /&gt;
			elseif mapret ~= nil then&lt;br /&gt;
				table.insert(retval, mapret)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if #retval == 1 then&lt;br /&gt;
			return retval[1]&lt;br /&gt;
		elseif #retval == 0 then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return retval&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not include_modifiers then&lt;br /&gt;
		local term_part, tag_part = list:match(&amp;quot;^(.*)(&amp;lt;.-&amp;gt;)$&amp;quot;)&lt;br /&gt;
		if term_part then&lt;br /&gt;
			local mapret = export.map(fun, term_part)&lt;br /&gt;
			if type(mapret) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				local retval = {}&lt;br /&gt;
				for _, ret in ipairs(mapret) do&lt;br /&gt;
					table.insert(retval, ret .. tag_part)&lt;br /&gt;
				end&lt;br /&gt;
				return retval&lt;br /&gt;
			elseif mapret ~= nil then&lt;br /&gt;
				return mapret .. tag_part&lt;br /&gt;
			else&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return fun(list)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.filter(fun, list, return_single_item)&lt;br /&gt;
	if type(list) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		list = {list}&lt;br /&gt;
	end&lt;br /&gt;
	local retval = {}&lt;br /&gt;
	for _, item in ipairs(list) do&lt;br /&gt;
		if fun(item) then&lt;br /&gt;
			table.insert(retval, item)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if return_single_item and #retval == 1 then&lt;br /&gt;
		retval = retval[1]&lt;br /&gt;
	end&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.power_of(n, base)&lt;br /&gt;
	return (base or 1) .. string.rep(&amp;quot;0&amp;quot;, n)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format a number (either a Lua number or a string) in fixed point without any decimal point or scientific notation.&lt;br /&gt;
-- `tostring()` doesn&amp;#039;t work because it converts large numbers such as 1000000000000000 to &amp;quot;1e+15&amp;quot;.&lt;br /&gt;
function export.format_fixed(number)&lt;br /&gt;
	if type(number) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		return number&lt;br /&gt;
	else&lt;br /&gt;
		return (&amp;quot;%.0f&amp;quot;):format(number)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.add_thousands_separator(num, sep)&lt;br /&gt;
	num = export.format_fixed(num)&lt;br /&gt;
	if #num &amp;gt; 4 then&lt;br /&gt;
		local num_remainder_digits = #num % 3&lt;br /&gt;
		if num_remainder_digits == 0 then&lt;br /&gt;
			num_remainder_digits = 3&lt;br /&gt;
		end&lt;br /&gt;
		local left_remainder_digits = num:sub(1, num_remainder_digits)&lt;br /&gt;
		local right_power_of_3_digits = num:sub(1 + num_remainder_digits)&lt;br /&gt;
		num = left_remainder_digits .. right_power_of_3_digits:gsub(&amp;quot;(...)&amp;quot;, sep .. &amp;quot;%1&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return num&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>