Facebook
From Rude Bushbaby, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 254
  1. import java.awt.Color
  2.  
  3. object HelloWorld {
  4.     def main(args: Array[String]) {
  5.       var queueOfPoints = MyQueue(new Point())
  6.       var queueOfPixels = MyQueue(new Pixel(2,3, Color.red))
  7.    
  8.       val queueOfPoints01 = queueOfPoints.enqueue(new Pixel(1, 2))
  9.    
  10.       println (queueOfPoints.first.toString())
  11.       println (queueOfPixels.first.toString())
  12.       println (queueOfPoints01.first.toString())
  13.    
  14.       println( queueOfPoints01.dequeue.first.toString() )
  15.    
  16.       queueOfPoints = queueOfPixels
  17.       println(queueOfPoints.first.toString())
  18.     }
  19.    
  20.     class Point(
  21.         var x:Double = 0.0,
  22.         var y:Double = 0.0
  23.     ) {
  24.         override def toString = "[" + x + ", " + y + "]"
  25.     }
  26.    
  27.     class Pixel(
  28.         xp:Double=0.0,
  29.         yp:Double=0.0,
  30.         var color:Color = Color.BLACK
  31.     ) extends Point(xp, yp) {
  32.         override def toString = super.toString + " " + color
  33.     }
  34.    
  35.     class UnderflowException(msg: String) extends Exception(msg)
  36.    
  37.     class MyQueue[+T] private(private val queue: (List[T], List[T])) {
  38.         def enqueue[S >: T](element: S): MyQueue[S] = {
  39.             val (beginningOfQueue, endOfQueue) = queue
  40.             normalize(beginningOfQueue, element :: endOfQueue)
  41.         }
  42.    
  43.         private def normalize[S >: T](list1: List[S], list2: List[S]) =
  44.         (list1, list2) match {
  45.             case (Nil, endOfQueue) => new MyQueue[S]((endOfQueue.reverse, Nil))
  46.             case normalQueue => new MyQueue(normalQueue)
  47.         }
  48.    
  49.         def dequeue: MyQueue[T] =
  50.         queue match {
  51.             case (_ :: tail, endOfQueue) => normalize(tail, endOfQueue)
  52.             case _ => MyQueue.empty
  53.         }
  54.    
  55.         def first: T =
  56.         queue._1 match {
  57.             case (head :: _) => head
  58.             case _ => throw new UnderflowException("first")
  59.         }
  60.    
  61.         def isEmpty: Boolean = queue._1 == Nil
  62.    
  63.         override def equals(obj: Any): Boolean =
  64.         obj match {
  65.             case obj: MyQueue[_] => queue._1 ++ queue._2.reverse == obj.queue._1 ++ obj.queue._2.reverse
  66.             case _ => false
  67.         }
  68.     }
  69.    
  70.     object MyQueue {
  71.         def apply[T](xs: T*) = new MyQueue[T](xs.toList, Nil)
  72.         def empty[T] = new MyQueue[T](Nil, Nil)
  73.     }
  74.  
  75.  
  76. }