Skip to content

Combining boolean predicates #917

@matwojcik

Description

@matwojcik

I have some problem when playing with refines using boolean predicates.

  object test {
    import eu.timepit.refined.auto._
    type LongOrDouble = NonEmpty And (ValidLong Or ValidDouble)

    val SomeLong: String Refined (NonEmpty And ValidLong) = "11"
    val SomeLongOrDouble: String Refined LongOrDouble = SomeLong


  }

which fails with

[error] type mismatch;
[error]  found   : eu.timepit.refined.api.Refined[String,eu.timepit.refined.boolean.And[eu.timepit.refined.collection.NonEmpty,eu.timepit.refined.string.ValidLong]]
[error]     (which expands to)  eu.timepit.refined.api.Refined[String,eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.collection.Empty],eu.timepit.refined.string.ValidLong]]
[error]  required: eu.timepit.refined.api.Refined[String,test.LongOrDouble]
[error]     (which expands to)  eu.timepit.refined.api.Refined[String,eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.collection.Empty],eu.timepit.refined.boolean.Or[eu.timepit.refined.string.ValidLong,eu.timepit.refined.string.ValidDouble]]]
[error]   val SomeLongOrDouble: String Refined LongOrDouble = SomeLong
[error]                                                       ^

object test2 {
  import eu.timepit.refined.auto._
  type LongOrDouble = (NonEmpty And ValidLong) Or (NonEmpty And ValidDouble)

  val SomeLongOrDouble: String Refined LongOrDouble = "11"

  val SomeNonEmpty: String Refined NonEmpty = SomeLongOrDouble
}

which fails with

[error] type mismatch;
[error]  found   : eu.timepit.refined.api.Refined[String,test2.LongOrDouble]
[error]     (which expands to)  eu.timepit.refined.api.Refined[String,eu.timepit.refined.boolean.Or[eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.collection.Empty],eu.timepit.refined.string.ValidLong],eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.collection.Empty],eu.timepit.refined.string.ValidDouble]]]
[error]  required: eu.timepit.refined.api.Refined[String,eu.timepit.refined.collection.NonEmpty]
[error]     (which expands to)  eu.timepit.refined.api.Refined[String,eu.timepit.refined.boolean.Not[eu.timepit.refined.collection.Empty]]
[error]   val SomeNonEmpty: String Refined NonEmpty = SomeLongOrDouble
[error]                                  

I'm not sure if this is limitation of scala as a language or is there some possibility for that to work?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions