in cats/src/main/scala/magnolify/cats/semiauto/CommutativeGroupDerivation.scala [28:46]
def join[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = {
val emptyImpl = MonoidMethods.empty(caseClass)
val combineImpl = SemigroupMethods.combine(caseClass)
val combineNImpl = GroupMethods.combineN(caseClass)
val combineAllImpl = MonoidMethods.combineAll(caseClass)
val combineAllOptionImpl = SemigroupMethods.combineAllOption(caseClass)
val inverseImpl = GroupMethods.inverse(caseClass)
val removeImpl = GroupMethods.remove(caseClass)
new CommutativeGroup[T] {
override def empty: T = emptyImpl()
override def combine(x: T, y: T): T = combineImpl(x, y)
override def combineN(a: T, n: Int): T = combineNImpl(a, n)
override def combineAll(as: IterableOnce[T]): T = combineAllImpl(as)
override def combineAllOption(as: IterableOnce[T]): Option[T] = combineAllOptionImpl(as)
override def inverse(a: T): T = inverseImpl(a)
override def remove(a: T, b: T): T = removeImpl(a, b)
}
}