in storehaus-redis/src/main/scala/com/twitter/storehaus/redis/RedisSetStore.scala [99:120]
override def multiPut[K1 <: (Buf, Buf)](
kv: Map[K1, Option[Unit]]): Map[K1, Future[Unit]] = {
// we are exploiting redis's built-in support for bulk updates and removals
// by partioning deletions and updates into 2 maps indexed by the first
// component of the composite key, the key of the set
def emptyMap = Map.empty[Buf, List[K1]].withDefaultValue(Nil)
val (del, persist) = ((emptyMap, emptyMap) /: kv) {
case ((deleting, storing), (key, Some(_))) =>
(deleting, storing.updated(key._1, key :: storing(key._1)))
case ((deleting, storing), (key, None)) =>
(deleting.updated(key._1, key :: deleting(key._1)), storing)
}
del.flatMap {
case (k, members) =>
val value = store.delete(k, members.map(_._2))
members.map(_ -> value)
} ++ persist.flatMap {
case (k, members) =>
val value = store.set(k, members.map(_._2))
members.map(_ -> value)
}
}