import concurrency;

class Semaphore with {
  
  module join with {
    def get: Unit;
    def release: Unit;
    private def available: nil;
    private def nonAvailable: nil;
    get & available = spawn < (reply to get) | nonAvailable >;
    release & available = spawn < (reply to release) | available >;
    release & nonAvailable = spawn < (reply to release) | available >;
  }
  available;
}

module semaphoreTest with {
  
  def main(args: Array[String]): Unit = {
    val sem = new Semaphore;
    sem.release; System.out.println("sem.release");
    sem.get; System.out.println("sem.get");
    sem.release; System.out.println("sem.release");
    sem.get; System.out.println("sem.get");
    sem.get; System.out.println("sem.get");
  }
}


