Programming environment for editing various of my live apps without restarting them.
-- returns the _minimum separation vector_ if there's a collision
-- requires a pos+halfsize representation for nodes
-- see https://akkartik.itch.io/carousel/devlog/649349/handling-cascading-collisions
collide = function(a, b)
	local delta = {x=a.pos.x-b.pos.x, y=a.pos.y-b.pos.y}
	local abs_delta = {x=math.abs(a.pos.x-b.pos.x), y=math.abs(a.pos.y-b.pos.y)}
	local size = {x=a.hs.x+b.hs.x, y=a.hs.y+b.hs.y}
	local abs_amount = {x=size.x-abs_delta.x, y=size.y-abs_delta.y}
	if abs_amount.x > 0 and abs_amount.y > 0 then
		if abs_amount.x <= abs_amount.y then
			return {x=abs_amount.x*sign(delta.x), y=0}
		else
			return {x=0, y=abs_amount.y*sign(delta.y)}
		end
	end
end