#ifndef TASK_H
#define TASK_H
#include <stdbool.h>
#include "future.h"
#include "cor_thread_local.h"

typedef struct Task Task;

extern _Cor_thread_local Task *current_task;

typedef bool (*Task_Entry)(void *param, void **res);

void Task_ctor(Task *tsk, Task_Entry entry, void *param);
Task *Task_New(Task_Entry entry, void *param);
void Task_dtor(Task *tsk);
void Task_Delete(Task *tsk);
static inline bool Task_Await(Task *tsk, void **res);
void Task_Cancel(Task *tsk, void *cancel_value);
static inline bool Task_IsCanceled(Task *tsk);
static inline Future *Task_GetAwaitedFuture(Task *tsk);
bool Task_Run(Task_Entry start, void *value, void **res);

#include "task.def.h"
#endif
