// Scala source: ./examples/Reference.scala import concurrency; class Reference[a](x: a) with { val monitor$0 = new scala.Monitor; var status$0 = 0; val value$queue = new join.Queue[(scala.Unit, join.SyncVar[a])]; val update$queue = new join.Queue[(a, join.SyncVar[Unit])]; val state$queue = new join.Queue[a]; def rule$0(param$0: scala.Unit, value$cont: join.SyncVar[a], x: a): scala.Unit = spawn.$less(value$cont.set(x)).$bar(state(x)).$greater; def rule$1(x: a, update$cont: join.SyncVar[Unit], y: a): scala.Unit = spawn.$less(update$cont.set(())).$bar(state(x)).$greater; def value: a = { val value$cont = new join.SyncVar[a]; monitor$0.synchronized(if (status$0.$amp(1).$bang$eq(0)) value$queue.put(((), value$cont)) else status$0.match({ case 4 => { val arg$0 = state$queue.get; if (state$queue.isEmpty) status$0 = status$0.$minus(4) ; scala.Predef.fork(rule$0((), value$cont, arg$0)); () } case _ => { status$0 = status$0.$plus(1); value$queue.put(((), value$cont)) } })); value$cont.get }; def update(x: a): Unit = { val update$cont = new join.SyncVar[Unit]; monitor$0.synchronized(if (status$0.$amp(2).$bang$eq(0)) update$queue.put((x, update$cont)) else status$0.match({ case 4 => { val arg$1 = state$queue.get; if (state$queue.isEmpty) status$0 = status$0.$minus(4) ; scala.Predef.fork(rule$1(x, update$cont, arg$1)); () } case _ => { status$0 = status$0.$plus(2); update$queue.put((x, update$cont)) } })); update$cont.get }; private def state(x: a): scala.Unit = monitor$0.synchronized(if (status$0.$amp(4).$bang$eq(0)) state$queue.put(x) else status$0.match({ case 1 => { val (arg$2, arg$3) = value$queue.get; if (value$queue.isEmpty) status$0 = status$0.$minus(1) ; scala.Predef.fork(rule$0(arg$2, arg$3, x)); () } case 2 => { val (arg$4, arg$5) = update$queue.get; if (update$queue.isEmpty) status$0 = status$0.$minus(2) ; scala.Predef.fork(rule$1(arg$4, arg$5, x)); () } case 3 => { val (arg$6, arg$7) = value$queue.get; if (value$queue.isEmpty) status$0 = status$0.$minus(1) ; scala.Predef.fork(rule$0(arg$6, arg$7, x)); () } case _ => { status$0 = status$0.$plus(4); state$queue.put(x) } })); (); state(x) }; module refTest with { def main(args: Array[String]): Unit = { val v = new Reference(5); System.out.println("value = ".$plus(v.value)); v.update(42); System.out.println("value = ".$plus(v.value)); System.out.println("value = ".$plus(v.value)); v.update(23); System.out.println("value = ".$plus(v.value)); System.out.println("value = ".$plus(v.value)) } };