in finagle-core/src/main/scala/com/twitter/finagle/NameTree.scala [247:290]
private def showParens[T: Showable](tree: NameTree[T]): String = s"(${show(tree)})"
// return value is restricted to Fail | Neg | Leaf
// NB: discards weights
private def eval[T](tree: NameTree[T]): NameTree[Set[T]] = tree match {
case Union() | Alt() => Neg
case Alt(tree) => eval(tree)
case Union(Weighted(_, tree)) => eval(tree)
case Fail => Fail
case Neg => Neg
case Empty => Leaf(Set.empty)
case Leaf(t) => Leaf(Set(t))
case Union(trees @ _*) =>
@tailrec def loop(trees: Seq[Weighted[T]], accum: Seq[Set[T]]): NameTree[Set[T]] =
trees match {
case Nil =>
accum match {
case Nil => Neg
case _ => Leaf(accum.flatten.toSet)
}
case Seq(Weighted(_, head), tail @ _*) =>
eval(head) match {
case Fail | Neg => loop(tail, accum)
case Leaf(value) => loop(tail, accum :+ value)
case _ => scala.sys.error("bug")
}
}
loop(trees, Nil)
case Alt(trees @ _*) =>
@tailrec def loop(trees: Seq[NameTree[T]]): NameTree[Set[T]] =
trees match {
case Nil => Neg
case Seq(head, tail @ _*) =>
eval(head) match {
case Fail => Fail
case Neg => loop(tail)
case head @ Leaf(_) => head
case _ => scala.sys.error("bug")
}
}
loop(trees)
}