in cats/src/main/scala/magnolify/cats/semiauto/MonoidDerivation.scala [72:91]
def combineAll[T, Typeclass[T] <: Monoid[T]](
caseClass: CaseClass[Typeclass, T]
): IterableOnce[T] => T = {
val combineImpl = SemigroupMethods.combine(caseClass)
val emptyImpl = MonoidMethods.empty(caseClass)
{
case it: Iterable[T] if it.nonEmpty =>
// input is re-iterable and non-empty, combineAll 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.combineAll(it.iterator.map(p.dereference))
i += 1
}
caseClass.rawConstruct(ArraySeq.unsafeWrapArray(result))
case xs => xs.iterator.foldLeft(emptyImpl())(combineImpl)
}
}