Skip to content

Instantly share code, notes, and snippets.

@dragisak
Created November 2, 2021 21:25
Show Gist options
  • Save dragisak/3b5aa0a4dbf9d022abced357759bda84 to your computer and use it in GitHub Desktop.
Save dragisak/3b5aa0a4dbf9d022abced357759bda84 to your computer and use it in GitHub Desktop.
Type safe "optional" field
sealed trait FT {
type VT
}
object FT {
sealed trait Concrete extends FT {
override type VT = Nothing
}
case object Concrete extends Concrete
sealed trait Derived extends FT {
override type VT = Int
}
case object Derived extends Derived
}
trait Field[T <: FT] {
def name: String
def version: T#VT
}
object Field {
def derived(
fieldName: String,
fieldVersion: Int
): Field[FT.Derived] = new Field[FT.Derived] {
override val name: String = fieldName
override val version: Int = fieldVersion
}
def concrete(fieldName: String): Field[FT.Concrete] = new Field[FT.Concrete] {
override val name: String = fieldName
override def version: Nothing = ???
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment