Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- trait HasIdAndTimestamp {
- val id: Int
- val timestamp: Long
- }
- case class Client(id: Int, timestamp: Long, name: String) extends HasIdAndTimestamp
- case class Order(id: Int, timestamp: Long, items: List[Int], clientId: Int) extends HasIdAndTimestamp
- ...
- case class MetaData(id: Int, timestamp: Long)
- trait HasMetaData {
- val metadata: MetaData
- }
- case class Client(metadata: MetaData, name: String) extends HasMetaData
- case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData
- ...
- case class MetaData(id: Int, timestamp: Long)
- case class Client(name: String) extends MetaData
- case class Order(items: List[Int], clientId: Int) extends MetaData
- ...
- // type def for Metadata
- object MetadataType{ // singleton wrapper, because type defs can't be toplevel
- type MetaData = (Int,Long)
- }
- import MetadataType.Metadata
- // unpack using pattern matching
- class HasMetaData(metadata: Metadata) {
- val (id,timestamp) = metadata
- }
- case class Client(metadata: MetaData, name: String) extends HasMetaData(metadata)
- case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData(metadata)
- // alternative: even avoid constructor argument
- trait HasMetaData {
- def metadata: Metadata
- lazy val (id,timestamp) = metadata // lazy to avoid init order probs
- }
- case class Client(metadata: MetaData, name: String) extends HasMetaData
- case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData
- ...
- def * = ((id,timestamp), name) <> (Client.tupled, Client.unapply)
- ...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement