Created
November 2, 2021 21:25
-
-
Save dragisak/3b5aa0a4dbf9d022abced357759bda84 to your computer and use it in GitHub Desktop.
Type safe "optional" field
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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