#!/usr/local/bin/bx
use b

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)

proc my_factorial_coro()
	state int i
	for i=9; i>=0; --i
		int j = factorial(i)
		printf("  %d %d\n", i, j)
		yield()

proc my_fibonacci_coro()
	state int i
	for i=1; i<8; ++i
		int j = fibonacci(i)
		printf("    %d %d\n", i, j)
		yield()

proc my_main_coro()
	state int i
	for i=0; i<10; ++i
		printf("%d\n", i)
		yield()

Main()
	sched_init()
	new(m, my_main_coro)
	new(c, my_fibonacci_coro)
	new(c2, my_factorial_coro)
#	repeat(100000)
#		c->p.pc = 1
#		c2->p.pc = 1
#		m->p.pc = 1
	start(c) ; start(c2) ; start(m)
	run()
