Module:Utils: Difference between revisions
Prime list still used by module: Uniform map |
Fix for clamp. Improve documentation |
||
| (20 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | |||
local get_args = require("Module:Arguments").getArgs | local get_args = require("Module:Arguments").getArgs | ||
local p | local yesno = require("Module:Yesno") | ||
-- TODO??? Enforce rule for prefixing module-callable functions with an | |||
-- underscore, regardless of whether a wrapper is needed or can be made???? | |||
-- Trim a string (remove leading and trailing, but not interior, whitespace) | |||
function p.trim(s) | |||
return s:match("^%s*(.-)%s*$") | |||
end | |||
-- Wrapper function for template access to [[Module:Yesno]] | |||
function p._yesno(frame) | |||
return yesno(frame.args["input"], frame.args["default"]) | |||
end | |||
-- Clamp function | |||
-- Underscore-prefixed in case a wrapper for a template is ever needed | |||
function p._clamp(value, min_value, max_value) | |||
return math.min(math.max(value, min_value), max_value) | |||
end | |||
-- | -- Check if a table contains the given value | ||
function p.table_contains(tbl, | -- Accepts an optional comparison function that accepts two tables, returning | ||
for i = 1, #tbl do | -- true if value and tbl[i] have the same value. | ||
if | function p.table_contains(tbl, value, compare_func) | ||
if compare_func ~= nil then | |||
-- Use compare function | |||
for i = 1, #tbl do | |||
if compare_func(value, tbl[i]) then | |||
return true | |||
end | |||
end | |||
else | |||
-- No compare function | |||
for i = 1, #tbl do | |||
if value == tbl[i] then | |||
return true | |||
end | |||
end | end | ||
end | end | ||
| Line 12: | Line 45: | ||
end | end | ||
-- | -- Return the first index with the given value (or nil if not found) | ||
function p.index_of(array, value) | -- Accepts an optional comparison function that accepts two tables, returning | ||
for i, v in ipairs(array) do | -- true if value and v have the same value. | ||
if v == value then | function p.index_of(array, value, compare_func) | ||
if compare_func ~= nil then | |||
-- Use compare function | |||
for i, v in ipairs(array) do | |||
if compare_func(v, value) then | |||
return i | |||
end | |||
end | |||
else | |||
-- No compare function | |||
for i, v in ipairs(array) do | |||
if v == value then | |||
return i | |||
end | |||
end | end | ||
end | end | ||
| Line 22: | Line 67: | ||
end | end | ||
-- | -- Check whether the input is a non-empty string | ||
function p.value_provided(s) | function p.value_provided(s) | ||
return type(s) == "string" and #s > 0 | return type(s) == "string" and #s > 0 | ||
end | end | ||
-- | -- Parse a ratio string like "3/2" into a number | ||
-- Use default on error; cannot be used with {{#invoke:}} | |||
function p.eval_num_arg(input, def_value) | function p.eval_num_arg(input, def_value) | ||
local result = input | local result = input | ||
| Line 33: | Line 79: | ||
result = def_value | result = def_value | ||
if type(input) == "string" then | if type(input) == "string" then | ||
-- | -- Check for fraction notation | ||
if input:match("/") == "/" then | if input:match("/") == "/" then | ||
local numerator, denominator = input:match("^%s*([0-9]+)[/?]([0-9]+)%s*$") | local numerator, denominator = input:match("^%s*([0-9]+)[/?]([0-9]+)%s*$") | ||
result = (tonumber(numerator) or def_value) / (tonumber(denominator) or 1) | result = (tonumber(numerator) or def_value) / (tonumber(denominator) or 1) | ||
else | else | ||
result = tonumber(input) | result = tonumber(input) | ||
end | end | ||
| Line 46: | Line 91: | ||
end | end | ||
-- | -- Return logarithm base b of x | ||
function p.log(frame) | function p.log(frame) | ||
local args = get_args(frame) | local args = get_args(frame) | ||
| Line 53: | Line 98: | ||
local LN_2 = math.log(2) | local LN_2 = math.log(2) | ||
-- | -- Return logarithm base 2 of x | ||
function p.log2(x) | function p.log2(x) | ||
return math.log(x) / LN_2 | return math.log(x) / LN_2 | ||
| Line 66: | Line 111: | ||
end | end | ||
-- | -- Return greatest common divisor of a and b | ||
function p.gcd(frame) | function p.gcd(frame) | ||
local args = get_args(frame) | local args = get_args(frame) | ||
| Line 80: | Line 125: | ||
end | end | ||
-- | -- Return x rounded to places decimal places | ||
function p.round_dec(frame) | function p.round_dec(frame) | ||
local args = get_args(frame) | local args = get_args(frame) | ||
| Line 94: | Line 139: | ||
end | end | ||
-- | -- Return x rounded to a precision of prec significant figures | ||
function p.round(frame) | function p.round(frame) | ||
local args = get_args(frame) | local args = get_args(frame) | ||
| Line 112: | Line 157: | ||
end | end | ||
-- | -- Cached list of primes for is_prime | ||
local primes_cache = { | local primes_cache = { | ||
[0] = false, | [0] = false, | ||
| Line 118: | Line 163: | ||
} | } | ||
-- | -- Returns true if integer n is prime; cannot be used with {{#invoke:}} | ||
function p.is_prime(n) | function p.is_prime(n) | ||
local cached = primes_cache[n] | local cached = primes_cache[n] | ||
| Line 134: | Line 179: | ||
end | end | ||
-- | -- Returns prime factorization of integer n > 1; cannot be used with {{#invoke:}} | ||
-- | -- Note: the order of keys is not specified for Lua tables | ||
function p.prime_factorization_raw(n) | function p.prime_factorization_raw(n) | ||
local factors = {} | local factors = {} | ||
| Line 155: | Line 200: | ||
end | end | ||
-- | -- Returns prime factorization of integer n > 2 (with wiki markup for exponents) | ||
function p.prime_factorization(frame) | function p.prime_factorization(frame) | ||
local args = get_args(frame) | local args = get_args(frame) | ||
| Line 190: | Line 235: | ||
end | end | ||
-- | -- Returns signum(x); cannot be used with {{#invoke:}} | ||
function p.signum(x) | function p.signum(x) | ||
if type(x) ~= "number" then | if type(x) ~= "number" then | ||
| Line 204: | Line 249: | ||
end | end | ||
-- | -- Returns the next Young diagram of the same size or nil; cannot be used with {{#invoke:}} | ||
-- | -- Modifies the input table | ||
function p.next_young_diagram(d) | function p.next_young_diagram(d) | ||
if #d == 0 then | if #d == 0 then | ||