Skip to content

Instantly share code, notes, and snippets.

@gigiigig
Created November 5, 2015 07:33
Show Gist options
  • Save gigiigig/64dbde34e5c5d499bd5c to your computer and use it in GitHub Desktop.
Save gigiigig/64dbde34e5c5d499bd5c to your computer and use it in GitHub Desktop.
Phantom Types
object console extends App {
trait Op
trait Open extends Op
trait Close extends Op
trait Door[O <: Op]
object Door {
def apply[S <: Op] = new Door[S] {}
def open[S <: Close](d: Door[S]) = Door[Open]
def close[S <: Open](d: Door[S]) = Door[Close]
}
val closeDoor = Door[Close]
val openDoor = Door.open(closeDoor)
val closeAgainDoor = Door.close(openDoor)
// val closeCloseDoor = Door.close(closeDoor)
// val openOpenDoor = Door.open(openDoor)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment