mutableseq.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 124 行

SCALA
124
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2006-2007, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |                                         **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: MutableSeq.scala 12340 2007-07-17 15:29:47Z mcdirmid $package scala.collection.jcl;/** A mutable sequence that supports the remove operation and is ordered. * *  @author Sean McDirmid */trait MutableSeq[A] extends Seq[A] with MutableIterable[A]  {  protected class DefaultSeqIterator extends SeqIterator[Int,A] {    protected var index = 0    override def hasNext = index < length    override def next = {      if (!hasNext) throw new NoSuchElementException("no lookahead")      index = index + 1      MutableSeq.this.apply(index - 1)    }    override def hasPrevious = index > 0    override def previous = {      if (!hasPrevious) throw new NoSuchElementException      index = index - 1      MutableSeq.this.apply(index)    }        override def nextIndex = index    override def previousIndex = {      if (index == 0) throw new NoSuchElementException      else index - 1    }    def remove = throw new UnsupportedOperationException  }  override def elements : SeqIterator[Int,A] = new DefaultSeqIterator  override def isEmpty = super[MutableIterable].isEmpty;  override def apply(idx : Int) = elements.seek(idx);  override def projection : MutableSeq.Projection[A] = new MutableSeq.Projection[A] {    override def length = MutableSeq.this.length    override def elements = MutableSeq.this.elements    override def apply(idx : Int) = MutableSeq.this.apply(idx)  }    /** Find the index of "a" in this sequence.    *  @returns None if the "a" is not in this sequence.   */  def indexOf(a : A) = elements.indexOf(a);  override def length = {    var i = elements;    var sz = 0;    while (i.hasNext) {      sz = sz + 1;      i.next;    }    sz;  }  protected trait Filter extends MutableSeq.Projection[A] {    protected def p(a : A) : Boolean    override def elements : SeqIterator[Int,A] = new FilterIterator(MutableSeq.this.elements);    class FilterIterator(underlying : SeqIterator[Int,A]) extends SeqIterator[Int,A] {      private var index = 0;      protected def seekNext : Option[A] = {        while (underlying.hasNext) {          val next = underlying.next;          if (p(next)) return Some(next);        }        return None;      }      protected def seekPrevious : Option[A] = {        while (underlying.hasPrevious) {          val previous = underlying.previous;          if (p(previous)) return Some(previous);        }        return None;      }      def hasNext : Boolean = seekNext match {      case None => false;      case Some(_) => underlying.previous; true;      }      def nextIndex = index;      def next = seekNext match {      case None => throw new NoSuchElementException;      case Some(result) => index = index + 1; result;      }      def hasPrevious : Boolean = seekPrevious match {      case None => false;      case Some(_) => underlying.previous; true;      }      def previousIndex = {        if (index == 0) throw new NoSuchElementException;        index - 1;      }      def previous = seekPrevious match {      case None => throw new NoSuchElementException;      case Some(result) => index = index - 1; result;      }      def remove = underlying.remove;    }  }  protected class Map[B](f : A => B) extends super.Map[B](f) with MutableSeq.Projection[B] {    override def elements = MutableSeq.this.elements.map(f);    override def apply(idx : Int) = f(MutableSeq.this.apply(idx));    override def size = length;  }}object MutableSeq {  trait Projection[A] extends MutableSeq[A] with MutableIterable.Projection[A] with Seq.Projection[A] {    override def projection = this    override def filter(pp : A => Boolean) : Projection[A] = new Filter {      override def p(a : A) = pp(a)    }    override def map[B](f : A => B) : Projection[B] = new Map[B](f);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?