Skip to content

Instantly share code, notes, and snippets.

@rirakkumya
Last active December 16, 2015 05:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rirakkumya/5388542 to your computer and use it in GitHub Desktop.
Save rirakkumya/5388542 to your computer and use it in GitHub Desktop.
import TrainOps._
import TrainService._
object TrainService {
type ANSWER = Either[String, List[TrainStatus]]
trait Train[A] {
def status(x: A): ANSWER
}
case class TrainStatus(name: String, Status: String)
case class 運行状況(area: String) {
val dummyData = Map(
"awjsm" -> Left("電車は通っていません"),
"tk" -> Right(List(TrainStatus("中央線", "正常"), TrainStatus("山手線", "正常"))),
"andro" -> Left("電車は廃線になりました")
)
def status = dummyData(area)
}
}
case class Awjsm
case class Tokyo
case class Andromeda
object TrainOps {
implicit val aw = new Train[Awjsm] {
def status(x: Awjsm): ANSWER = 運行状況("awjsm").status
}
implicit val tk = new Train[Tokyo] {
def status(x: Tokyo): ANSWER = 運行状況("tk").status
}
implicit val andr = new Train[Andromeda] {
def status(x: Andromeda): ANSWER = 運行状況("andro").status
}
}
object Dsl {
implicit class toTrain[A: Train](area: A) {
def の電車は: ANSWER = implicitly[Train[A]].status(area)
}
implicit class show(answer: ANSWER) {
def 動いていますか: Unit = println(answer.right.map(_.mkString("\n")).merge)
}
def 淡路島 = Awjsm()
def 東京 = Tokyo()
def アンドロメダ = Andromeda()
}
object AppRun extends App {
import Dsl._
//運行状況取得失敗
(淡路島 の電車は)動いていますか //-> 電車は通っていません
//運行状況取得成功
(東京 の電車は)動いていますか //-> TrainStatus("中央線", "正常") TrainStatus("山手線", "正常")
//運行状況取得失敗
(アンドロメダ の電車は)動いていますか //-> 電車は廃線になりました
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment