Skip to content

Commit ff430e2

Browse files
authored
Merge pull request #1029 from japgolly/topic/reusabilityNum
More numeric Reusability
2 parents e7d9835 + 281a5ee commit ff430e2

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

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

Lines changed: 24 additions & 0 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] =
@@ -387,6 +404,13 @@ object Reusability extends ReusabilityMacros with ScalaVersionSpecificReusabilit
387404
Reusability.byRef || Reusability.map
388405
}
389406

407+
object DecimalImplicitsWithoutTolerance {
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_==
412+
}
413+
390414
object TemporalImplicitsWithoutTolerance {
391415

392416
implicit lazy val reusabilityJavaDuration: Reusability[Duration] =

doc/changelog/2.0.1.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
## 2.0.1
22

3+
### New stuff
4+
5+
* Added `Reusability` for:
6+
* `java.math.BigDecimal`
7+
* `java.math.BigInteger`
8+
* `scala.math.BigDecimal`
9+
* `scala.math.BigInt`
10+
11+
* You can now `import Reusability.DecimalImplicitsWithoutTolerance._` if you'd like implicit `Reusability` instances for decimal types that use exact comparison
12+
313
### Bug fixes
414

515
* Fix infinite loop in functional components with reuse + `Reusability.never` ([#1027](https://github.com/japgolly/scalajs-react/issues/1027))

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)