#include <stdbool.h>

typedef struct Coroutine Coroutine;

typedef void (*Coroutine_YieldCallback)(void *this);
typedef void *(*Coroutine_Start)(void *);

void Coroutine_StartSystem();
void Coroutine_StopSystem();
Coroutine *Coroutine_New(void *this, Coroutine_YieldCallback on_yield, Coroutine_Start start);
void *Coroutine_Run(Coroutine *cor, void *value);
void Coroutine_Delete(Coroutine *cor);
void Coroutine_Continue(Coroutine *cor, void *value, bool early);
void *Coroutine_Yield(void *value);
void *Coroutine_GetValue(Coroutine *cor);
Coroutine *Coroutine_GetActive();
bool Coroutine_IsRunning(Coroutine *cor);
