in finagle-core/src/main/scala/com/twitter/finagle/NameTree.scala [159:198]
def simplify[T](tree: NameTree[T]): NameTree[T] = tree match {
case Alt() => Neg
case Alt(tree) => simplify(tree)
case Alt(trees @ _*) =>
@tailrec def loop(trees: Seq[NameTree[T]], accum: Seq[NameTree[T]]): Seq[NameTree[T]] =
trees match {
case Nil => accum
case Seq(head, tail @ _*) =>
simplify(head) match {
case Fail => accum :+ Fail
case Neg => loop(tail, accum)
case head => loop(tail, accum :+ head)
}
}
loop(trees, Nil) match {
case Nil => Neg
case Seq(head) => head
case trees => Alt.fromSeq(trees)
}
case Union() => Neg
case Union(Weighted(_, tree)) => simplify(tree)
case Union(trees @ _*) =>
@tailrec def loop(trees: Seq[Weighted[T]], accum: Seq[Weighted[T]]): Seq[Weighted[T]] =
trees match {
case Nil => accum
case Seq(Weighted(w, tree), tail @ _*) =>
simplify(tree) match {
case Fail | Neg => loop(tail, accum)
case tree => loop(tail, accum :+ Weighted(w, tree))
}
}
loop(trees, Nil) match {
case Nil => Neg
case Seq(Weighted(_, tree)) => tree
case trees => Union.fromSeq(trees)
}
case other => other
}