import concurrency;

class SyncChan[a] with {
  
  join {
    def put(x: a): Unit;
    def get: a;
    put(x) & get = spawn < (reply to put) | (reply (x) to get) >;
  }
  
}

module syncChanTest with {

  val random = new java.util.Random(); 

  def producer(n: Int, c: SyncChan[String]): Unit = {
    sleep(1 + random.nextInt(1000));
    c.put("object " + n);
    System.err.println("Producer gave " + n);
    producer(n + 1, c)
  }
  
  def consumer(c: SyncChan[String]): Unit = {
    sleep(1 + random.nextInt(1000));
    val a = c.get;
    System.err.println("Consummer took " + a);
    consumer(c)
  }

  def main(args: Array[String]): Unit = {
    val c = new SyncChan[String];
    spawn < producer(0, c) | consumer(c) >;
  }

}

