let's put this in object Semigroup? I don't want to complicate the base trait (which we are trying to share widely).  I think the Semigroup author should only care about optimizing plus and sumOption. Your code takes it from there.