improve on abstract actor map

This commit is contained in:
Thibault Duplessis 2014-05-10 21:43:37 +02:00
parent 005ee13634
commit 4086d49dcc
2 changed files with 13 additions and 31 deletions

View file

@ -16,46 +16,27 @@ trait ActorMap[A <: Actor] extends Actor {
def actorMapReceive: Receive = {
case Get(id) => sender ! {
(actors get id) | {
context.actorOf(Props(mkActor(id)), name = id) ~ { actor =>
actors = actors + (id -> actor)
context watch actor
}
}
}
case Get(id) => sender ! getOrMake(id)
case Tell(id, msg) => withActor(id)(_ forward msg)
case Tell(id, msg) => getOrMake(id) forward msg
case TellAll(msg) => tellAll(msg)
case TellAll(msg) => actors.values foreach (_ forward msg)
case Ask(id, msg) => get(id) flatMap (_ ? msg) pipeTo sender
case Ask(id, msg) => getOrMake(id) ? msg pipeTo sender
case Size => sender ! actors.size
case Terminated(actor) => {
case Terminated(actor) =>
context unwatch actor
actors filter (_._2 == actor) foreach {
case (id, _) => actors = actors - id
}
}
private def getOrMake(id: String) = (actors get id) | {
context.actorOf(Props(mkActor(id)), name = id) ~ { actor =>
actors = actors + (id -> actor)
context watch actor
}
}
def tellAll(msg: Any) {
actors.values foreach (_ ! msg)
}
// sequential
def askAll(msg: Any): Fu[List[Any]] = {
actors.values.toList map (_ ? msg)
} sequenceFu
// concurrent
def zipAll[A: Monoid: Manifest](msg: Any): Fu[A] = {
actors.values.toList map (_ ? msg mapTo manifest[A])
}.suml
def get(id: String): Fu[ActorRef] = self ? Get(id) mapTo manifest[ActorRef]
def withActor(id: String)(op: ActorRef => Unit) = get(id) foreach op
}

View file

@ -75,7 +75,8 @@ final class Env(
def receive: Receive = ({
case msg@lila.chat.actorApi.ChatLine(id, line) =>
self ! lila.hub.actorApi.map.Tell(id take 8, msg)
case m: lila.hub.actorApi.game.ChangeFeatured => tellAll(m)
case m: lila.hub.actorApi.game.ChangeFeatured =>
self ! lila.hub.actorApi.map.TellAll(m)
}: Receive) orElse socketHubReceive
}),
name = SocketName)