packages feed

cfuture-1.0: include/CFuture.h

#include <HsFFI.h>
#if defined(__cplusplus)
extern "C" {
#endif

/**
 * Represents a Haskell Future in C:
 * one StablePtr points to the interruption MVar
 * and the other one to the result MVar.
 */
typedef HsStablePtr CFuture[2];

/**
 * Aborts the calculation
 * and also frees the pointers in the Future.
 */
extern void abortC(CFuture future);

/**
 * Frees the pointers in the Future.
 */
extern void freeC(CFuture future);

/**
 * Waits for the calculation behind the Future
 * and writes the result to the memory location
 * defined by the pointer.
 * If there is an exception instead of a result,
 * it leaves the memory unchanged
 * and returns 0;
 * on success, it returns 1.
 *
 * For waiting for calculations without a result,
 * see `waitC`.
 */
extern HsBool getC_Char(CFuture future, char* destination);
extern HsBool getC_Int(CFuture future, int* destination);
extern HsBool getC_Int8(CFuture future, int8_t* destination);
extern HsBool getC_Int16(CFuture future, int16_t* destination);
extern HsBool getC_Int32(CFuture future, int32_t* destination);
extern HsBool getC_Int64(CFuture future, int64_t* destination);
extern HsBool getC_Word(CFuture future, uint32_t* destination);
extern HsBool getC_Word8(CFuture future, uint8_t* destination);
extern HsBool getC_Word16(CFuture future, uint16_t* destination);
extern HsBool getC_Word32(CFuture future, uint32_t* destination);
extern HsBool getC_Word64(CFuture future, uint64_t* destination);
extern HsBool getC_Float(CFuture future, float* destination);
extern HsBool getC_Double(CFuture future, double* destination);
extern HsBool getC_Bool(CFuture future, int* destination);
extern HsBool getC_Ptr(CFuture future, void** destination);
extern HsBool getC_FunPtr(CFuture future, void (*destination)(void));
extern HsBool getC_StablePtr(CFuture future, HsStablePtr* destination);

/**
 * Waits for the calculation behind the Future.
 * If there is an exception instead of a result,
 * it returns 0;
 * on success, it returns 1.
 *
 * For also retrieving results from non-void Futures,
 * see `getC`.
 */
extern HsBool waitC(CFuture future);

#if defined(__cplusplus)
}
#endif