From 3c59af848c37e1530876e95f7321c8757855d030 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Tue, 13 Nov 2018 21:08:51 -0800 Subject: Various enhancements - add select support for takes - add syntax sugar - add support for JS and Native --- example/src/main/scala/example/main.scala | 79 ++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 7 deletions(-) (limited to 'example') diff --git a/example/src/main/scala/example/main.scala b/example/src/main/scala/example/main.scala index f6d0a48..a8470a2 100644 --- a/example/src/main/scala/example/main.scala +++ b/example/src/main/scala/example/main.scala @@ -1,6 +1,7 @@ package example import escale.Channel +import scala.async.Async import scala.async.Async._ import scala.concurrent.Await import scala.concurrent.ExecutionContext.Implicits.global @@ -8,8 +9,23 @@ import scala.concurrent.duration._ object Main extends App { + //val t = Channel.timeout(300) + //Await.result(t.take(), 10.seconds) + val ch = Channel[Int](0) +// Channel.select( +// ch -> {(x: Int) => println("a")}, +// ch2 -> {(x: String) => println("a")} +// ) + + val p2 = async { + var a = 0 + while ({a = await(ch.take()); a} < 5) { + println(a) + } + } + val p1 = async { await(ch.put(1)) await(ch.put(2)) @@ -17,14 +33,63 @@ object Main extends App { await(ch.put(5)) } - val p2 = async { - await(ch.take()) - await(ch.take()) - await(ch.take()) - await(ch.take()) - } - val result = Await.result(p2, 3.seconds) println(result) } + +object SelectTest extends App { + + val ch = Channel[Int](0) + val t = Channel.timeout(100) + ch.put(2) + + val out = Channel[String](1) +// +// Await.result(Channel.select(ch, t), 10.seconds) match { +// case (`t`, _) => println("timeout") +// case (`ch`, value) => println(value) +// } + + val r = async { + await(Channel.select(ch, t)) match { + case (`t`, _) => println("timeout") + case (`ch`, value: Int) => await(out.put(value.toString)), + } + await(out.take()) + } + Await.result(r, 10.seconds) + println(r) + +} + + +object Select2Test extends App { + + val ch = Channel[Int](0) + val t = Channel.timeout(100) + ch.put(2) + + val out = Channel[String](0) + // + // Await.result(Channel.select(ch, t), 10.seconds) match { + // case (`t`, _) => println("timeout") + // case (`ch`, value) => println(value) + // } + + Channel.select2( + t -> {u: Unit => println("timeout")}, + ch -> {v: Int => println(v); out.put(v.toString); ()} + ) + + val r = async { + await(Channel.select2( + t -> {u: Unit => println("timeout")}, + out -> {s: String => println(s)} + )) + } + Await.result(r, 10.seconds) + println(r) + + +} -- cgit v1.2.3