#include <alef.h>

void
counter(chan(int) c)
{
       int i;

       for(i = 2; ; i++)
               c <-= i;
}

void
filter(int prime, chan(int) listen, chan(int) send)
{
       int i;

       for(;;)
               if((i=<-listen)%prime)
                       send<-=i;
}

void
sieve(chan(int) in, chan(int) out)
{
       int prime;
       chan(int) newc;

       for(;;) {
               prime = <-in;
               out <-= prime;
               alloc newc;
               task filter(prime, in, newc);
               in = newc;
       }
}

void
main(void)
{
       char c;
       int i;
       chan(int) count, primes;

       alloc count, primes;

       proc counter(count);
       task sieve(count, primes);

       for(c = 0; c < 100; c++)
               print("%d ", <-primes);

       print("done\n");
}