def dispatch()

in scalding-serialization/src/main/scala/com/twitter/scalding/serialization/macros/impl/ordered_serialization/providers/ProductOrderedBuf.scala [23:160]


  def dispatch(c: Context)(
      buildDispatcher: => PartialFunction[c.Type, TreeOrderedBuf[c.type]]
  ): PartialFunction[c.Type, TreeOrderedBuf[c.type]] = {
    import c.universe._
    val validTypes: List[Type] = List(
      typeOf[Product1[Any]],
      typeOf[Product2[Any, Any]],
      typeOf[Product3[Any, Any, Any]],
      typeOf[Product4[Any, Any, Any, Any]],
      typeOf[Product5[Any, Any, Any, Any, Any]],
      typeOf[Product6[Any, Any, Any, Any, Any, Any]],
      typeOf[Product7[Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product8[Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product9[Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product10[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product11[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product12[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product13[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product14[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product15[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product16[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[Product17[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
      typeOf[
        Product18[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]
      ],
      typeOf[Product19[
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any
      ]],
      typeOf[Product20[
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any
      ]],
      typeOf[Product21[
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any
      ]],
      typeOf[Product22[
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any,
        Any
      ]]
    )

    def validType(curType: Type): Boolean =
      validTypes.exists { t =>
        curType <:< t
      }

    // The `_.get` is safe since it's always preceded by a matching
    // `_.isDefined` check in `validType`
    @SuppressWarnings(Array("org.wartremover.warts.OptionPartial"))
    def symbolFor(subType: Type): Type = {
      val superType = validTypes.find { t =>
        subType.erasure <:< t
      }.get
      subType.baseType(superType.typeSymbol)
    }

    val pf: PartialFunction[c.Type, TreeOrderedBuf[c.type]] = {
      case tpe if validType(tpe.erasure) =>
        ProductOrderedBuf(c)(buildDispatcher, tpe, symbolFor(tpe))
    }
    pf
  }