package com.github.diegopacheco.scalaplayground.typeclasses

object NumbersMainApp extends App {

  trait NumberLike[T] {
    def plus(x: T, y: T): T
    def divide(x: T, y: T): T
    def minus(x: T, y: T): T
    def multiply(x: T, y: T): T
  }

  object NumberLike {
    implicit object NumberLikeDouble extends NumberLike[Double] {
      def plus(x: Double, y: Double): Double = x + y
      def divide(x: Double, y: Double): Double = x / y
      def minus(x: Double, y: Double): Double = x - y
      def multiply(x: Double, y: Double): Double = x * y
    }
    implicit object NumberLikeInt extends NumberLike[Int] {
      def plus(x: Int, y: Int): Int = x + y
      def divide(x: Int, y: Int): Int = x / y
      def minus(x: Int, y: Int): Int = x - y
      def multiply(x: Int, y: Int): Int = x * y
    }
    
    implicit def int2NumberLikeInt(x: Int) = NumberLikeInt
    implicit def double2NumberLikeDouble(y: Double) = NumberLikeDouble
    
  }
  
  import NumberLike._
  
  val x = 10
  println(s"10 + 10 = ${x.plus(10, 10)}")
  println(s"10 - 10 = ${x.minus(10, 10)}")
  println(s"10 * 10 = ${x.multiply(10, 10)}")
  println(s"10 / 10 = ${x.divide(10, 10)}")
  
  val y:Double = 20.5
  println(s"20.5 + 20.5 = ${y.plus(20.5, 20.5)}")
  println(s"20.5 - 20.5 = ${y.minus(20.5, 20.5)}")
  println(s"20.5 * 20.5 = ${y.multiply(20.5, 20.5)}")
  println(s"20.5 / 20.5 = ${y.divide(20.5, 20.5)}")

}