module served.fibermanager;

import core.thread;

import std.algorithm;

struct FiberManager
{
	Fiber[] fibers;

	alias fibers this;

	void call()
	{
		size_t[] toRemove;
		foreach (i, fiber; fibers)
		{
			if (fiber.state == Fiber.State.TERM)
				toRemove ~= i;
			else
				fiber.call();
		}
		foreach_reverse (i; toRemove)
			fibers = fibers.remove(i);
	}
}

void joinAll(Fibers...)(Fibers fibers)
{
	FiberManager f;
	Fiber[] converted;
	foreach (fiber; fibers)
	{
		static if (is(fiber == Fiber))
			converted ~= fiber;
		else
			converted ~= new Fiber(fiber);
	}
	f.fibers = converted;
	while (f.length)
	{
		f.call();
		Fiber.yield();
	}
}