#pragma once

entityclass(Promise);

#define Promise_new() Promise_new_(new_pure(Promise))
Promise Promise_new_(Promise this);

/**
 * notify all Promise_then subscribers that this promise has resolved
 */
void Promise_resolve(Promise this);

#define Promise_then(this, handler, userdata) Promise_then_(this, Promise_new(), handler, userdata)
Promise Promise_then_(Promise this, Promise ret, Promise(Promise ret, entity result, entity userdata) handler, entity userdata);

/**
 * notify all Promise_catch subscribers that this promise has rejected
 */
void Promise_reject(Promise this);

#define Promise_catch(this, handler, userdata) Promise_catch_(this, Promise_new(), handler, userdata)
Promise Promise_catch_(Promise this, Promise ret, Promise(Promise ret, entity err, entity userdata) handler, entity userdata);

// utils

#ifndef MENUQC

// TODO: support menu
Promise Promise_sleep(float n);

#endif
