--!native
--!strict
local thread: thread? = nil

local function passer(fn, ...): ()
	local hold = thread
	thread = nil
	fn(...)
	thread = hold
end

local function yield(): never
	while true do
		passer(coroutine.yield())
	end
end

if not thread then
	thread = coroutine.create(yield)
	coroutine.resume(thread :: any, thread)
end

return function(fn: (...any) -> (), ...: any): ()
	if not thread then
		thread = coroutine.create(yield)
		coroutine.resume(thread :: any, thread)
	end
	task.spawn(thread :: thread, fn, ...)
end
