Advertisement
Guest User

Untitled

a guest
Feb 20th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. import shapeless.labelled.FieldType
  2. import shapeless.{::, DepFn2, HList, HNil, LabelledGeneric, Witness}
  3.  
  4. import scala.collection.mutable
  5.  
  6. // mock of sdk item
  7. class Item(val map: mutable.Map[String, Any] = mutable.Map[String, Any]()) {
  8. def getString(attrName: String): String = map.get(attrName).get.asInstanceOf[String]
  9. def getInt(attrName: String): Int = map.get(attrName).get.asInstanceOf[Int]
  10. def getBoolean(attrName: String): Boolean = map.get(attrName).get.asInstanceOf[Boolean]
  11. // def getMap(attrName: String): Map[String, String] = Map("attrName" -> "attrValue")
  12.  
  13. def setString(attrName: String, value: String): Unit = map.put(attrName, value)
  14. def setInt(attrName: String, value: Int): Unit = map.put(attrName, value)
  15. def setBoolean(attrName: String, value: Boolean): Unit = map.put(attrName, value)
  16.  
  17. override def toString() = map.toString()
  18. }
  19.  
  20. trait ItemEncoder[A] extends DepFn2[String, A] {
  21. type Out = Item
  22. }
  23.  
  24. object ItemEncoder {
  25. def apply[A](implicit encoder: ItemEncoder[A]): ItemEncoder[A] = encoder
  26.  
  27. def instance[A](f: (String, A) => Item): ItemEncoder[A] =
  28. new ItemEncoder[A] {
  29. override def apply(attrName: String, value: A): Out = f(attrName, value)
  30. }
  31. }
  32.  
  33. implicit val stringEncoder: ItemEncoder[String] =
  34. ItemEncoder.instance { (attrName, value) =>
  35. val item = new Item()
  36. item.setString(attrName, value)
  37. item
  38. }
  39.  
  40. implicit val intEncoder: ItemEncoder[Int] =
  41. ItemEncoder.instance { (attrName, value) =>
  42. val item = new Item()
  43. item.setInt(attrName, value)
  44. item
  45. }
  46.  
  47. implicit val booleanEncoder: ItemEncoder[Boolean] =
  48. ItemEncoder.instance { (attrName, value) =>
  49. val item = new Item()
  50. item.setBoolean(attrName, value)
  51. item
  52. }
  53.  
  54. implicit val hnilEncoder: ItemEncoder[HNil] =
  55. ItemEncoder.instance((attrName, value) => new Item())
  56.  
  57. def merge(i1: Item, i2: Item): Item = new Item(i1.map ++ i2.map)
  58.  
  59. implicit def hlistEncoder[K <: Symbol, L, H, T <: HList](
  60. implicit
  61. witness: Witness.Aux[K],
  62. hEncoder: ItemEncoder[H],
  63. tEncoder: ItemEncoder[T]
  64. ): ItemEncoder[FieldType[K, H] :: T] = {
  65. ItemEncoder.instance { (_, value) =>
  66. val attrName = witness.value.name
  67. merge(hEncoder.apply(attrName, value.head), tEncoder.apply(attrName, value.tail))
  68. }
  69. }
  70.  
  71. implicit def genericEncoder[A, R](
  72. implicit
  73. generic: LabelledGeneric.Aux[A, R],
  74. itemEncoder: ItemEncoder[R]
  75. ): ItemEncoder[A] =
  76. ItemEncoder.instance { (attrName, value) =>
  77. itemEncoder.apply(attrName, generic.to(value))
  78. }
  79.  
  80. case class Person(name: String, age: Int, married: Boolean, manager: Boolean)
  81. case class IceCream(name: String, subName: String, price: Int)
  82.  
  83. val genericPerson = LabelledGeneric[Person].to(Person("bob", 37, true, true))
  84.  
  85. def encode[A](toEncode: A)(implicit itemEncoder: ItemEncoder[A]) =
  86. itemEncoder("", toEncode)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement