Mercurial > prosody-hg
comparison util/human/units.lua @ 10889:25e0ec11b4e4
util.human.units: Put math functions into locals
Primarily because the next commit will deal with math.log behaving
differently on Lua 5.1 and that's eaiser with locals.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 03 Jun 2020 20:16:00 +0200 |
| parents | 42a0d9089de9 |
| children | a451f80d1cea |
comparison
equal
deleted
inserted
replaced
| 10888:42a0d9089de9 | 10889:25e0ec11b4e4 |
|---|---|
| 1 local math_abs = math.abs; | |
| 2 local math_ceil = math.ceil; | |
| 3 local math_floor = math.floor; | |
| 4 local math_log = math.log; | |
| 5 local math_max = math.max; | |
| 6 local math_min = math.min; | |
| 1 local unpack = table.unpack or unpack; --luacheck: ignore 113 | 7 local unpack = table.unpack or unpack; --luacheck: ignore 113 |
| 2 | 8 |
| 3 local large = { | 9 local large = { |
| 4 "k", 1000, | 10 "k", 1000, |
| 5 "M", 1000000, | 11 "M", 1000000, |
| 34 | 40 |
| 35 -- n: number, the number to format | 41 -- n: number, the number to format |
| 36 -- unit: string, the base unit | 42 -- unit: string, the base unit |
| 37 -- b: optional enum 'b', thousands base | 43 -- b: optional enum 'b', thousands base |
| 38 local function format(n, unit, b) --> string | 44 local function format(n, unit, b) --> string |
| 39 local round = math.floor; | 45 local round = math_floor; |
| 40 local prefixes = large; | 46 local prefixes = large; |
| 41 local logbase = 1000; | 47 local logbase = 1000; |
| 42 local fmt = "%.3g %s%s"; | 48 local fmt = "%.3g %s%s"; |
| 43 if n == 0 then | 49 if n == 0 then |
| 44 return fmt:format(n, "", unit); | 50 return fmt:format(n, "", unit); |
| 46 if b == 'b' then | 52 if b == 'b' then |
| 47 prefixes = binary; | 53 prefixes = binary; |
| 48 logbase = 1024; | 54 logbase = 1024; |
| 49 elseif n < 1 then | 55 elseif n < 1 then |
| 50 prefixes = small; | 56 prefixes = small; |
| 51 round = math.ceil; | 57 round = math_ceil; |
| 52 end | 58 end |
| 53 local m = math.max(0, math.min(8, round(math.abs(math.log(math.abs(n), logbase))))); | 59 local m = math_max(0, math_min(8, round(math_abs(math_log(math_abs(n), logbase))))); |
| 54 local prefix, multiplier = unpack(prefixes, m * 2-1, m*2); | 60 local prefix, multiplier = unpack(prefixes, m * 2-1, m*2); |
| 55 return fmt:format(n / (multiplier or 1), prefix or "", unit); | 61 return fmt:format(n / (multiplier or 1), prefix or "", unit); |
| 56 end | 62 end |
| 57 | 63 |
| 58 return { | 64 return { |
