Skip to content

Instantly share code, notes, and snippets.

@bryce-anderson
Last active August 20, 2016 22:46
Show Gist options
  • Save bryce-anderson/177815a211fccbac0265a5cdb067a5be to your computer and use it in GitHub Desktop.
Save bryce-anderson/177815a211fccbac0265a5cdb067a5be to your computer and use it in GitHub Desktop.
sealed trait HeaderKey {
type HeaderT <: Parsed[_]
def go(t: HeaderT): Unit = ()
def name: String
}
/*
trait Header {
def name: String
}
*/
trait Parsed[T <: Parsed[T]] { self: T =>
final type MyHeaderKey = HeaderKey { type HeaderT = T }
def key: MyHeaderKey
def name: String= key.name
def parsed: this.type = this
}
object ThisKey extends HeaderKey {
type HeaderT = ThisHeader
def name = "ThisHeader"
}
case class ThisHeader(value: String) extends Parsed[ThisHeader] {
def key = ThisKey
}
object OtherKey extends HeaderKey {
type HeaderT = OtherHeader
def name = "OtherHeader"
}
case class OtherHeader(value: String) extends Parsed[ThisHeader] {
// def key = ThisKey // Fails to compile!!!
def key = OtherKey
}
object Main {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment