#!/usr/local/bin/cz --
use stdio.h
use ccoro

# ccoro demo program

int factorial(int n)
	if n == 0
		return 1
	return n * factorial(n-1)

int fibonacci(int n)
	if n == 0 || n == 1
		return n
	return fibonacci(n-1) + fibonacci(n-2)

my_factorial_coro(coro *caller)
	int i
	for i=9 ; i>=0 ; --i
		int j = factorial(i)
		printf("  %d %d\n", i, j)
		cyield(&caller)

my_fibonacci_coro(coro *caller)
	int i
	for i=1 ; i<8 ; ++i
		int j = fibonacci(i)
		printf("    %d %d\n", i, j)
		cyield(&caller)

int main()
	coro *c = new_coro(my_fibonacci_coro)
	coro *c2 = new_coro(my_factorial_coro)
	int i
	for i=0 ; i<10 ; ++i
		printf("%d\n", i)
		cyield(&c)
		cyield(&c2)
	if c || c2
		fprintf(stderr, "the coros did not finish\n")
		return 1
	return 0
