function emergeblocks_callback(pos, action, num_calls_remaining, ctx)
	if ctx.total_blocks == 0 then
		ctx.total_blocks = num_calls_remaining + 1
		ctx.current_blocks = 0
	end
	ctx.current_blocks = ctx.current_blocks + 1
	if ctx.current_blocks == ctx.total_blocks then
		if ctx.name then
			minetest.chat_send_player(ctx.name,
				string.format("Finished emerging %d blocks in %.2fms.",
				ctx.total_blocks, (os.clock() - ctx.start_time) * 1000))
		end
		ctx:callback()
	elseif ctx.progress then
		ctx:progress()
	end
end

function maps.emerge_with_callbacks(name, pos1, pos2, callback, progress)
	local context = {
		current_blocks = 0,
		total_blocks = 0,
		start_time = os.clock(),
		name = name,
		callback = callback,
		progress = progress,
	}
	minetest.emerge_area(pos1, pos2, emergeblocks_callback, context)
end