Skip to content

Instantly share code, notes, and snippets.

@rumblesan
Last active December 19, 2015 01:19
Show Gist options
  • Select an option

  • Save rumblesan/5875534 to your computer and use it in GitHub Desktop.

Select an option

Save rumblesan/5875534 to your computer and use it in GitHub Desktop.
So typeclasses in scala are pretty cool...
case class UserInfo(name: String, email: String)
case class PaidUser(id: Long, name: String, email: String, payments: Double)
object PaidUser {
class PaidUserExtended(user: PaidUser) {
def userInfo: UserInfo = UserInfo(user.name, user.email)
}
implicit def PaidUser2Extended(user: PaidUser) = new PaidUserExtended(user)
}
case class BasicUser(id: Long, name: String, email: String)
object BasicUser {
class BasicUserExtended(user: BasicUser) {
def userInfo: UserInfo = UserInfo(user.name, user.email)
}
implicit def BasicUser2Extended(user: BasicUser) = new BasicUserExtended(user)
}
val basic = BasicUser(1, "foo bar", "foo@bar.com")
val paid = PaidUser(1, "baz bim", "baz@bim.com", 55.4)
println(basic.userInfo)
// UserInfo(foo bar,foo@bar.com)
println(paid.userInfo)
// UserInfo(baz bim,baz@bim.com)
case class BasicUser(id: Long, name: String, email: String)
case class PaidUser(id: Long, name: String, email: String, payments: Double)
case class UserInfo(name: String, email: String)
object UserInfoMethods {
trait UserInfoLike[T] {
def getUserInfo(user: T): UserInfo
}
object UserInfoLike {
// The implicits here can be vals or objects, depending on what you prefer
implicit val UserInfoLikeBasic = new UserInfoLike[BasicUser] {
def getUserInfo(user: BasicUser): UserInfo = UserInfo(user.name, user.email)
}
implicit object UserInfoLikePaid extends UserInfoLike[PaidUser] {
def getUserInfo(user: PaidUser): UserInfo = UserInfo(user.name, user.email)
}
}
def userInfo[T](user: T)(implicit tc: UserInfoLike[T]): UserInfo = tc.getUserInfo(user)
}
val basic = BasicUser(1, "foo bar", "foo@bar.com")
val paid = PaidUser(1, "baz bim", "baz@bim.com", 55.4)
println(UserInfoMethods.userInfo(basic))
// UserInfo(foo bar,foo@bar.com)
println(UserInfoMethods.userInfo(paid))
// UserInfo(baz bim,baz@bim.com)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment