summaryrefslogtreecommitdiff
path: root/example/src/main/scala/example/main.scala
blob: 473cce0c73e5534db8a52880e3f2301bc4e298da (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package example

import escale.Channel
import scala.async.Async
import scala.async.Async._
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
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))
    await(ch.put(2))
    await(ch.put(5))
  }

  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)

}