#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "channel.h"
#include "mthread.h"

#define slurp_arguments(offset) av_make(items - offset, PL_stack_base + ax + offset)

MODULE = Thread::Csp              PACKAGE = Thread::Csp  PREFIX = thread_

BOOT:
	global_init(aTHX);

Promise* thread_spawn(SV* class, SV* module, SV* function, ...)
	C_ARGS:
		slurp_arguments(1)

MODULE = Thread::Csp              PACKAGE = Thread::Csp::Promise  PREFIX = promise_

SV* promise_get(Promise* promise)

bool promise_is_finished(Promise* promise)

SV* promise_finished_fh(Promise* promise)

MODULE = Thread::Csp              PACKAGE = Thread::Csp::Channel  PREFIX = channel_

SV* channel_new(SV* class)

void channel_send(Channel* channel, SV* argument)

SV* channel_receive(Channel* channel)

SV* channel_receive_ready_fh(Channel* channel)

SV* channel_send_ready_fh(Channel* channel)

void channel_close(Channel* channel)