The more lua code I write in the pico-8, the more general purpose functions I wind up discovering. Here is my current utility library, I'll probably continue adding more as time progresses.
Quick sort
This one is pretty straight forward, you simply call it by providing a table and an optional comparator (for non-numeric lists), and it will in-place sort your table. It currently does not return anything, but it could me modified to return the table passed if you want to chain things.
-- Inplace quick sort
function qsort(tbl, cmp, first, last)
first = first or 1
last = last or #tbl
cmp = cmp or function (x,y) return x - y end
if (first >= last) then
return
end
local pivot, pv, tail = first, tbl[pivot], last
while pivot < tail do
local tv = tbl[tail]
-- Tail is smaller than the pivot
-- Shuffle things around
if ( cmp(pv, tv) > 0 ) then
tbl[pivot], pivot = tv, pivot + 1
tbl[tail] = tbl[pivot]
end
tail = tail - 1
end
tbl[pivot] = pv
qsort(tbl, cmp, first, pivot - 1)
qsort(tbl, cmp, pivot + 1, last)
end
|
Unpack is a useful function for converting a table into an argument list (similar to kargs in python), or assign a bunch of locals quickly:
IE: local x, y, z = unpack(vector) or print(join(",", unpack(numbers)))
-- Unpack table into spread values function unpack(y, i) i = i or 1 local g = y[i] if (g) return g, unpack(y, i + 1) end |
Enum does what you would expect, it's basically ipairs with an optional filter (in case you want to unpack the values, for example)
-- Enumerate and potentially filter a table function enum(t, filter) local i = 0 filter = filter or function (v) return v end return function() local o = t[i] i += 1 if (o) return i, filter(o) end end |
Join is my function for concatinating a list of arguments with a seperator. It's useful for displaying things like vectors.
-- Join arguments by a seperator
function join(a, b, ...)
x = {...}
for i = 1,#x do
b = b .. a .. x[i]
end
return b
end
|
[Please log in to post a comment]




