Advertisement
Guest User

Untitled

a guest
Apr 24th, 2014
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. trait HasIdAndTimestamp {
  2. val id: Int
  3. val timestamp: Long
  4. }
  5. case class Client(id: Int, timestamp: Long, name: String) extends HasIdAndTimestamp
  6. case class Order(id: Int, timestamp: Long, items: List[Int], clientId: Int) extends HasIdAndTimestamp
  7. ...
  8.  
  9. case class MetaData(id: Int, timestamp: Long)
  10. trait HasMetaData {
  11. val metadata: MetaData
  12. }
  13. case class Client(metadata: MetaData, name: String) extends HasMetaData
  14. case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData
  15. ...
  16.  
  17. case class MetaData(id: Int, timestamp: Long)
  18. case class Client(name: String) extends MetaData
  19. case class Order(items: List[Int], clientId: Int) extends MetaData
  20. ...
  21.  
  22. // type def for Metadata
  23. object MetadataType{ // singleton wrapper, because type defs can't be toplevel
  24. type MetaData = (Int,Long)
  25. }
  26. import MetadataType.Metadata
  27.  
  28. // unpack using pattern matching
  29. class HasMetaData(metadata: Metadata) {
  30. val (id,timestamp) = metadata
  31. }
  32. case class Client(metadata: MetaData, name: String) extends HasMetaData(metadata)
  33. case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData(metadata)
  34.  
  35. // alternative: even avoid constructor argument
  36. trait HasMetaData {
  37. def metadata: Metadata
  38. lazy val (id,timestamp) = metadata // lazy to avoid init order probs
  39. }
  40. case class Client(metadata: MetaData, name: String) extends HasMetaData
  41. case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData
  42.  
  43. ...
  44. def * = ((id,timestamp), name) <> (Client.tupled, Client.unapply)
  45. ...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement