Yann Moisan
Yann Moisan

Reputation: 8281

type parameter / abstract type on a concrete use case in Scala

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"))

Upvotes: 0

Views: 51

Answers (1)

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

Related Questions