trait Semigroup[A] { def sconcat(a1: A, a2: A): A }
object Semigroup { implicit class SemigroupOps[A: Semigroup](a1: A) { def <>(a2: A): A = implicitly[Semigroup[A]].sconcat(a1, a2) } }