| #ifndef GENERATOR_H |
| #define GENERATOR_H |
| #include "coroutine.h" |
| #include <stdbool.h> |
|
| typedef enum Generator_State { |
| Generator_Running, |
| Generator_Deleting, |
| Generator_Complete |
| } Generator_State; |
|
| typedef struct Generator { |
| Coroutine *coroutine; |
| Coroutine *caller; |
| void *(*start)(void *); |
| void *param; |
| Generator_State state; |
| } Generator; |
|
| void Generator_ctor(Generator *gen, void *(*start)(void *), void *param); |
| Generator *Generator_New(void *(*)(void *), void *); |
| void Generator_dtor(Generator *gen); |
| void Generator_Delete(Generator *); |
|
| // Returns true if generator yielded a value, false if generator is complete |
| // *value is set to generator's value (yield / return value from exit) |
| bool Generator_Next(Generator *, void **value); |
|
| // Yield a value from the generator |
| // Returns true if generator should continue, false for generator to exit PDQ |
| bool Generator_Yield(void *); |
|
| #endif |
|