function map(f, l)
local m = {}
for i = 1, getn(l) do m[i] = f(l[i]) end
return m
end
function mapCall(f, l)
local m = {}
for i = 1, getn(l) do m[i] = call(f, l[i]) end
return m
end
function apply(f, l)
for i = 1, getn(l) do f(l[i]) end
end
function assign(l)
foreach(l, function (i, v) setglobal(i, v) end)
end
function listify(t)
local l = {}
foreach(t, function (i, v) tinsert(%l, {i,v}) end)
return l
end
function loop(n, f)
local l = {}
for i = 1, n do tinsert(l, f(i)) end
return l
end
function concat(l, m)
local n = {}
foreachi(l, function (i, v) tinsert(%n, v) end)
foreachi(m, function (i, v) tinsert(%n, v) end)
return n
end
function reverse(l)
local m = {}
for i = getn(l), 1, -1 do tinsert(m, l[i]) end
return m
end
function zipWith(f, ls)
local m, len = {}, getn(ls)
for i = 1, call(max, map(getn, ls)) do
local t = {}
for j = 1, len do tinsert(t, ls[j][i]) end
tinsert(m, call(f, t))
end
return m
end
function transpose(ls)
local ms, len = {}, getn(ls)
for i = 1, call(max, map(getn, ls)) do
ms[i] = {}
for j = 1, len do
tinsert(ms[i], ls[j][i])
end
end
return ms
end
zip = transpose
unzip = transpose
function project(l, f)
local p = {}
for i = 1, getn(l) do
p[i] = l[i][f]
end
return p
end
function makeIndex(f, l)
local ind = {}
for i = 1, getn(l) do
ind[l[i][f]] = i
end
return ind
end