immutableiterator.scala

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

SCALA
112
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2003-2007, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: ImmutableIterator.scala 10200 2007-03-04 10:33:14Z mihaylov $package scala.collection.immutable/** An object for creating immutable iterators.  */object ImmutableIterator {  case object Empty extends ImmutableIterator[Nothing] {    def hasNext = false    def next = throw new NoSuchElementException  }  private case class NonEmpty[+A](item: A, right: () => ImmutableIterator[A]) extends ImmutableIterator[A] {    def hasNext = true    def next = Tuple2(item, right())  }  /** Creates an empty immutable iterator.   */  def empty : ImmutableIterator[Nothing] = Empty  /** Creates an immutable iterator with one element.   */  def apply[A](item : A) : ImmutableIterator[A] = NonEmpty(item, () => Empty)  /** Prepends a lazy immutable iterator (right) with an element (item).   */  def apply[A](item : A, right : () => ImmutableIterator[A]) : () => ImmutableIterator[A] =    () => NonEmpty(item, right)  /** Appends an immutable iterator (left) with an element (item) followed   *  by a lazy immutable iterator (right).   */  def apply[A](left : ImmutableIterator[A], item : A, right : () => ImmutableIterator[A]) : ImmutableIterator[A] = left match {  case NonEmpty(first, middle) =>     val rest = NonEmpty(item,right);    NonEmpty(first, apply(middle, () => rest));    case Empty => NonEmpty(item, right);  }  /** Concats a lazy immutable iterator (left) with another lazy immutable   *  iterator (right).   */  def apply[A](left: () => ImmutableIterator[A], right: () => ImmutableIterator[A]): () => ImmutableIterator[A] = () => (left() match {    case Empty => right()    case NonEmpty(item, middle) => NonEmpty(item, apply(middle, right))  });}/** A stateless iterator. * *  @author  Sean McDirmid *  @version 1.0 */sealed abstract class ImmutableIterator[+A] {  /** queries if this iterator has an element to return.   */  def hasNext: Boolean  /** returns the next element and immutable iterator as a pair.   */  def next: Tuple2[A,ImmutableIterator[A]]  /** Creates a new immutable iterator that appends item to this immutable   *  iterator.   */  def append[B >: A](item: B): ImmutableIterator[B] = append(item, () => ImmutableIterator.Empty)  /** Creates a new immutable iterator that appends item  and a lazy immutable   *  iterator (right) to this immutable iterator.   *   *  @param item  ...   *  @param right ...   *  @return      ...   */  def append[B >: A](item: B, right: () => ImmutableIterator[B]): ImmutableIterator[B] =    ImmutableIterator[B](this, item, right)  /** Creates a new immutable iterator that appends a lazy immutable   *  iterator (right) to this immutable iterator.   */  def append[B >: A](right: () => ImmutableIterator[B]) =    ImmutableIterator(() => this, right)()  private class Elements extends Iterator[A] {    private[this] var cursor: ImmutableIterator[A] = ImmutableIterator.this    def hasNext = cursor.hasNext    def next = {      val Tuple2(ret,cursor0) = cursor.next      cursor = cursor0      ret    }  }  /** Converts this immutable iterator into a conventional iterator.   */  def elements: Iterator[A] = new Elements}

⌨️ 快捷键说明

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