Last active
November 7, 2017 01:16
-
-
Save abdheshkumar/62d483e9a9c9e18d7c0cedbff47675f8 to your computer and use it in GitHub Desktop.
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 A | |
case class B[Req, Res](r: Req, rs: Res) extends A | |
case class C[Req](r: Req, errorCode: Int, errorMessage: String) extends A | |
trait TypeA[Req, Res] { | |
def success(t: Req, r: Res): Unit | |
def error(t: Req): Unit | |
} | |
implicit val forString = new TypeA[String, String] { | |
override def success(t: String, r: String): Unit = ??? | |
override def error(t: String): Unit = ??? | |
} | |
def success[Req, Res](r: Req, rs: Res)(implicit in: TypeA[Req, Res]) = in.success(r, rs) | |
def fail[Req, Res](r: Req)(implicit in: TypeA[Req, Res]) = in.error(r) | |
def run(a: A) = a match { | |
case B(r, rs) => success(r, rs) | |
case C(r, e, em) => fail(r) | |
} | |
/********************************************An Example for view sub-class typeclasses*************************************************/ | |
// Start writing your ScalaFiddle code here | |
sealed trait Request | |
case class AuthRequest(a: String) extends Request | |
case class PartyRequest(a: Int) extends Request | |
sealed trait Token | |
case class TokenSuccess(r: Request) extends Token | |
case class TokenFailure(r: Request, errorCode: Int, errorMessage: String) extends Token | |
trait Log[Req] { | |
def success(t: Req): Unit | |
def error(t: Req): Unit | |
} | |
implicit val forString: Log[AuthRequest] = new Log[AuthRequest] { | |
override def success(t: AuthRequest): Unit = println(t) | |
override def error(t: AuthRequest): Unit = println(t) | |
} | |
implicit val partyReq: Log[PartyRequest] = new Log[PartyRequest] { | |
override def success(t: PartyRequest): Unit = println(t) | |
override def error(t: PartyRequest): Unit = println(t) | |
} | |
def success[Req](r: Req)(implicit evidence: Log[Req]): Unit = evidence.success(r) | |
def fail[Req](r: Req)(implicit evidence: Log[Req]): Unit = evidence.error(r) | |
def run(a: Token) = a match { | |
case TokenSuccess(r) => success(r) | |
case TokenFailure(r, e, em) => fail(r) | |
} | |
run(TokenSuccess(AuthRequest("This is Auth Request"))) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment