Semigroup

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)
  }
}