summaryrefslogtreecommitdiff
path: root/sources/examples/auction.scala
diff options
context:
space:
mode:
Diffstat (limited to 'sources/examples/auction.scala')
-rw-r--r--sources/examples/auction.scala58
1 files changed, 58 insertions, 0 deletions
diff --git a/sources/examples/auction.scala b/sources/examples/auction.scala
new file mode 100644
index 0000000000..9f96dc2984
--- /dev/null
+++ b/sources/examples/auction.scala
@@ -0,0 +1,58 @@
+package examples;
+
+import java.util.Date;
+import scala.concurrent._;
+
+trait AuctionMessage;
+case class
+ 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
+ AuctionConcluded(seller: Actor, client: Actor), // auction concluded
+ AuctionFailed(), // failed with no bids
+ AuctionOver() extends AuctionReply; // bidding is closed
+
+class Auction(seller: Actor, minBid: Int, closing: Date) extends Actor() {
+
+ val timeToShutdown = 36000000; // msec
+ val bidIncrement = 10;
+ override def run() {
+ var maxBid = minBid - bidIncrement;
+ var maxBidder: Actor = _;
+ var running = true;
+ while (running) {
+ receiveWithin ((closing.getTime() - new Date().getTime())) {
+ case Offer(bid, client) =>
+ if (bid >= maxBid + bidIncrement) {
+ if (maxBid >= minBid) maxBidder send BeatenOffer(bid);
+ maxBid = bid;
+ maxBidder = client;
+ client send BestOffer();
+ } else {
+ client send BeatenOffer(maxBid);
+ }
+
+ case Inquire(client) =>
+ client send Status(maxBid, closing);
+
+ case TIMEOUT() =>
+ if (maxBid >= minBid) {
+ val reply = AuctionConcluded(seller, maxBidder);
+ maxBidder send reply;
+ seller send reply;
+ } else {
+ seller send AuctionFailed();
+ }
+ receiveWithin(timeToShutdown) {
+ case Offer(_, client) => client send AuctionOver()
+ case TIMEOUT() => running = false;
+ }
+ }
+ }
+ }
+}