improve on abstract actor map
This commit is contained in:
parent
005ee13634
commit
4086d49dcc
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue