lila/modules/socket/src/main/MemberGroup.scala

34 lines
853 B
Scala
Raw Normal View History

2017-09-30 18:06:56 -06:00
package lila.socket
import scala.collection.mutable.AnyRefMap
/*
* NOT thread safe
* Use in an actor
*/
final class MemberGroup[M <: SocketMember](groupOf: M => Option[String]) {
private type Group = String
2019-07-13 12:02:50 -06:00
private type SriString = String
2017-09-30 18:06:56 -06:00
2019-07-13 12:02:50 -06:00
private val groups = AnyRefMap.empty[Group, AnyRefMap[SriString, M]]
2017-09-30 18:06:56 -06:00
2019-07-13 12:02:50 -06:00
def add(sri: Socket.Sri, member: M): Unit = groupOf(member) foreach { group =>
2017-09-30 18:06:56 -06:00
groups get group match {
2019-07-13 12:02:50 -06:00
case None => groups += (group -> AnyRefMap(sri.value -> member))
case Some(members) => members += (sri.value -> member)
2017-09-30 18:06:56 -06:00
}
}
2019-07-13 12:02:50 -06:00
def remove(sri: Socket.Sri, member: M): Unit = groupOf(member) foreach { group =>
2017-09-30 18:06:56 -06:00
groups get group foreach { members =>
2019-07-13 12:02:50 -06:00
members -= sri.value
2017-09-30 18:06:56 -06:00
if (members.isEmpty) groups -= group
}
}
def get(group: Group) = groups get group
def keys = groups.keys
}