awesome/lib/gears/math.lua

97 lines
2.1 KiB
Lua

---------------------------------------------------------------------------
-- Various math related functions.
--
--- Math module for gears.
--
-- @utillib gears.math
---------------------------------------------------------------------------
local rtable = table
local gmath = {}
local function subset_mask_apply(mask, set)
local ret = {}
for i = 1, #set do
if mask[i] then
rtable.insert(ret, set[i])
end
end
return ret
end
local function subset_next(mask)
local i = 1
while i <= #mask and mask[i] do
mask[i] = false
i = i + 1
end
if i <= #mask then
mask[i] = 1
return true
end
return false
end
--- Return all subsets of a specific set.
-- This function, giving a set, will return all subset it.
-- For example, if we consider a set with value { 10, 15, 34 },
-- it will return a table containing 2^n set:
-- { }, { 10 }, { 15 }, { 34 }, { 10, 15 }, { 10, 34 }, etc.
-- @param set A set.
-- @return A table with all subset.
-- @staticfct gears.math.subsets
function gmath.subsets(set)
local mask = {}
local ret = {}
for i = 1, #set do mask[i] = false end
-- Insert the empty one
rtable.insert(ret, {})
while subset_next(mask) do
rtable.insert(ret, subset_mask_apply(mask, set))
end
return ret
end
--- Make i cycle.
-- @param t A length. Must be greater than zero.
-- @param i An absolute index to fit into #t.
-- @return An integer in (1, t) or nil if t is less than or equal to zero.
-- @staticfct gears.math.cycle
function gmath.cycle(t, i)
if t < 1 then return end
i = i % t
if i == 0 then
i = t
end
return i
end
--- Round a number to an integer.
-- @tparam number x
-- @treturn integer
-- @staticfct gears.math.round
function gmath.round(x)
return math.floor(x + 0.5)
end
--- Return the sign of the number x
-- return 1 if x is positive, -1 if negative and 0 if x is 0
-- @tparam number x
-- @treturn integer
-- @staticfct gears.math.sign
function gmath.sign(x)
if x > 0 then
return 1
elseif x < 0 then
return -1
else
return 0
end
end
return gmath