summaryrefslogtreecommitdiff
path: root/sources/examples/auction.scala
diff options
context:
space:
mode:
authorcremet <cremet@epfl.ch>2003-08-28 09:18:10 +0000
committercremet <cremet@epfl.ch>2003-08-28 09:18:10 +0000
commit7a9bbd21f018981ce132dd7d2d4ab1ca33bd4df2 (patch)
treeb4c3586f512dee71b54152292af0f7d5f2d7c31b /sources/examples/auction.scala
parentf10b65baef4e685cc70a5cf91cfe5cd4a7cefa20 (diff)
downloadscala-7a9bbd21f018981ce132dd7d2d4ab1ca33bd4df2.tar.gz
scala-7a9bbd21f018981ce132dd7d2d4ab1ca33bd4df2.tar.bz2
scala-7a9bbd21f018981ce132dd7d2d4ab1ca33bd4df2.zip
- Made the auction example work (it required to...
- Made the auction example work (it required to fix the mailbox implementation).
Diffstat (limited to 'sources/examples/auction.scala')
-rw-r--r--sources/examples/auction.scala111
1 files changed, 91 insertions, 20 deletions
diff --git a/sources/examples/auction.scala b/sources/examples/auction.scala
index 102892b4c6..8e32831942 100644
--- a/sources/examples/auction.scala
+++ b/sources/examples/auction.scala
@@ -5,54 +5,125 @@ import scala.concurrent._;
trait AuctionMessage;
case class
- Offer(bid: Int, client: Actor), // make a bid
+ Offer(bid: int, client: Actor), // make a bid
Inquire(client: Actor) extends AuctionMessage; // inquire status
trait AuctionReply;
case class
- Status(asked: Int, expiration: Date), // asked sum, expiration date
- BestOffer, // yours is the best offer
- BeatenOffer(maxBid: Int), // offer beaten by maxBid
+ Status(asked: int, expiration: Date), // asked sum, expiration date
+ BestOffer(), // yours is the best offer
+ BeatenOffer(maxBid: int), // offer beaten by maxBid
AuctionConcluded(seller: Actor, client: Actor), // auction concluded
- AuctionFailed, // failed with no bids
- AuctionOver extends AuctionReply; // bidding is closed
+ AuctionFailed(), // failed with no bids
+ AuctionOver() extends AuctionReply; // bidding is closed
-class Auction(seller: Actor, minBid: Int, closing: Date) extends Actor {
+class Auction(seller: Actor, minBid: int, closing: Date) extends Actor {
- val timeToShutdown = 36000000; // msec
+ val timeToShutdown = 3600000; // msec
val bidIncrement = 10;
+
override def run() = {
var maxBid = minBid - bidIncrement;
- var maxBidder: Actor = _;
+ var maxBidder: Actor = null;
var running = true;
+
while (running) {
- receiveWithin ((closing.getTime() - new Date().getTime())) {
+ receiveWithin (closing.getTime() - new Date().getTime()) {
+
case Offer(bid, client) =>
if (bid >= maxBid + bidIncrement) {
- if (maxBid >= minBid) maxBidder send BeatenOffer(bid);
+ if (maxBid >= minBid)
+ maxBidder send BeatenOffer(bid);
maxBid = bid;
maxBidder = client;
- client send BestOffer;
+ client send BestOffer()
} else {
- client send BeatenOffer(maxBid);
- }
+ client send BeatenOffer(maxBid)
+ }
case Inquire(client) =>
- client send Status(maxBid, closing);
+ client send Status(maxBid, closing)
- case TIMEOUT =>
+ case TIMEOUT() =>
if (maxBid >= minBid) {
val reply = AuctionConcluded(seller, maxBidder);
maxBidder send reply;
- seller send reply;
+ seller send reply
} else {
- seller send AuctionFailed;
+ seller send AuctionFailed()
}
receiveWithin(timeToShutdown) {
- case Offer(_, client) => client send AuctionOver
- case TIMEOUT => running = false;
+ case Offer(_, client) => client send AuctionOver()
+ case TIMEOUT() => running = false
}
+
}
}
}
}
+
+////////////////////////// TEST /////////////////////////////////
+
+object testAuction {
+
+ val random = new java.util.Random();
+
+ val minBid = 100;
+ val closing = new Date(new Date().getTime() + 60000);
+
+ val seller = new Actor {
+ override def run() = {}
+ }
+ val auction = new Auction(seller, minBid, closing);
+
+ def client(i: int, increment: int, top: int) = new Actor {
+ val name = "Client " + i;
+ def log(msg: String) = System.out.println(name + ": " + msg);
+ var running = true;
+ var max: int = _;
+ var current: int = 0;
+ override def run() = {
+ log("started");
+ auction send Inquire(this);
+ receive {
+ case Status(maxBid, _) => {
+ log("status(" + maxBid + ")");
+ max = maxBid
+ }
+ }
+ while (running) {
+ if (max >= top)
+ log("too high for me")
+ else if (current < max) {
+ current = max + increment;
+ Thread.sleep(1 + random.nextInt(1000));
+ auction send Offer(current, this);
+ }
+ receive {
+ case BestOffer() => {
+ log("bestOffer(" + current + ")");
+ }
+ case BeatenOffer(maxBid) => {
+ log("beatenOffer(" + maxBid + ")");
+ max = maxBid;
+ }
+ case AuctionConcluded(seller, maxBidder) => {
+ log("auctionConcluded");
+ }
+ case AuctionOver() => {
+ running = false;
+ log("auctionOver");
+ }
+ }
+ }
+ }
+ }
+
+ def main(args: Array[String]) = {
+ seller.start();
+ auction.start();
+ client(1, 20, 200).start();
+ client(2, 10, 300).start();
+ }
+
+}