use Monoid[Future[_]] to append concurrent futures

This commit is contained in:
Thibault Duplessis 2013-09-26 22:31:01 +02:00
parent b455b09614
commit 78d06db07e
2 changed files with 10 additions and 4 deletions

View file

@ -6,6 +6,7 @@ import actorApi.map._
import akka.actor._
import akka.pattern.{ ask, pipe }
import makeTimeout.short
import scalaz.Monoid
trait ActorMap[A <: Actor] extends Actor {
@ -42,10 +43,16 @@ trait ActorMap[A <: Actor] extends Actor {
actors.values foreach (_ ! msg)
}
// sequential
protected def askAll(msg: Any): Fu[List[Any]] = {
actors.values.toList map (_ ? msg)
} sequenceFu
// concurrent
protected def zipAll[A: Monoid: Manifest](msg: Any): Fu[A] = {
actors.values.toList map (_ ? msg mapTo manifest[A])
}.suml
protected def get(id: String): Fu[ActorRef] = self ? Get(id) mapTo manifest[ActorRef]
protected def withActor(id: String)(op: ActorRef Unit) = get(id) foreach op

View file

@ -1,14 +1,14 @@
package lila.socket
import actorApi._
import akka.actor._
import akka.pattern.{ ask, pipe }
import makeTimeout.short
import play.api.libs.json._
import actorApi._
import lila.hub.actorApi.{ GetNbMembers, NbMembers, WithUserIds, WithSocketUserIds, SendTo, SendTos }
import lila.hub.ActorMap
import lila.socket.actorApi.{ Connected _, _ }
import makeTimeout.short
trait SocketHubActor[A <: SocketActor[_]] extends Socket with ActorMap[A] {
@ -16,8 +16,7 @@ trait SocketHubActor[A <: SocketActor[_]] extends Socket with ActorMap[A] {
private def _socketHubReceive: Receive = {
case msg @ GetNbMembers
askAll(msg) mapTo manifest[List[Int]] map (_.sum) pipeTo sender
case msg @ GetNbMembers zipAll[Int](msg) pipeTo sender
case msg @ NbMembers(_) tellAll(msg)