in cats/src/main/scala/magnolify/cats/semiauto/SemigroupDerivation.scala [69:88]
def combineAllOption[T, Typeclass[T] <: Semigroup[T]](
caseClass: CaseClass[Typeclass, T]
): IterableOnce[T] => Option[T] = {
val combineImpl = combine(caseClass)
{
case it: Iterable[T] if it.nonEmpty =>
// input is re-iterable and non-empty, combineAllOption on each field
val result = Array.fill[Any](caseClass.parameters.length)(null)
var i = 0
while (i < caseClass.parameters.length) {
val p = caseClass.parameters(i)
result(i) = p.typeclass.combineAllOption(it.iterator.map(p.dereference)).get
i += 1
}
Some(caseClass.rawConstruct(ArraySeq.unsafeWrapArray(result)))
case xs =>
xs.iterator.reduceOption(combineImpl)
}
}