fork download
  1. object Main extends App {
  2.  
  3. trait Replica {
  4. def identity: ReplicaIdentity
  5.  
  6. abstract trait ReplicaIdentity
  7. }
  8.  
  9. trait LocalReplica extends Replica {
  10. final val identity = LocalIdentity
  11.  
  12. object LocalIdentity extends ReplicaIdentity
  13. }
  14.  
  15.  
  16. trait NamedReplica extends Replica {
  17. val name: String
  18. final lazy val identity = NamedIdentity(name)
  19.  
  20. case class NamedIdentity (name: String) extends ReplicaIdentity {
  21. override def equals(other: Any): Boolean = other match {
  22. case (that: NamedReplica#NamedIdentity) => // we have to use 'NamedReplica#' (type projection), otherwise the `other` would have path dependent type and would not match with just 'NamedIdentity'
  23. that.isInstanceOf[NamedIdentity] && name == that.name
  24.  
  25. case _ =>
  26. }
  27. }
  28. }
  29.  
  30. class CRDT {
  31. this: Replica =>
  32.  
  33. def getId = identity
  34. }
  35.  
  36. val o = new CRDT() with LocalReplica
  37.  
  38. val o2 = new CRDT() with NamedReplica {
  39. val name = "2"
  40. }
  41.  
  42. val o3 = new CRDT() with NamedReplica {
  43. val name = "3"
  44. }
  45.  
  46. val o4 = new CRDT() with NamedReplica {
  47. val name = "2"
  48. }
  49.  
  50. assert(o2.getId != o.getId)
  51. assert(o2.getId != o3.getId)
  52. assert(o2.getId == o4.getId)
  53. assert(o2.getId == o2.getId)
  54. }
Success #stdin #stdout 0.38s 382016KB
stdin
Standard input is empty
stdout
Standard output is empty