trait Eq[A] {
def eqv(x: A, y: A): Boolean
}
object EqInstances {
implicit val intEq: Eq[Int] = new Eq[Int] {
override def eqv(x: Int, y: Int): Boolean = x == y
}
implicit val stringEq: Eq[String] = new Eq[String] {
override def eqv(x: String, y: String): Boolean = x == y
}
}
object EqSyntax {
implicit class EqOps[A](x: A) {
def ===(y: A)(implicit eqInstance: Eq[A]): Boolean = eqInstance.eqv(x, y)
}
}
object Main extends App {
import EqInstances._
import EqSyntax._
val intResult: Boolean = 42 === 42
val stringResult: Boolean = "hello" === "world"
println(s"Int equality result: $intResult")
println(s"String equality result: $stringResult")
}