import concurrency;

module parallelOr with {

  def or(def b1: Boolean, def b2: Boolean): Boolean = {
    join {
      def res: Boolean;
      def res1(b: Boolean): nil;
      def res2(b: Boolean): nil;
      def res1_false: Boolean;
      def res2_false: Boolean;
      res & res1(b) = if (b) reply (b) to res else reply (res1_false) to res;
      res1_false & res2(b) = reply (b) to res1_false;
      res & res2(b) = if (b) reply (b) to res else reply (res2_false) to res;
      res2_false & res1(b) = reply (b) to res2_false;
    }
    spawn < res1(b1) | res2(b2) >;
    res
  }

  def main(args: Array[String]): Unit = {
    def loop: Boolean = { sleep(0); loop }
    System.out.println("True || True = " + or(True, True));
    System.out.println("False || False = " + or(False, False));
    System.out.println("False || True = " + or(False, True));
    System.out.println("True || False = " + or(True, False));
    System.out.println("True || loop = " + or(True, loop));
    System.out.println("loop || True = " + or(loop, True));
  }

}

