awful.util: add subset() function
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
d5596c06ed
commit
d0b7cc9c97
|
@ -13,6 +13,7 @@ local loadfile = loadfile
|
||||||
local debug = debug
|
local debug = debug
|
||||||
local print = print
|
local print = print
|
||||||
local type = type
|
local type = type
|
||||||
|
local rtable = table
|
||||||
local capi =
|
local capi =
|
||||||
{
|
{
|
||||||
awesome = awesome,
|
awesome = awesome,
|
||||||
|
@ -168,4 +169,49 @@ function file_readable(filename)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
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.
|
||||||
|
function 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
|
||||||
|
|
||||||
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
|
||||||
|
|
Loading…
Reference in New Issue