more interesting demos

This commit is contained in:
Fabian Jakobs 2012-03-21 12:56:31 +01:00
commit 0ff2e3540a
2 changed files with 99 additions and 27 deletions

View file

@ -1,26 +1,41 @@
//http://groovy.codehaus.org/Concurrency+with+Groovy //http://groovy.codehaus.org/Martin+Fowler%27s+closure+examples+in+Groovy
import java.util.concurrent.atomic.AtomicInteger
def counter = new AtomicInteger() class Employee {
def name, salary
synchronized out(message) { boolean manager
println(message) String toString() { return name }
} }
def th = Thread.start { def emps = [new Employee(name:'Guillaume', manager:true, salary:200),
for( i in 1..8 ) { new Employee(name:'Graeme', manager:true, salary:200),
sleep 30 new Employee(name:'Dierk', manager:false, salary:151),
out "thread loop $i" new Employee(name:'Bernd', manager:false, salary:50)]
counter.incrementAndGet()
} def managers(emps) {
emps.findAll { e -> e.isManager() }
} }
for( j in 1..4 ) { assert emps[0..1] == managers(emps) // [Guillaume, Graeme]
sleep 50
out "main loop $j" def highPaid(emps) {
counter.incrementAndGet() threshold = 150
emps.findAll { e -> e.salary > threshold }
} }
th.join() assert emps[0..2] == highPaid(emps) // [Guillaume, Graeme, Dierk]
assert counter.get() == 12 def paidMore(amount) {
{ e -> e.salary > amount}
}
def highPaid = paidMore(150)
assert highPaid(emps[0]) // true
assert emps[0..2] == emps.findAll(highPaid)
def filename = 'test.txt'
new File(filename).withReader{ reader -> doSomethingWith(reader) }
def readersText
def doSomethingWith(reader) { readersText = reader.text }
assert new File(filename).text == readersText

View file

@ -1,12 +1,69 @@
//http://www.scala-lang.org/node/227 // http://www.scala-lang.org/node/54
/* Defines a new method 'sort' for array objects */
object implicits extends Application { package examples.actors
implicit def arrayWrapper[A : ClassManifest](x: Array[A]) =
new { import scala.actors.Actor
def sort(p: (A, A) => Boolean) = { import scala.actors.Actor._
util.Sorting.stableSort(x, p); x
} abstract class PingMessage
} case object Start extends PingMessage
val x = Array(2, 3, 1, 4) case object SendPing extends PingMessage
println("x = "+ x.sort((x: Int, y: Int) => x < y)) case object Pong extends PingMessage
abstract class PongMessage
case object Ping extends PongMessage
case object Stop extends PongMessage
object pingpong extends Application {
val pong = new Pong
val ping = new Ping(100000, pong)
ping.start
pong.start
ping ! Start
}
class Ping(count: Int, pong: Actor) extends Actor {
def act() {
println("Ping: Initializing with count "+count+": "+pong)
var pingsLeft = count
loop {
react {
case Start =>
println("Ping: starting.")
pong ! Ping
pingsLeft = pingsLeft - 1
case SendPing =>
pong ! Ping
pingsLeft = pingsLeft - 1
case Pong =>
if (pingsLeft % 1000 == 0)
println("Ping: pong from: "+sender)
if (pingsLeft > 0)
self ! SendPing
else {
println("Ping: Stop.")
pong ! Stop
exit('stop)
}
}
}
}
}
class Pong extends Actor {
def act() {
var pongCount = 0
loop {
react {
case Ping =>
if (pongCount % 1000 == 0)
println("Pong: ping "+pongCount+" from "+sender)
sender ! Pong
pongCount = pongCount + 1
case Stop =>
println("Pong: Stop.")
exit('stop)
}
}
}
} }