Reputation: 8281
I have a parameterized ADT :
sealed trait Location[O]
sealed abstract class SingleRegion(val bucket: String) extends Location[String]
sealed abstract class MultiRegion(val buckets: Seq[String]) extends Location[Seq[String]]
sealed abstract class Synchronized(val bucket: String) extends Location[Seq[String]]
And I define a class Log that contains a location
final case class Log[O, L <: Location[O]](location: L) {
def find(
bucket: String
)(implicit ev: L =:= MultiRegion): Option[Log[String, _ <: SingleRegion]] =
location.buckets
.find(_ == bucket)
.map(bucket => Log(new SingleRegion(bucket) {}))
}
val log: Log[Seq[String], MultiRegion] = Log(new MultiRegion(List("r1", "r2")) {})
println(log.find("r1"))
log
is [Nothing, MultiRegion]
?Log[String, _ <: SingleRegion]
?Upvotes: 0
Views: 51
Reputation: 22895
This seems to work for me.
Let me know if it doesn't for you.
final case class Log[O, L](location: L)
(implicit ev: L <:< Location[O]) {
def find(bucket: String)
(implicit ev: L =:= MultiRegion): Option[Log[String, SingleRegion]] =
location
.buckets
.find(_ == bucket)
.map(bucket => Log(new SingleRegion(bucket) {}))
}
Upvotes: 1