Jelajahi Sumber

[future.h] Adding support for chaining futures

Vinicius Teshima 11 bulan lalu
induk
melakukan
fe3d627362
2 mengubah file dengan 51 tambahan dan 6 penghapusan
  1. 28 4
      src/future.h
  2. 23 2
      src/poll.c

+ 28 - 4
src/future.h

@@ -2,23 +2,47 @@
 #define POLLABLE_H
 
 typedef void *(*future_poll_func)(void *env, void *data);
+typedef struct future (*future_then_func)(void *env, void *result);
 
 struct future {
 	future_poll_func f;
+	future_then_func then;
 	void *env;
 };
 
-void *future_poll(struct future p, void *data);
+void *future_poll(struct future *p, void *data);
 
 #if defined(IMP) || defined(POLLABLE_IMP)
 
+#include <stdlib.h>
+
 void *
-future_poll(struct future p, void *data)
+future_poll(struct future *p, void *data)
 {
-	if ( p.f == NULL ) {
+	if ( p->then != NULL ) {
+		void *res = p->f(p->env, data);
+
+		if ( res == NULL ) {
+			return NULL;
+		}
+
+		{
+			struct future new_ftr;
+			new_ftr = p->then(p->env, res);
+			p->f = new_ftr.f;
+			p->env = new_ftr.env;
+			p->then = new_ftr.then;
+		}
+
 		return NULL;
 	}
-	return p.f(p.env, data);
+
+	if ( p->f == NULL ) {
+		/* TODO: Raire ERR */
+		return NULL;
+	}
+
+	return p->f(p->env, data);
 }
 
 #endif /* defined(IMP) || defined(POLLABLE_IMP) */

+ 23 - 2
src/poll.c

@@ -11,6 +11,7 @@ struct counter {
 };
 
 void *counter_future(void *env, void *data);
+struct future counter_then(void *env, void *result);
 
 int
 main(int argc, char *argv[])
@@ -22,14 +23,15 @@ main(int argc, char *argv[])
 
 	counter_f1.f = &counter_future;
 	counter_f1.env = &c1;
+	counter_f1.then = counter_then;
 	counter_f2.f = &counter_future;
 	counter_f2.env = &c2;
 
 	while ( true ) {
 		void *r1 = NULL;
 		void *r2 = NULL;
-		r1 = future_poll(counter_f1, NULL);
-		r2 = future_poll(counter_f2, NULL);
+		r1 = future_poll(&counter_f1, NULL);
+		r2 = future_poll(&counter_f2, NULL);
 		if ( r1 != NULL && r2 != NULL ) {
 			break;
 		}
@@ -53,3 +55,22 @@ counter_future(void *env, void *data)
 	(void) data;
 	return NULL;
 }
+
+struct future
+counter_then(void *env, void *result)
+{
+	struct future ftr = {0};
+	struct counter *c = (struct counter *)env;
+	uint32_t res = *(uint32_t *) result;
+
+	printf("\t\tResult: %d\n", res);
+
+	c->count += 5;
+	c->end += 10;
+	ftr.f = counter_future;
+	ftr.env = c;
+	if ( res < 35 ) {
+		ftr.then = counter_then;
+	}
+	return ftr;
+}