Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.07 KB | None | 0 0
  1. import java.util.NoSuchElementException
  2.  
  3. import scala.collection.generic._
  4. import scala.collection.immutable.LinearSeq
  5. import scala.collection.{SeqLike, mutable}
  6. import scala.{specialized ⇒ sp}
  7.  
  8. sealed trait CherryTree[+T]
  9. extends LinearSeq[T]
  10. with SeqLike[T, CherryTree[T]]
  11. with GenericTraversableTemplate[T, CherryTree] {
  12. override def stringPrefix: String = "CherryTree"
  13.  
  14. def :+[A >: T](x: A): CherryTree[A]
  15.  
  16. def +:[A >: T](x: A): CherryTree[A]
  17.  
  18. override def companion = CherryTree
  19.  
  20. protected def sizeList: List[Int]
  21.  
  22. protected def get(idx: Int, sl: List[Int]): T
  23. }
  24.  
  25.  
  26. object CherryTree extends TraversableFactory[CherryTree] {
  27. implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, CherryTree[A]] =
  28. ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]
  29.  
  30. override def newBuilder[A] = new mutable.Builder[A, CherryTree[A]] {
  31. override def +=(elem: A): this.type = {result :+= elem; this}
  32. override def clear(): Unit = result = Empty
  33. var result: CherryTree[A] = Empty
  34. }
  35.  
  36. private trait Tail[@sp +T] {
  37. def foreach[U](f: T ⇒ U): Unit
  38.  
  39. def size: Int
  40.  
  41. def head: T
  42.  
  43. def last: T
  44. }
  45.  
  46. private case class Tail1[@sp +T](x: T) extends Tail[T] {
  47. override def foreach[U](f: (T) ⇒ U): Unit = f(x)
  48. override def size: Int = 1
  49. override def head = x
  50. override def last = x
  51. }
  52.  
  53. private case class Tail2[@sp +T](x: T, y: T) extends Tail[T] {
  54. override def foreach[U](f: (T) ⇒ U): Unit = {f(x); f(y)}
  55. override def size: Int = 2
  56. override def head: T = x
  57. override def last: T = y
  58. }
  59.  
  60. private case object Empty extends CherryTree[Nothing] {
  61. override def :+[A](x: A) = Single(x)
  62. override def +:[A](x: A) = Single(x)
  63. override def length = 0
  64. override def isEmpty = true
  65. override def apply(idx: Int) = throw new NoSuchElementException
  66. override def sizeList: List[Int] = List(0)
  67. override protected def get(idx: Int, sl: List[Int]) = throw new NoSuchElementException
  68. override def foreach[U](f: (Nothing) ⇒ U) = ()
  69. override def head = throw new NoSuchElementException
  70. override def tail = throw new NoSuchElementException
  71. override def last = throw new NoSuchElementException
  72. override def init = throw new NoSuchElementException
  73. }
  74.  
  75. private case class Single[+T](value: T) extends CherryTree[T] {
  76. override def :+[A >: T](x: A): CherryTree[A] = Cons(Tail1(value), Empty, Tail1(x))
  77. override def +:[A >: T](x: A): CherryTree[A] = Cons(Tail1(x), Empty, Tail1(value))
  78. override def length: Int = 1
  79. override def apply(idx: Int) = if (idx == 0) value else throw new NoSuchElementException
  80. override def isEmpty: Boolean = false
  81. override def sizeList: List[Int] = List(1)
  82. override protected def get(idx: Int, sl: List[Int]): T = value
  83. override def foreach[U](f: (T) ⇒ U): Unit = f(value)
  84. override def head = value
  85. override def tail = Empty
  86. override def last = value
  87. override def init = Empty
  88. }
  89.  
  90. private case class Cons[+T](left: Tail[T], sub: CherryTree[Tail2[T]], right: Tail[T]) extends CherryTree[T] {
  91. override def :+[A >: T](x: A): CherryTree[A] = right match {
  92. case Tail1(y) ⇒ copy(right = Tail2(y, x))
  93. case Tail2(y, z) ⇒ copy(right = Tail1(x), sub = sub :+ Tail2(y, z))
  94. }
  95. override def +:[A >: T](x: A): CherryTree[A] = left match {
  96. case Tail1(y) ⇒ copy(left = Tail2(x, y))
  97. case Tail2(y, z) ⇒ copy(left = Tail1(x), sub = Tail2(y, z) +: sub)
  98. }
  99. override def length: Int = left.size + 2 * sub.length + right.size
  100. override def isEmpty: Boolean = false
  101. override def sizeList: List[Int] = {
  102. val subList = sub.sizeList
  103. (left.size + subList.head * 2 + right.size) :: subList
  104. }
  105.  
  106. override def apply(idx: Int) = left match {
  107. case Tail1(x) if idx == 0 ⇒ x
  108. case Tail2(x, y) if idx < 2 ⇒ if (idx == 0) x else y
  109. case _ ⇒ get(idx, sizeList)
  110. }
  111.  
  112. override protected def get(idx: Int, sl: List[Int]): T =
  113. if (idx < left.size) left match {
  114. case Tail1(x) ⇒ x
  115. case Tail2(x, y) ⇒ if (idx == 0) x else y
  116. } else if (idx >= sl.head - right.size) right match {
  117. case Tail1(x) ⇒ x
  118. case Tail2(x, y) ⇒ if (idx == sl.head - 1) y else x
  119. } else {
  120. val idxFixed = idx - left.size
  121. val s = sub.get(idxFixed / 2, sl.tail)
  122. if (idxFixed % 2 == 0) s.x else s.y
  123. }
  124.  
  125. override def foreach[U](f: (T) ⇒ U): Unit = {
  126. left.foreach(f)
  127. sub.foreach {_.foreach(f)}
  128. right.foreach(f)
  129. }
  130.  
  131. override def head = left.head
  132.  
  133. override def tail = left match {
  134. case Tail2(_, x) ⇒ Cons(Tail1(x), sub, right)
  135. case _ if sub.nonEmpty ⇒ Cons(sub.head, sub.tail, right)
  136. case _ ⇒ right match {
  137. case Tail1(x) ⇒ Single(x)
  138. case Tail2(x, y) ⇒ Cons(Tail1(x), Empty, Tail1(y))
  139. }
  140. }
  141.  
  142. override def last = right.last
  143.  
  144. override def init = right match {
  145. case Tail2(x, _) ⇒ Cons(left, sub, Tail1(x))
  146. case _ if sub.nonEmpty ⇒ Cons(left, sub.init, sub.last)
  147. case _ ⇒ left match {
  148. case Tail1(x) ⇒ Single(x)
  149. case Tail2(x, y) ⇒ Cons(Tail1(x), Empty, Tail1(y))
  150. }
  151. }
  152. }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement