From bd424f65ffd25c247dab98a664bee9c449b3c625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Fromentin?= <42907886+Iltotore@users.noreply.github.com> Date: Sun, 9 Jul 2023 14:33:57 +0200 Subject: [PATCH] feat: Support Multiple/Divide constraints for BigInt/BigDecimal (#156) --- .../iltotore/iron/constraint/numeric.scala | 18 ++++++++++++++++-- .../iltotore/iron/testing/NumericSuite.scala | 10 ++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/main/src/io/github/iltotore/iron/constraint/numeric.scala b/main/src/io/github/iltotore/iron/constraint/numeric.scala index 3d33451c..19b43d33 100644 --- a/main/src/io/github/iltotore/iron/constraint/numeric.scala +++ b/main/src/io/github/iltotore/iron/constraint/numeric.scala @@ -135,7 +135,7 @@ object numeric: inline given [V <: NumConstant]: GreaterConstraint[Double, V] with override inline def test(value: Double): Boolean = value > doubleValue[V] - inline given bigDecimalDouble[V <: Float | Double]: GreaterConstraint[BigDecimal, V] with + inline given bigDecimalDouble[V <: NumConstant]: GreaterConstraint[BigDecimal, V] with override inline def test(value: BigDecimal): Boolean = value > BigDecimal(doubleValue[V]) inline given bigDecimalLong[V <: Int | Long]: GreaterConstraint[BigDecimal, V] with @@ -170,7 +170,7 @@ object numeric: inline given [V <: NumConstant]: LessConstraint[Double, V] with override inline def test(value: Double): Boolean = value < doubleValue[V] - inline given bigDecimalDouble[V <: Float | Double]: LessConstraint[BigDecimal, V] with + inline given bigDecimalDouble[V <: NumConstant]: LessConstraint[BigDecimal, V] with override inline def test(value: BigDecimal): Boolean = value < BigDecimal(doubleValue[V]) inline given bigDecimalLong[V <: Int | Long]: LessConstraint[BigDecimal, V] with @@ -205,6 +205,14 @@ object numeric: inline given [V <: NumConstant]: MultipleConstraint[Double, V] with override inline def test(value: Double): Boolean = value % doubleValue[V] == 0 + inline given [V <: Int | Long]: MultipleConstraint[BigInt, V] with + + override inline def test(value: BigInt): Boolean = value % BigInt(longValue[V]) == 0 + + inline given[V <: NumConstant]: MultipleConstraint[BigDecimal, V] with + + override inline def test(value: BigDecimal): Boolean = value % BigDecimal(doubleValue[V]) == 0 + given [A, V1 <: A, V2 <: A](using V1 % V2 =:= Zero[A]): (Multiple[V1] ==> Multiple[V2]) = Implication() object Divide: @@ -223,6 +231,12 @@ object numeric: inline given [V <: NumConstant]: DivideConstraint[Double, V] with override inline def test(value: Double): Boolean = doubleValue[V] % value == 0 + inline given [V <: Int | Long]: DivideConstraint[BigInt, V] with + override inline def test(value: BigInt): Boolean = BigInt(longValue[V]) % value == 0 + + inline given[V <: NumConstant]: DivideConstraint[BigDecimal, V] with + override inline def test(value: BigDecimal): Boolean = BigDecimal(doubleValue[V]) % value == 0 + object NaN: private trait NaNConstraint[A] extends Constraint[A, NaN]: override inline def message: String = "Should be an unrepresentable number" diff --git a/main/test/src/io/github/iltotore/iron/testing/NumericSuite.scala b/main/test/src/io/github/iltotore/iron/testing/NumericSuite.scala index 2a4fb01e..086c60d7 100644 --- a/main/test/src/io/github/iltotore/iron/testing/NumericSuite.scala +++ b/main/test/src/io/github/iltotore/iron/testing/NumericSuite.scala @@ -75,12 +75,22 @@ object NumericSuite extends TestSuite: test("multiple") { test - 1.assertNotRefine[Multiple[2]] test - 2.assertRefine[Multiple[2]] + test - BigInt(1).assertNotRefine[Multiple[2]] + test - BigInt(2).assertRefine[Multiple[2]] + test - BigDecimal(1).assertNotRefine[Multiple[2]] + test - BigDecimal(2).assertRefine[Multiple[2]] } test("divide") { test - 1.assertRefine[Divide[2]] test - 2.assertRefine[Divide[2]] test - 3.assertNotRefine[Divide[2]] + test - BigInt(1).assertRefine[Divide[2]] + test - BigInt(2).assertRefine[Divide[2]] + test - BigInt(3).assertNotRefine[Divide[2]] + test - BigDecimal(1).assertRefine[Divide[2]] + test - BigDecimal(2).assertRefine[Divide[2]] + test - BigDecimal(3).assertNotRefine[Divide[2]] } test("nan") {