A lightweight programming environment for desktop and mobile devices
-- Animate 'f' by smearing its work across multiple frames.
-- Pause animation in the current frame using end_frame().
animate = function(f, ...)
	local args = {...}
	Error_with_callstack = nil
	local co = coroutine.create(
						function()
							xpcall(function()
											f(unpack(args))
										end,
										save_callstack)
						end)
	coroutine.resume(co, ...)
	if Error_with_callstack then
		error(Error_with_callstack)
	end
	table.insert(Animations_in_progress, {co=co})
end