src/Pure/General/xml.scala
author wenzelm
Thu, 21 Aug 2008 20:51:41 +0200
changeset 27942 5ac9a0f9fad0
parent 27941 b4656b671cce
child 27947 b6dc0a396857
permissions -rw-r--r--
tuned comment;

/*  Title:      Pure/General/xml.scala
    ID:         $Id$
    Author:     Makarius

Minimalistic XML tree values.
*/

package isabelle

object XML {
  type Attributes = List[(String, String)]

  abstract class Tree
  case class Elem(name: String, attributes: Attributes, body: List[Tree]) extends Tree
  case class Text(content: String) extends Tree


  /* iterate over content */

  private type State = Option[(String, List[Tree])]

  private def get_next(tree: Tree): State = tree match {
    case Elem(_, _, body) => get_nexts(body)
    case Text(content) => Some(content, Nil)
  }
  private def get_nexts(trees: List[Tree]): State = trees match {
    case Nil => None
    case t :: ts => get_next(t) match {
      case None => get_nexts(ts)
      case Some((s, r)) => Some((s, r ::: ts))
    }
  }

  def content(tree: Tree) = new Iterator[String] {
    private var state = get_next(tree)
    def hasNext() = state.isDefined
    def next() = state match {
      case Some((s, rest)) => { state = get_nexts(rest); s }
      case None => throw new NoSuchElementException("next on empty iterator")
    }
  }

}