All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pimpathon.numeric.scala Maven / Gradle / Ivy

The newest version!
package pimpathon


object numeric {
  implicit def numericPimps[A](na: Numeric[A]): NumericPimps[A] = new NumericPimps[A](na)

  class NumericPimps[A](na: Numeric[A]) {
    def xmap[B](aToB: A ⇒ B, bToA: B ⇒ A): Numeric[B] = na match {
      case xna: XMappedNumeric[_, _] ⇒ xna.xmap(aToB, bToA)
      case other                     ⇒ new XMappedNumeric[A, B](other, aToB, bToA)
    }
  }

  class XMappedNumeric[A, B](na: Numeric[A], aToB: A ⇒ B, bToA: B ⇒ A) extends Numeric[B] {
    def xmap[C](bToC: B ⇒ C, cToB: C ⇒ B): Numeric[C] =
      new XMappedNumeric[A, C](na, aToB andThen bToC, cToB andThen bToA)

    def compare(l: B, r: B): Int = na.compare(bToA(l), bToA(r))

    def fromInt(i: Int): B = aToB(na.fromInt(i))

    def toDouble(b: B): Double = na.toDouble(bToA(b))
    def toFloat(b: B): Float   = na.toFloat(bToA(b))
    def toInt(b: B): Int       = na.toInt(bToA(b))
    def toLong(b: B): Long     = na.toLong(bToA(b))

    def negate(b: B): B = aToB(na.negate(bToA(b)))

    def minus(l: B, r: B): B = aToB(na.minus(bToA(l), bToA(r)))
    def plus(l: B, r: B): B  = aToB(na.plus(bToA(l),  bToA(r)))
    def times(l: B, r: B): B = aToB(na.times(bToA(l), bToA(r)))
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy