src/Tools/Haskell/XML/Encode.hs
author wenzelm
Mon, 05 Nov 2018 17:06:50 +0100
changeset 69240 16ca270090b6
child 69280 e1d01b351724
permissions -rw-r--r--
more Haskell operations; tuned;
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.
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     8
-}
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
     9
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    10
module Isabelle.XML.Encode (
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    11
  A, T, V,
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    12
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    13
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    14
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    15
  tree, properties, string, init, bool, unit, pair, triple, list, variant
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    16
)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    17
where
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    18
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    19
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    20
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    21
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    22
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    23
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    24
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    25
type A a = a -> String
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    26
type T a = a -> XML.Body
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    27
type V a = a -> Maybe ([String], XML.Body)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    28
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    29
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    30
-- atomic values
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    31
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    32
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    33
int_atom = Value.print_int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    34
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    35
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    36
bool_atom False = "0"
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    37
bool_atom True = "1"
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    38
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    39
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    40
unit_atom () = ""
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    41
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    42
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    43
-- structural nodes
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    44
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    45
node = XML.Elem (":", [])
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    46
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    47
vector = map_index (\(i, x) -> (int_atom i, x))
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    48
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    49
tagged (tag, (xs, ts)) = XML.Elem (int_atom tag, vector xs) ts
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    50
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    51
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    52
-- representation of standard types
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    53
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    54
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    55
tree t = [t]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    56
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    57
properties :: T Properties.T
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    58
properties props = [XML.Elem (":", props) []]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    59
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    60
string :: T String
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    61
string "" = []
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    62
string s = [XML.Text s]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    63
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    64
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    65
int = string . int_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    66
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    67
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    68
bool = string . bool_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    69
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    70
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    71
unit = string . unit_atom
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    72
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    73
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    74
pair f g (x, y) = [node (f x), node (g y)]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    75
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    76
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    77
triple f g h (x, y, z) = [node (f x), node (g y), node (h z)]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    78
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    79
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    80
list f xs = map (node . f) xs
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    81
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    82
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents:
diff changeset
    83
variant fs x = [tagged (the (get_index (\f -> f x) fs))]