Last active
December 16, 2015 05:59
-
-
Save rirakkumya/5388542 to your computer and use it in GitHub Desktop.
This file contains 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
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