src/Tools/Haskell/XML/Encode.hs
author wenzelm
Mon, 12 Nov 2018 15:36:55 +0100
changeset 69290 fb77612d11eb
parent 69287 0fde0dca6744
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     1
{- generated by Isabelle -}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     2
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     3
{-  Title:      Tools/Haskell/XML/Encode.hs
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     4
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     5
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     6
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     7
XML as data representation language.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69240
diff changeset
     8
e1d01b351724 more formal references;
wenzelm
parents: 69240
diff changeset
     9
See also "$ISABELLE_HOME/src/Pure/PIDE/xml.ML".
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    10
-}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    11
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    12
module Isabelle.XML.Encode (
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    13
  A, T, V,
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    14
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    15
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    16
69287
0fde0dca6744 proper export;
wenzelm
parents: 69280
diff changeset
    17
  tree, properties, string, int, bool, unit, pair, triple, list, variant
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    18
)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    19
where
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    20
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    21
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    22
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    23
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    24
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    25
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    26
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    27
type A a = a -> String
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    28
type T a = a -> XML.Body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    29
type V a = a -> Maybe ([String], XML.Body)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    30
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    31
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    32
-- atomic values
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    33
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    34
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    35
int_atom = Value.print_int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    36
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    37
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    38
bool_atom False = "0"
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    39
bool_atom True = "1"
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    40
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    41
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    42
unit_atom () = ""
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    43
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    44
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    45
-- structural nodes
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    46
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69287
diff changeset
    47
node ts = XML.Elem ((":", []), ts)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    48
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    49
vector = map_index (\(i, x) -> (int_atom i, x))
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    50
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69287
diff changeset
    51
tagged (tag, (xs, ts)) = XML.Elem ((int_atom tag, vector xs), ts)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    52
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    53
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    54
-- representation of standard types
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    55
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    56
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    57
tree t = [t]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    58
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    59
properties :: T Properties.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69287
diff changeset
    60
properties props = [XML.Elem ((":", props), [])]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    61
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    62
string :: T String
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    63
string "" = []
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    64
string s = [XML.Text s]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    65
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    66
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    67
int = string . int_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    68
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    69
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    70
bool = string . bool_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    71
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    72
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    73
unit = string . unit_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    74
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    75
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    76
pair f g (x, y) = [node (f x), node (g y)]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    77
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    78
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    79
triple f g h (x, y, z) = [node (f x), node (g y), node (h z)]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    80
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    81
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    82
list f xs = map (node . f) xs
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    83
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    84
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    85
variant fs x = [tagged (the (get_index (\f -> f x) fs))]