fthomas / refined

Refinement types for Scala
MIT License
1.69k stars 155 forks source link

add `BigDecimal` and `BigInt` cache in `RefineMacro` #1245

Closed xuwei-k closed 5 months ago

xuwei-k commented 5 months ago

for avoid eval

xuwei-k commented 5 months ago

Before

Welcome to Scala 2.13.12 (OpenJDK 64-Bit Server VM, Java 11.0.21).
Type in expressions for evaluation. Or try :help.
import eu.timepit.refined._
import eu.timepit.refined.api._
import eu.timepit.refined.api.Inference.$eq$eq$greater
import eu.timepit.refined.api.RefType.ops._
import eu.timepit.refined.auto._
import eu.timepit.refined.predicates.all._
import eu.timepit.refined.types.all._
import shapeless.{$colon$colon, HList, HNil}
import shapeless.nat._
import shapeless.tag.$at$at

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res0: Long = 633

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res1: Long = 337

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res2: Long = 280

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res3: Long = 266

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res4: Long = 260

After

Welcome to Scala 2.13.12 (OpenJDK 64-Bit Server VM, Java 11.0.21).
Type in expressions for evaluation. Or try :help.
import eu.timepit.refined._
import eu.timepit.refined.api._
import eu.timepit.refined.api.Inference.$eq$eq$greater
import eu.timepit.refined.api.RefType.ops._
import eu.timepit.refined.auto._
import eu.timepit.refined.predicates.all._
import eu.timepit.refined.types.all._
import shapeless.{$colon$colon, HList, HNil}
import shapeless.nat._
import shapeless.tag.$at$at

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res0: Long = 85

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res1: Long = 77

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res2: Long = 71

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res3: Long = 71

scala> shapeless.test.compileTime(""" val x: PosBigDecimal = BigDecimal(2) """).toMillis
val res4: Long = 69