Log In  


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
10



[Please log in to post a comment]