src/Pure/General/xml_data.scala
author wenzelm
Sun, 10 Jul 2011 13:51:21 +0200
changeset 43724 4e58485fa320
parent 43723 8a63c95b1d5b
child 43725 bebcfcad12d4
permissions -rw-r--r--
simplified XML_Data;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/xml_data.scala
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     3
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     4
XML as basic data representation language.
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     5
*/
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     6
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     7
package isabelle
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     8
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
     9
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    10
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    11
object XML_Data
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    12
{
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    13
  /** make **/
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    14
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    15
  object Make
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    16
  {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    17
    /* basic values */
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    18
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    19
    private def long_atom(i: Long): String = i.toString
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    20
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    21
    private def int_atom(i: Int): String = i.toString
38355
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    22
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    23
    private def bool_atom(b: Boolean): String = if (b) "1" else "0"
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    24
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    25
    private def unit_atom(u: Unit) = ""
38355
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    26
8cb265fb12fe represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents: 38269
diff changeset
    27
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    28
    /* structural nodes */
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    29
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    30
    private def node(ts: XML.Body): XML.Tree = XML.Elem(Markup(":", Nil), ts)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    31
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    32
    private def tagged(tag: Int, ts: XML.Body): XML.Tree =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    33
      XML.Elem(Markup(int_atom(tag), Nil), ts)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    34
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    35
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    36
    /* representation of standard types */
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    37
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    38
    def properties(props: List[(String, String)]): XML.Body =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    39
      List(XML.Elem(Markup(":", props), Nil))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    40
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    41
    def string(s: String): XML.Body = if (s.isEmpty) Nil else List(XML.Text(s))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    42
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    43
    def long(i: Long): XML.Body = string(long_atom(i))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    44
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    45
    def int(i: Int): XML.Body = string(int_atom(i))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    46
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    47
    def bool(b: Boolean): XML.Body = string(bool_atom(b))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    48
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    49
    def unit(u: Unit): XML.Body = string(unit_atom(u))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    50
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    51
    def pair[A, B](f: A => XML.Body, g: B => XML.Body)(p: (A, B)): XML.Body =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    52
      List(node(f(p._1)), node(g(p._2)))
43698
91c4d7397f0e simplified make_option/dest_option;
wenzelm
parents: 38355
diff changeset
    53
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    54
    def triple[A, B, C](f: A => XML.Body, g: B => XML.Body, h: C => XML.Body)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    55
        (p: (A, B, C)): XML.Body =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    56
      List(node(f(p._1)), node(g(p._2)), node(h(p._3)))
43698
91c4d7397f0e simplified make_option/dest_option;
wenzelm
parents: 38355
diff changeset
    57
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    58
    def list[A](f: A => XML.Body)(xs: List[A]): XML.Body =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    59
      xs.map((x: A) => node(f(x)))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    60
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    61
    def option[A](f: A => XML.Body)(opt: Option[A]): XML.Body =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    62
      opt match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    63
        case None => Nil
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    64
        case Some(x) => List(node(f(x)))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    65
      }
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    66
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    67
    def variant[A](fs: List[PartialFunction[A, XML.Body]])(x: A): XML.Body =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    68
    {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    69
      val (f, tag) = fs.iterator.zipWithIndex.find(p => p._1.isDefinedAt(x)).get
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    70
      List(tagged(tag, f(x)))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    71
    }
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    72
  }
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    73
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    74
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    75
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    76
  /** dest **/
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    77
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    78
  class XML_Atom(s: String) extends Exception(s)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    79
  class XML_Body(body: XML.Body) extends Exception
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    80
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    81
  object Dest
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    82
  {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    83
     /* basic values */
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
    84
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    85
    private def long_atom(s: String): Long =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    86
      try { java.lang.Long.parseLong(s) }
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    87
      catch { case e: NumberFormatException => throw new XML_Atom(s) }
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    88
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    89
    private def int_atom(s: String): Int =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    90
      try { Integer.parseInt(s) }
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    91
      catch { case e: NumberFormatException => throw new XML_Atom(s) }
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    92
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    93
    private def bool_atom(s: String): Boolean =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    94
      if (s == "1") true
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    95
      else if (s == "0") false
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    96
      else throw new XML_Atom(s)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    97
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    98
    private def unit_atom(s: String): Unit =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
    99
      if (s == "") () else throw new XML_Atom(s)
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   100
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   101
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   102
    /* structural nodes */
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   103
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   104
    private def node(t: XML.Tree): XML.Body =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   105
      t match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   106
        case XML.Elem(Markup(":", Nil), ts) => ts
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   107
        case _ => throw new XML_Body(List(t))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   108
      }
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   109
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   110
    private def tagged(t: XML.Tree): (Int, XML.Body) =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   111
      t match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   112
        case XML.Elem(Markup(s, Nil), ts) => (int_atom(s), ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   113
        case _ => throw new XML_Body(List(t))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   114
      }
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   115
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   116
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   117
    /* representation of standard types */
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   118
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   119
    def properties(ts: XML.Body): List[(String, String)] =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   120
      ts match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   121
        case List(XML.Elem(Markup(":", props), Nil)) => props
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   122
        case _ => throw new XML_Body(ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   123
      }
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   124
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   125
    def string(ts: XML.Body): String =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   126
      ts match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   127
        case Nil => ""
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   128
        case List(XML.Text(s)) => s
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   129
        case _ => throw new XML_Body(ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   130
      }
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   131
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   132
    def long(ts: XML.Body): Long = long_atom(string(ts))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   133
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   134
    def int(ts: XML.Body): Int = int_atom(string(ts))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   135
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   136
    def bool(ts: XML.Body) = bool_atom(string(ts))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   137
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   138
    def unit(ts: XML.Body): Unit = unit_atom(string(ts))
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   139
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   140
    def pair[A, B](f: XML.Body => A, g: XML.Body => B)(ts: XML.Body): (A, B) =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   141
      ts match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   142
        case List(t1, t2) => (f(node(t1)), g(node(t2)))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   143
        case _ => throw new XML_Body(ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   144
      }
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   145
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   146
    def triple[A, B, C](f: XML.Body => A, g: XML.Body => B, h: XML.Body => C)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   147
        (ts: XML.Body): (A, B, C) =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   148
      ts match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   149
        case List(t1, t2, t3) => (f(node(t1)), g(node(t2)), h(node(t3)))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   150
        case _ => throw new XML_Body(ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   151
      }
43698
91c4d7397f0e simplified make_option/dest_option;
wenzelm
parents: 38355
diff changeset
   152
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   153
    def list[A](f: XML.Body => A)(ts: XML.Body): List[A] =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   154
      ts.map((t: XML.Tree) => f(node(t)))
43698
91c4d7397f0e simplified make_option/dest_option;
wenzelm
parents: 38355
diff changeset
   155
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   156
    def option[A](f: XML.Body => A)(ts: XML.Body): Option[A] =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   157
      ts match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   158
        case Nil => None
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   159
        case List(t) => Some(f(node(t)))
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   160
        case _ => throw new XML_Body(ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   161
      }
43698
91c4d7397f0e simplified make_option/dest_option;
wenzelm
parents: 38355
diff changeset
   162
43724
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   163
    def variant[A](fs: List[XML.Body => A])(ts: XML.Body): A =
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   164
      ts match {
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   165
        case List(t) =>
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   166
          val (tag, ts) = tagged(t)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   167
          fs(tag)(ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   168
        case _ => throw new XML_Body(ts)
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   169
      }
4e58485fa320 simplified XML_Data;
wenzelm
parents: 43723
diff changeset
   170
  }
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents:
diff changeset
   171
}