Skip to content

Commit 281a5ee

Browse files
committed
Add Reusability for {java,scala}.math.Big*
1 parent 0822f66 commit 281a5ee

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

coreGeneric/src/main/scala/japgolly/scalajs/react/Reusability.scala

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import japgolly.scalajs.react.util.Effect.Sync
66
import japgolly.scalajs.react.util.{DefaultEffects, OptionLike}
77
import java.time._
88
import java.util.{Date, UUID}
9+
import java.{math => jm}
910
import org.scalajs.dom.console
1011
import scala.annotation.tailrec
1112
import scala.collection.immutable.ArraySeq
1213
import scala.concurrent.{duration => scd}
1314
import scala.reflect.ClassTag
1415
import scala.scalajs.js.timers.{SetIntervalHandle, SetTimeoutHandle}
1516
import scala.scalajs.js.{Date => JsDate}
17+
import scala.{math => sm}
1618

1719
/**
1820
* Tests whether one instance can be used in place of another.
@@ -141,6 +143,15 @@ object Reusability extends ReusabilityMacros with ScalaVersionSpecificReusabilit
141143
def float(tolerance: Float): Reusability[Float] =
142144
apply((x, y) => (x - y).abs <= tolerance)
143145

146+
def javaBigDecimal(tolerance: Double): Reusability[jm.BigDecimal] =
147+
javaBigDecimal(new jm.BigDecimal(tolerance))
148+
149+
def javaBigDecimal(tolerance: jm.BigDecimal): Reusability[jm.BigDecimal] =
150+
apply((x, y) => x.subtract(y).abs.compareTo(tolerance) <= 0)
151+
152+
def scalaBigDecimal(tolerance: sm.BigDecimal): Reusability[sm.BigDecimal] =
153+
apply((x, y) => (x - y).abs.compareTo(tolerance) <= 0)
154+
144155
def byJavaDuration[A](dur: (A, A) => Duration, tolerance: Duration): Reusability[A] =
145156
apply { (x, y) =>
146157
val d = dur(x, y).abs
@@ -284,6 +295,12 @@ object Reusability extends ReusabilityMacros with ScalaVersionSpecificReusabilit
284295
implicit lazy val setTimeoutHandle: Reusability[SetTimeoutHandle] =
285296
by_==
286297

298+
@inline implicit def bigInteger: Reusability[jm.BigInteger] =
299+
byRefOr_==
300+
301+
@inline implicit def bigInt: Reusability[sm.BigInt] =
302+
byRefOr_==
303+
287304
// java.time._
288305

289306
implicit def clock: Reusability[Clock] =
@@ -388,8 +405,10 @@ object Reusability extends ReusabilityMacros with ScalaVersionSpecificReusabilit
388405
}
389406

390407
object DecimalImplicitsWithoutTolerance {
391-
@inline implicit def reusabilityDouble: Reusability[Double] = by_==
392-
@inline implicit def reusabilityFloat : Reusability[Float ] = by_==
408+
@inline implicit def reusabilityJavaBigDecimal : Reusability[jm.BigDecimal] = byRefOr_==
409+
@inline implicit def reusabilityScalaBigDecimal: Reusability[sm.BigDecimal] = byRefOr_==
410+
@inline implicit def reusabilityDouble : Reusability[Double ] = by_==
411+
@inline implicit def reusabilityFloat : Reusability[Float ] = by_==
393412
}
394413

395414
object TemporalImplicitsWithoutTolerance {

doc/changelog/2.0.1.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
### New stuff
44

5+
* Added `Reusability` for:
6+
* `java.math.BigDecimal`
7+
* `java.math.BigInteger`
8+
* `scala.math.BigDecimal`
9+
* `scala.math.BigInt`
10+
511
* You can now `import Reusability.DecimalImplicitsWithoutTolerance._` if you'd like implicit `Reusability` instances for decimal types that use exact comparison
612

713
### Bug fixes

tests/src/test/scala/japgolly/scalajs/react/core/ReusabilityTest.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,5 +449,33 @@ object ReusabilityTest extends TestSuite {
449449
assert(9.seconds ~/~ 7.seconds)
450450
assert(7.seconds ~/~ 9.seconds)
451451
}
452+
453+
"javaBigDecimal" - {
454+
import java.math.BigDecimal
455+
implicit val r = Reusability.javaBigDecimal(0.5)
456+
assert(new BigDecimal(10.6) ~=~ new BigDecimal(10.6))
457+
assert(new BigDecimal(10.6) ~=~ new BigDecimal(10.1))
458+
assert(new BigDecimal(10.6) ~/~ new BigDecimal(10.0))
459+
}
460+
461+
"scalaBigDecimal" - {
462+
import scala.math.BigDecimal
463+
implicit val r: Reusability[BigDecimal] = Reusability.scalaBigDecimal(0.5)
464+
assert(BigDecimal(10.6) ~=~ BigDecimal(10.6))
465+
assert(BigDecimal(10.6) ~=~ BigDecimal(10.1))
466+
assert(BigDecimal(10.6) ~/~ BigDecimal(10.0))
467+
}
468+
469+
"bigInteger" - {
470+
import java.math.BigInteger
471+
assert(new BigInteger("10") ~=~ new BigInteger("10"))
472+
assert(new BigInteger("10") ~/~ new BigInteger("11"))
473+
}
474+
475+
"bigInt" - {
476+
import scala.math.BigInt
477+
assert(BigInt("10") ~=~ BigInt("10"))
478+
assert(BigInt("10") ~/~ BigInt("11"))
479+
}
452480
}
453481
}

0 commit comments

Comments
 (0)