#ifndef CO
#define CO

template <class ... DP>
class Co
{
	public: virtual Co<DP...>* Routine(DP ... dp)
	{
		return 0;
	}
};

template <class ... DP>
void Coroutine(Co<DP...> * co, DP ... dp)
{
	while(co)
	co = co->Routine(dp...);
}

template <class ... DP>
void Coroutine(Co<DP...>** routines, DP ... dp)
{
	for (int i=0; routines[i]; i++)
	Coroutine(routines[i], dp...);
}

template <class ... DP>
Co<DP...>** Continuation(Co<DP...>** ntinuations, DP ... dp)
{
	for (int i=0; ntinuations[i]; i++)
	ntinuations[i] = ntinuations[i]->Routine(dp...);

	return ntinuations;
}

template <class ... PP>
class Funky
{
	public: virtual void Trigger(PP...) { }
};

template <typename TP>
static TP* Singleton()
{
	static TP singleton;
	return &singleton;
}

#endif
