refined
refined copied to clipboard
Inference rules are not working for Interval types
While getting familiar with refined
(version 0.9.4
) I was excited by ability to easily convert between refined types:
scala> val a: Int Refined Greater[W.`5`.T] = 10
a: Int Refined Greater[Int(5)] = 10
scala> val b: Int Refined Greater[W.`4`.T] = a
b: Int Refined Greater[Int(4)] = 10
but once I tried slightly more complex type, I faced compiler error:
scala> val i: Int Refined Interval.Closed[W.`5`.T, W.`15`.T] = 10
i: eu.timepit.refined.api.Refined[Int,eu.timepit.refined.numeric.Interval.Closed[Int(5),Int(15)]] = 10
// I expected this to work as [5, 15] is inside `[0, 20], but ...
scala> val j: Int Refined Interval.Closed[W.`0`.T, W.`20`.T] = i
<console>:22: error: type mismatch;
found : eu.timepit.refined.api.Refined[Int,eu.timepit.refined.numeric.Interval.Closed[Int(5),Int(15)]]
(which expands to) eu.timepit.refined.api.Refined[Int,eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Less[Int(5)]],eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Greater[Int(15)]]]]
required: eu.timepit.refined.api.Refined[Int,eu.timepit.refined.numeric.Interval.Closed[Int(0),Int(20)]]
(which expands to) eu.timepit.refined.api.Refined[Int,eu.timepit.refined.boolean.And[eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Less[Int(0)]],eu.timepit.refined.boolean.Not[eu.timepit.refined.numeric.Greater[Int(20)]]]]
val j: Int Refined Interval.Closed[W.`0`.T, W.`20`.T] = i