#ifndef FUTURE_H
#define FUTURE_H
#include <stdbool.h>

typedef struct Future Future;


typedef struct Future_vfptrs_t {
    void (*dtor)(Future *);
    void (*await)(Future *);
    void (*set_result)(Future *, bool, void *);
} Future_vfptrs_t;

extern void _Future_Await(Future *fut);
extern void _Future_SetResult(Future *fut, bool canceled, void *res);

// Notified when a Future is done (has a result or is canceled)
typedef void (*Future_Watcher)(void *me, Future *fut);

extern void Future_ctor(Future *fut);
extern Future *Future_New(void);
extern void Future_dtor(Future *fut);
extern void Future_Delete(Future *fut);
extern void Future_SetResult(Future *fut, bool canceled, void *value);
extern bool Future_GetResult(Future *fut, void **res);
extern void Future_AddWatcher(Future *fut, Future_Watcher watcher, void *me);
extern void Future_RemoveWatcher(Future *fut, Future_Watcher watcher, void *me);
extern bool Future_Await(Future *fut, void **res);

#include "future.def.h"
#endif
