mirror of
https://github.com/nmap/nmap.git
synced 2025-12-09 14:11:29 +00:00
135 lines
2.6 KiB
Lua
135 lines
2.6 KiB
Lua
-- See nmaps COPYING for licence
|
|
module(..., package.seeall)
|
|
|
|
--[[
|
|
--
|
|
Functional programming style 'list' operations
|
|
|
|
bool is_empty(list)
|
|
bool is_list(value)
|
|
|
|
value apply(function, list)
|
|
list map(function, list)
|
|
list filter(function, list)
|
|
list flatten(list)
|
|
list append(list1, list2)
|
|
list cons(value1, value2)
|
|
list reverse(list)
|
|
|
|
value car(list)
|
|
value ncar(list, x)
|
|
list cdr(list)
|
|
list ncdr(list, x)
|
|
|
|
where 'list' is an indexed table
|
|
where 'value' is an lua datatype
|
|
--]]
|
|
|
|
-- true if l is empty
|
|
function is_empty(l)
|
|
return table.getn(l) == 0 and true or false
|
|
end
|
|
|
|
-- true if l is a list
|
|
function is_list(l)
|
|
return type(l) == 'table' and true or false
|
|
end
|
|
|
|
-- Pass each elements of l to a function f which takes a single
|
|
-- argument. All the results are returned in an list
|
|
function map(f, l)
|
|
local results = {}
|
|
for i, v in ipairs(l) do
|
|
table.insert(results, f(v))
|
|
end
|
|
return results
|
|
end
|
|
|
|
-- Pass all elements of l to function f which takes a variable
|
|
-- number of arguments or a number of arguments equal to the
|
|
-- size of l. The result of f is returned
|
|
function apply(f, l)
|
|
return f(unpack(l))
|
|
end
|
|
|
|
-- Pass all elements of l to a predicate function f which takes a single
|
|
-- argument. All elements where f(l[x]) is true are returned in an
|
|
-- indexed list
|
|
function filter(f, l)
|
|
local results = {}
|
|
for i, v in ipairs(l) do
|
|
if(f(v)) then
|
|
table.insert(results, v)
|
|
end
|
|
end
|
|
return results
|
|
end
|
|
|
|
-- return first element of a list
|
|
function car(l)
|
|
return l[1]
|
|
end
|
|
|
|
-- return everything but the first element of a list
|
|
function cdr(l)
|
|
return ncdr(l)
|
|
end
|
|
|
|
-- same as car but start at element x
|
|
function ncar(l, x)
|
|
x = x or 1
|
|
return l[x]
|
|
end
|
|
|
|
-- same as cdr but start at element x
|
|
function ncdr(l, x)
|
|
local results = {}
|
|
x = x or 2
|
|
for i = x, table.getn(l) do
|
|
results[i-1] = l[i]
|
|
end
|
|
return results
|
|
end
|
|
|
|
-- prepend a value or list to another value or list
|
|
function cons(v1, v2)
|
|
return{ is_list(v1) and {unpack(v1)} or v1, is_list(v2) and {unpack(v2)} or v2}
|
|
end
|
|
|
|
-- concatenate two lists and return the result
|
|
function append(l1, l2)
|
|
local results = {}
|
|
for i, v in ipairs(l1) do
|
|
table.insert(results, v)
|
|
end
|
|
|
|
for i, v in ipairs(l2) do
|
|
table.insert(results, v)
|
|
end
|
|
return results
|
|
end
|
|
|
|
-- returned l in reverse order
|
|
function reverse(l)
|
|
local results = {}
|
|
for i=table.getn(l), 1, -1 do
|
|
table.insert(results, l[i])
|
|
end
|
|
return results
|
|
end
|
|
|
|
-- return a flat version of nested list l
|
|
function flatten(l)
|
|
local function flat(r, t)
|
|
for i, v in ipairs(t) do
|
|
if(type(v) == 'table') then
|
|
flat(r, v)
|
|
else
|
|
table.insert(r, v)
|
|
end
|
|
end
|
|
return r
|
|
end
|
|
return flat({}, l)
|
|
end
|