Skip to content

Instantly share code, notes, and snippets.

@NikitaMelnikov
Created July 27, 2016 10:54
Show Gist options
  • Save NikitaMelnikov/ec63ddfb7a4793ec83927f00bdea41c2 to your computer and use it in GitHub Desktop.
Save NikitaMelnikov/ec63ddfb7a4793ec83927f00bdea41c2 to your computer and use it in GitHub Desktop.
case class Currency(code: String)
object RateProvider {
sealed trait Command
case object Provide extends Command
sealed trait Message
case class CurrencyRate(curreny: Currency, rate: Double)
}
class RateProvider(currency: Currency, storage: ActorRef) extends Actor {
import RateProvider._
private val random = new java.util.Random()
def receive = {
case Provide => storage ! CurrencyRate(currency, random.nextDouble)
}
override def preStart(): Unit = {
context.system.scheduler.schedule(100 millis, 100 millis, self, Provide)
}
}
object Storage {
sealed trait Command
case object NotifyTraders extends Command
case object Put(id: Stirng, currency: Currency, rate: Double)
case object Call(id: Stirng, currency: Currency, rate: Double)
}
class Storage(traders: Seq[ActorRef]) extends Actor {
def receive = {
case rate: CurrencyRate => // implement
case NotifyTraders => latestRate foreach { rate =>
traders foreach (_)
}
}
def latestRate: Future[CurrencyRate] = ??? // Implement query to db
override def preStart(): Unit = {
context.system.scheduler.schedule(100 millis, 100 millis, self, Provide)
}
}
class Traider(id: String, currencies: Seq[Currency], storage: ActorRef) extends Actor {
private def random = new java.util.Random()
def receive = {
case RateProvider.CurrencyRate(currency, rate) if cirrencies contais currency =>
if (random.nextBoolean) {
random.match {
case v if v > 50 => storage ! Put(id, currency, rate)
case _ => storage ! Call(id, currency, rate)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment