<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AClimate%2Fstats</id>
	<title>Module:Climate/stats - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AClimate%2Fstats"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Climate/stats&amp;action=history"/>
	<updated>2026-05-25T09:39:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Climate/stats&amp;diff=135682&amp;oldid=prev</id>
		<title>imported&gt;Erutuon: fix errorf</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Climate/stats&amp;diff=135682&amp;oldid=prev"/>
		<updated>2018-08-30T00:30:55Z</updated>

		<summary type="html">&lt;p&gt;fix errorf&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local count = require &amp;quot;Module:fun&amp;quot;.count&lt;br /&gt;
&lt;br /&gt;
local function errorf(level, ...)&lt;br /&gt;
	if type(level) == &amp;quot;number&amp;quot; then&lt;br /&gt;
		return error(string.format(...), level + 1)&lt;br /&gt;
	else -- level is actually the format string.&lt;br /&gt;
		return error(string.format(level, ...), 2)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local varargs_or_array_mt = {&lt;br /&gt;
	__index = {&lt;br /&gt;
		arr_func = function (self, arr, i, j)&lt;br /&gt;
			i = i or 1&lt;br /&gt;
			j = j or #arr&lt;br /&gt;
			assert(i &amp;gt; 0 and j &amp;gt; 0)&lt;br /&gt;
			&lt;br /&gt;
			if i == j then&lt;br /&gt;
				return arr[i]&lt;br /&gt;
			elseif i &amp;lt; j then -- |---i+++j---|&lt;br /&gt;
				return self.varargs_func(unpack(arr, i, j))&lt;br /&gt;
			else -- |+++j---i+++|&lt;br /&gt;
				return self.varargs_func(self.varargs_func(unpack(arr, 1, j)),&lt;br /&gt;
					self.varargs_func(unpack(arr, i)))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	__call = function (self, ...)&lt;br /&gt;
		if type(...) == &amp;#039;table&amp;#039; then -- if first argument is table&lt;br /&gt;
			if select(2, ...) then -- if second argument&lt;br /&gt;
				return self:arr_func(...)&lt;br /&gt;
			else&lt;br /&gt;
				return self.varargs_func(unpack((...)))&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return self.varargs_func(...)&lt;br /&gt;
		end&lt;br /&gt;
	end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Create a function that accepts two argument formats: a list of numbers, or&lt;br /&gt;
-- an array containing numbers followed by optional start and end indices&lt;br /&gt;
-- (similar to the arguments to &amp;quot;unpack&amp;quot;, though here the end index can be&lt;br /&gt;
-- greater than the start index).&lt;br /&gt;
local function make_arr_and_varargs_func(varargs_func)&lt;br /&gt;
	return setmetatable({ varargs_func = varargs_func }, varargs_or_array_mt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function sum_varargs (...)&lt;br /&gt;
	local result = 0&lt;br /&gt;
	for i = 1, select(&amp;#039;#&amp;#039;, ...) do&lt;br /&gt;
		result = result + select(i, ...)&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local ops = {&lt;br /&gt;
	sum = make_arr_and_varargs_func(sum_varargs),&lt;br /&gt;
	mean = make_arr_and_varargs_func(&lt;br /&gt;
		function (...)&lt;br /&gt;
			return sum_varargs(...) / select(&amp;#039;#&amp;#039;, ...)&lt;br /&gt;
		end),&lt;br /&gt;
	min = make_arr_and_varargs_func(&lt;br /&gt;
		function (...)&lt;br /&gt;
			local min = math.huge&lt;br /&gt;
			local min_index&lt;br /&gt;
			for i = 1, select(&amp;#039;#&amp;#039;, ...) do&lt;br /&gt;
				local val = select(i, ...)&lt;br /&gt;
				if type(val) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					val, i = val.value, val.index&lt;br /&gt;
				end&lt;br /&gt;
				if val &amp;lt; min then&lt;br /&gt;
					min = val&lt;br /&gt;
					min_index = i&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return { value = min, index = min_index }&lt;br /&gt;
		end),&lt;br /&gt;
	max = make_arr_and_varargs_func(&lt;br /&gt;
		function (...)&lt;br /&gt;
			local max = -math.huge&lt;br /&gt;
			local max_index&lt;br /&gt;
			for i = 1, select(&amp;#039;#&amp;#039;, ...) do&lt;br /&gt;
				local val = select(i, ...)&lt;br /&gt;
				if type(val) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					val, i = val.value, val.index&lt;br /&gt;
				end&lt;br /&gt;
				if val &amp;gt; max then&lt;br /&gt;
					max = val&lt;br /&gt;
					max_index = i&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return { value = max, index = max_index }&lt;br /&gt;
		end),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local stats_mt = {}&lt;br /&gt;
stats_mt.ops = ops&lt;br /&gt;
-- Interprets a field name and then calculates, saves, and returns the desired&lt;br /&gt;
-- value. For instance, &amp;quot;Stats_object.mean&amp;quot; returns the mean of the values in&lt;br /&gt;
-- &amp;quot;Stats_object&amp;quot;, &amp;quot;Stats_object.above_10&amp;quot; the number of values greater than 10.&lt;br /&gt;
function stats_mt:__index(key)&lt;br /&gt;
	if type(key) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Parse field names such as &amp;quot;above_10&amp;quot; or &amp;quot;below_60&amp;quot;.&lt;br /&gt;
	local op, amount = key:match(&amp;quot;(%a+)_(%d+)&amp;quot;)&lt;br /&gt;
	if amount then&lt;br /&gt;
		amount = tonumber(amount)&lt;br /&gt;
		local count =&lt;br /&gt;
			op == &amp;quot;above&amp;quot; and count(function(val) return val &amp;gt; amount end, self)&lt;br /&gt;
			or op == &amp;quot;below&amp;quot; and count(function(val) return val &amp;lt; amount end, self)&lt;br /&gt;
			or errorf(&amp;quot;Unrecognized operation %s&amp;quot;, op)&lt;br /&gt;
		self[key] = count&lt;br /&gt;
		return count&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Parse field names such as &amp;quot;mean&amp;quot; or &amp;quot;summer_min&amp;quot;.&lt;br /&gt;
	local season&lt;br /&gt;
	season, op = key:match(&amp;quot;^(%a-)_?(%a+)$&amp;quot;)&lt;br /&gt;
	if not (season == &amp;quot;&amp;quot; or season == &amp;quot;summer&amp;quot; or season == &amp;quot;winter&amp;quot;) then&lt;br /&gt;
		errorf(&amp;quot;Unrecognized season %s&amp;quot;, season)&lt;br /&gt;
	elseif not ops[op] then&lt;br /&gt;
		errorf(&amp;quot;Unrecognized operation %s&amp;quot;, op)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result&lt;br /&gt;
	if season == &amp;quot;&amp;quot; then&lt;br /&gt;
		result = ops[op](self)&lt;br /&gt;
	else&lt;br /&gt;
		result = ops[op](self, unpack(self[season .. &amp;quot;_months&amp;quot;]))&lt;br /&gt;
	end&lt;br /&gt;
	self[key] = result&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local seasons = { summer = { south = { 10, 3 }, north = { 4, 9 } } }&lt;br /&gt;
seasons.winter = {}&lt;br /&gt;
seasons.winter.south = { seasons.summer.south[2] + 1, seasons.summer.south[1] - 1 }&lt;br /&gt;
seasons.winter.north = { seasons.summer.north[2] + 1, seasons.summer.north[1] - 1 }&lt;br /&gt;
&lt;br /&gt;
-- Allows &amp;quot;stats_mt&amp;quot; to be called as a function, returning a Stats object:&lt;br /&gt;
setmetatable(stats_mt, {&lt;br /&gt;
	__call = function (self, val, Southern_Hemisphere) -- constructor function&lt;br /&gt;
		val = val or {}&lt;br /&gt;
		local hemisphere = Southern_Hemisphere and &amp;quot;south&amp;quot; or &amp;quot;north&amp;quot;&lt;br /&gt;
		val.summer_months, val.winter_months =&lt;br /&gt;
			seasons.summer[hemisphere], seasons.winter[hemisphere]&lt;br /&gt;
		return setmetatable(val, self)&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
return stats_mt&lt;/div&gt;</summary>
		<author><name>imported&gt;Erutuon</name></author>
	</entry>
</feed>