Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. trait Lang {
  2. def name: String
  3. }
  4.  
  5. object Lang {
  6. trait En extends Lang { def name = "en"}
  7. implicit object En extends En
  8. trait Fr extends Lang { def name = "fr"}
  9. implicit object Fr extends Fr
  10. trait De extends Lang { def name = "de"}
  11. implicit object De extends De
  12. }
  13.  
  14. import Lang._
  15. import shapeless._
  16. import shapeless.LUBConstraint.<<:
  17. import shapeless.ops.hlist.{Selector, ToTraversable}
  18. import shapeless.ops.hlist.Prepend._
  19. import shapeless.ops.hlist.Prepend
  20. import shapeless.ops.hlist.ToTraversable._
  21.  
  22. import scala.annotation.implicitNotFound
  23.  
  24. object I18n {
  25. class `I18n.apply`[L <: HList : <<:[Lang]#λ](){
  26. def apply[T](value: T)(implicit l: L, toTraversableAux : ToTraversable.Aux[L, List, Lang]) =
  27. new I18n[T, L](l.toList.map(_ -> value).toMap, l)
  28. }
  29.  
  30. def apply[L <: HList : <<:[Lang]#λ] = new `I18n.apply`[L]()
  31. }
  32.  
  33. class I18n[+T, L <: HList : <<:[Lang]#λ] private (private val inner: Map[Lang, T], private val l: L) {
  34.  
  35. def apply[U <: Lang](implicit selector : Selector[L, U], u: U) : T = inner(u)
  36.  
  37. def & [TT >: T, LL <: HList : <<:[Lang]#λ, LLL<: HList](that: I18n[TT, LL])(implicit p: Prepend.Aux[LL, L, LLL]): I18n[TT, LLL]
  38. = {
  39. implicit val _: <<:[Lang]#λ[LLL] = new LUBConstraint[LLL, Lang] {}
  40. new I18n[TT, LLL](inner ++ that.inner, p.apply(that.l, this.l))
  41. }
  42. }
  43.  
  44. object Ex extends App {
  45. implicit val baseCase = HNil
  46. implicit def recurse[Head, Tail <: HList](implicit h: Head, t: Tail) = h :: t
  47.  
  48. val i = I18n[En :: Fr :: HNil].apply("hello")
  49.  
  50. val j = i & I18n[De :: HNil].apply("asdfasdf")
  51.  
  52. println(i[En])
  53. // i[De] // DOES NOT COMPILE :-)
  54. println(j[En])
  55. println(j[De])
  56.  
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement