src/Tools/Haskell/Haskell.thy
author wenzelm
Wed, 19 Dec 2018 12:26:38 +0100
changeset 69480 2cc9212342a7
parent 69477 1690ba936016
child 69482 186b03abb764
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     1
(*  Title:      Tools/Haskell/Haskell.thy
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
     3
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
     4
Support for Isabelle tools in Haskell.
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     5
*)
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     6
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     7
theory Haskell
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     8
  imports Pure
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
     9
begin
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
    10
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
    11
generate_file "Isabelle/Library.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
    12
{-  Title:      Isabelle/Library.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    13
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    14
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    15
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    16
Basic library of Isabelle idioms.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
    17
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
    18
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/basics.ML\<close>, \<^file>\<open>$ISABELLE_HOME/src/Pure/library.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    19
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    20
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    21
module Isabelle.Library (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    22
  (|>), (|->), (#>), (#->),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    23
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    24
  the, the_default,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    25
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    26
  fold, fold_rev, single, map_index, get_index,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    27
69477
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
    28
  proper_string, quote, space_implode, commas, commas_quote, cat_lines,
69453
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
    29
  space_explode, split_lines, trim_line, clean_name)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    30
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    31
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    32
import Data.Maybe
69453
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
    33
import qualified Data.List as List
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
    34
import qualified Data.List.Split as Split
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    35
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    36
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    37
{- functions -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    38
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    39
(|>) :: a -> (a -> b) -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    40
x |> f = f x
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    41
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    42
(|->) :: (a, b) -> (a -> b -> c) -> c
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    43
(x, y) |-> f = f x y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    44
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    45
(#>) :: (a -> b) -> (b -> c) -> a -> c
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    46
(f #> g) x = x |> f |> g
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    47
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    48
(#->) :: (a -> (c, b)) -> (c -> b -> d) -> a -> d
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    49
(f #-> g) x  = x |> f |-> g
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    50
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    51
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    52
{- options -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    53
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    54
the :: Maybe a -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    55
the (Just x) = x
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    56
the Nothing = error "the Nothing"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    57
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    58
the_default :: a -> Maybe a -> a
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    59
the_default x Nothing = x
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    60
the_default _ (Just y) = y
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    61
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
    62
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    63
{- lists -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    64
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    65
fold :: (a -> b -> b) -> [a] -> b -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    66
fold _ [] y = y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    67
fold f (x : xs) y = fold f xs (f x y)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    68
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    69
fold_rev :: (a -> b -> b) -> [a] -> b -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    70
fold_rev _ [] y = y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    71
fold_rev f (x : xs) y = f x (fold_rev f xs y)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    72
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    73
single :: a -> [a]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    74
single x = [x]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    75
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    76
map_index :: ((Int, a) -> b) -> [a] -> [b]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    77
map_index f = map_aux 0
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    78
  where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    79
    map_aux _ [] = []
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    80
    map_aux i (x : xs) = f (i, x) : map_aux (i + 1) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    81
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    82
get_index :: (a -> Maybe b) -> [a] -> Maybe (Int, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    83
get_index f = get_aux 0
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    84
  where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    85
    get_aux _ [] = Nothing
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    86
    get_aux i (x : xs) =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    87
      case f x of
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    88
        Nothing -> get_aux (i + 1) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    89
        Just y -> Just (i, y)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
    90
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    91
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    92
{- strings -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    93
69477
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
    94
proper_string :: String -> Maybe String
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
    95
proper_string s = if null s then Nothing else Just s
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
    96
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    97
quote :: String -> String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    98
quote s = "\"" ++ s ++ "\""
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
    99
69453
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   100
space_implode :: String -> [String] -> String
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   101
space_implode = List.intercalate
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   102
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   103
commas, commas_quote :: [String] -> String
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   104
commas = space_implode ", "
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   105
commas_quote = commas . map quote
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   106
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   107
cat_lines :: [String] -> String
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   108
cat_lines = space_implode "\n"
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   109
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   110
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   111
space_explode :: Char -> String -> [String]
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   112
space_explode c = Split.split (Split.dropDelims (Split.whenElt (== c)))
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   113
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   114
split_lines :: String -> [String]
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   115
split_lines = space_explode '\n'
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   116
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   117
trim_line :: String -> String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   118
trim_line line =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   119
  case reverse line of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   120
    '\n' : '\r' : rest -> reverse rest
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   121
    '\n' : rest -> reverse rest
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   122
    _ -> line
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   123
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   124
clean_name :: String -> String
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   125
clean_name = reverse #> dropWhile (== '_') #> reverse
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   126
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   127
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   128
generate_file "Isabelle/Value.hs" = \<open>
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   129
{-  Title:      Haskell/Tools/Value.hs
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   130
    Author:     Makarius
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   131
    LICENSE:    BSD 3-clause (Isabelle)
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   132
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   133
Plain values, represented as string.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   134
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   135
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/value.ML\<close>.
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   136
-}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   137
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   138
module Isabelle.Value
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   139
  (print_bool, parse_bool, parse_nat, print_int, parse_int, print_real, parse_real)
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   140
where
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   141
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   142
import Data.Maybe
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   143
import qualified Data.List as List
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   144
import qualified Text.Read as Read
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   145
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   146
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   147
{- bool -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   148
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   149
print_bool :: Bool -> String
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   150
print_bool True = "true"
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   151
print_bool False = "false"
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   152
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   153
parse_bool :: String -> Maybe Bool
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   154
parse_bool "true" = Just True
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   155
parse_bool "false" = Just False
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   156
parse_bool _ = Nothing
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   157
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   158
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   159
{- nat -}
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   160
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   161
parse_nat :: String -> Maybe Int
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   162
parse_nat s =
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   163
  case Read.readMaybe s of
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   164
    Just n | n >= 0 -> Just n
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   165
    _ -> Nothing
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   166
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   167
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   168
{- int -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   169
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   170
print_int :: Int -> String
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   171
print_int = show
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   172
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   173
parse_int :: String -> Maybe Int
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   174
parse_int = Read.readMaybe
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   175
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   176
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   177
{- real -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   178
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   179
print_real :: Double -> String
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   180
print_real x =
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   181
  let s = show x in
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   182
    case span (/= '.') s of
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   183
      (a, '.' : b) | List.all (== '0') b -> a
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   184
      _ -> s
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   185
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   186
parse_real :: String -> Maybe Double
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   187
parse_real = Read.readMaybe
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   188
\<close>
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   189
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   190
generate_file "Isabelle/Buffer.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   191
{-  Title:      Isabelle/Buffer.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   192
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   193
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   194
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   195
Efficient text buffers.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   196
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   197
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/buffer.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   198
-}
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
   199
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   200
module Isabelle.Buffer (T, empty, add, content)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   201
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   202
69474
2633cf136335 tuned -- more compact;
wenzelm
parents: 69473
diff changeset
   203
import Isabelle.Library
2633cf136335 tuned -- more compact;
wenzelm
parents: 69473
diff changeset
   204
2633cf136335 tuned -- more compact;
wenzelm
parents: 69473
diff changeset
   205
2633cf136335 tuned -- more compact;
wenzelm
parents: 69473
diff changeset
   206
newtype T = Buffer [Char]
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   207
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   208
empty :: T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   209
empty = Buffer []
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   210
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   211
add :: String -> T -> T
69474
2633cf136335 tuned -- more compact;
wenzelm
parents: 69473
diff changeset
   212
add s (Buffer cs) = Buffer (fold (:) s cs)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   213
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   214
content :: T -> String
69474
2633cf136335 tuned -- more compact;
wenzelm
parents: 69473
diff changeset
   215
content (Buffer cs) = reverse cs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   216
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   217
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   218
generate_file "Isabelle/Properties.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   219
{-  Title:      Isabelle/Properties.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   220
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   221
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   222
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   223
Property lists.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   224
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   225
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/properties.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   226
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   227
69477
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   228
module Isabelle.Properties (Entry, T, defined, get, get_value, put, remove)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   229
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   230
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   231
import qualified Data.List as List
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   232
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   233
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   234
type Entry = (String, String)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   235
type T = [Entry]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   236
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   237
defined :: T -> String -> Bool
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   238
defined props name = any (\(a, _) -> a == name) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   239
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   240
get :: T -> String -> Maybe String
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   241
get props name = List.lookup name props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   242
69477
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   243
get_value :: (String -> Maybe a) -> T -> String -> Maybe a
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   244
get_value parse props name =
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   245
  case get props name of
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   246
    Nothing -> Nothing
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   247
    Just s -> parse s
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   248
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   249
put :: Entry -> T -> T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   250
put entry props = entry : remove (fst entry) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   251
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   252
remove :: String -> T -> T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   253
remove name props =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   254
  if defined props name then filter (\(a, _) -> a /= name) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   255
  else props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   256
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   257
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   258
generate_file "Isabelle/Markup.hs" = \<open>
69226
68f5dc2275ac tuned whitespace;
wenzelm
parents: 69225
diff changeset
   259
{-  Title:      Haskell/Tools/Markup.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   260
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   261
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   262
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   263
Quasi-abstract markup elements.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   264
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   265
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/markup.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   266
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   267
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   268
module Isabelle.Markup (
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   269
  T, empty, is_empty, properties,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   270
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   271
  nameN, name, xnameN, xname, kindN,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   272
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   273
  bindingN, binding, entityN, entity, defN, refN,
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   274
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   275
  completionN, completion, no_completionN, no_completion,
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   276
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   277
  lineN, end_lineN, offsetN, end_offsetN, fileN, idN, positionN, position,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   278
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   279
  expressionN, expression,
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   280
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   281
  citationN, citation,
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   282
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   283
  pathN, urlN, docN,
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   284
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   285
  markupN, consistentN, unbreakableN, indentN, widthN,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   286
  blockN, block, breakN, break, fbreakN, fbreak, itemN, item,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   287
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   288
  wordsN, words, no_wordsN, no_words,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   289
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   290
  tfreeN, tfree, tvarN, tvar, freeN, free, skolemN, skolem, boundN, bound, varN, var,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   291
  numeralN, numeral, literalN, literal, delimiterN, delimiter, inner_stringN, inner_string,
69320
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   292
  inner_cartoucheN, inner_cartouche,
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   293
  token_rangeN, token_range,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   294
  sortingN, sorting, typingN, typing, class_parameterN, class_parameter,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   295
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   296
  antiquotedN, antiquoted, antiquoteN, antiquote,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   297
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   298
  paragraphN, paragraph, text_foldN, text_fold,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   299
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   300
  keyword1N, keyword1, keyword2N, keyword2, keyword3N, keyword3, quasi_keywordN, quasi_keyword,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   301
  improperN, improper, operatorN, operator, stringN, string, alt_stringN, alt_string,
69320
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   302
  verbatimN, verbatim, cartoucheN, cartouche, commentN, comment, comment1N, comment1,
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   303
  comment2N, comment2, comment3N, comment3,
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   304
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   305
  writelnN, writeln, stateN, state, informationN, information, tracingN, tracing,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   306
  warningN, warning, legacyN, legacy, errorN, error, reportN, report, no_reportN, no_report,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   307
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   308
  intensifyN, intensify,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   309
  Output, no_output)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   310
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   311
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   312
import Prelude hiding (words, error, break)
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   313
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   314
import Isabelle.Library
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   315
import qualified Isabelle.Properties as Properties
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   316
import qualified Isabelle.Value as Value
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   317
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   318
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   319
{- basic markup -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   320
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   321
type T = (String, Properties.T)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   322
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   323
empty :: T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   324
empty = ("", [])
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   325
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   326
is_empty :: T -> Bool
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   327
is_empty ("", _) = True
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   328
is_empty _ = False
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   329
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   330
properties :: Properties.T -> T -> T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   331
properties more_props (elem, props) =
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   332
  (elem, fold_rev Properties.put more_props props)
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   333
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   334
markup_elem name = (name, (name, []) :: T)
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   335
markup_string name prop = (name, \s -> (name, [(prop, s)]) :: T)
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   336
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   337
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   338
{- misc properties -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   339
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   340
nameN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   341
nameN = \<open>Markup.nameN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   342
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   343
name :: String -> T -> T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   344
name a = properties [(nameN, a)]
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   345
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   346
xnameN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   347
xnameN = \<open>Markup.xnameN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   348
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   349
xname :: String -> T -> T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   350
xname a = properties [(xnameN, a)]
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   351
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   352
kindN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   353
kindN = \<open>Markup.kindN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   354
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   355
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   356
{- formal entities -}
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   357
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   358
bindingN :: String; binding :: T
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   359
(bindingN, binding) = markup_elem \<open>Markup.bindingN\<close>
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   360
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   361
entityN :: String; entity :: String -> String -> T
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   362
entityN = \<open>Markup.entityN\<close>
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   363
entity kind name =
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   364
  (entityN,
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   365
    (if null name then [] else [(nameN, name)]) ++ (if null kind then [] else [(kindN, kind)]))
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   366
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   367
defN :: String
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   368
defN = \<open>Markup.defN\<close>
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   369
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   370
refN :: String
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   371
refN = \<open>Markup.refN\<close>
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   372
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   373
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   374
{- completion -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   375
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   376
completionN :: String; completion :: T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   377
(completionN, completion) = markup_elem \<open>Markup.completionN\<close>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   378
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   379
no_completionN :: String; no_completion :: T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   380
(no_completionN, no_completion) = markup_elem \<open>Markup.no_completionN\<close>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   381
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   382
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   383
{- position -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   384
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   385
lineN, end_lineN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   386
lineN = \<open>Markup.lineN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   387
end_lineN = \<open>Markup.end_lineN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   388
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   389
offsetN, end_offsetN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   390
offsetN = \<open>Markup.offsetN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   391
end_offsetN = \<open>Markup.end_offsetN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   392
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   393
fileN, idN :: String
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   394
fileN = \<open>Markup.fileN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   395
idN = \<open>Markup.idN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   396
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   397
positionN :: String; position :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   398
(positionN, position) = markup_elem \<open>Markup.positionN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   399
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   400
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   401
{- expression -}
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   402
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   403
expressionN :: String
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   404
expressionN = \<open>Markup.expressionN\<close>
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   405
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   406
expression :: String -> T
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   407
expression kind = (expressionN, if kind == "" then [] else [(kindN, kind)])
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   408
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   409
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   410
{- citation -}
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   411
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   412
citationN :: String; citation :: String -> T
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   413
(citationN, citation) = markup_string \<open>Markup.citationN\<close> nameN
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   414
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   415
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   416
{- external resources -}
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   417
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   418
pathN :: String; path :: String -> T
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   419
(pathN, path) = markup_string \<open>Markup.pathN\<close> nameN
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   420
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   421
urlN :: String; url :: String -> T
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   422
(urlN, url) = markup_string \<open>Markup.urlN\<close> nameN
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   423
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   424
docN :: String; doc :: String -> T
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   425
(docN, doc) = markup_string \<open>Markup.docN\<close> nameN
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   426
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   427
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   428
{- pretty printing -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   429
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   430
markupN, consistentN, unbreakableN, indentN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   431
markupN = \<open>Markup.markupN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   432
consistentN = \<open>Markup.consistentN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   433
unbreakableN = \<open>Markup.unbreakableN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   434
indentN = \<open>Markup.indentN\<close>;
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   435
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   436
widthN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   437
widthN = \<open>Markup.widthN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   438
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   439
blockN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   440
blockN = \<open>Markup.blockN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   441
block :: Bool -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   442
block c i =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   443
  (blockN,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   444
    (if c then [(consistentN, Value.print_bool c)] else []) ++
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   445
    (if i /= 0 then [(indentN, Value.print_int i)] else []))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   446
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   447
breakN :: String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   448
breakN = \<open>Markup.breakN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   449
break :: Int -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   450
break w i =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   451
  (breakN,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   452
    (if w /= 0 then [(widthN, Value.print_int w)] else []) ++
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   453
    (if i /= 0 then [(indentN, Value.print_int i)] else []))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   454
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   455
fbreakN :: String; fbreak :: T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   456
(fbreakN, fbreak) = markup_elem \<open>Markup.fbreakN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   457
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   458
itemN :: String; item :: T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   459
(itemN, item) = markup_elem \<open>Markup.itemN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   460
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   461
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   462
{- text properties -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   463
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   464
wordsN :: String; words :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   465
(wordsN, words) = markup_elem \<open>Markup.wordsN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   466
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   467
no_wordsN :: String; no_words :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   468
(no_wordsN, no_words) = markup_elem \<open>Markup.no_wordsN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   469
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   470
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   471
{- inner syntax -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   472
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   473
tfreeN :: String; tfree :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   474
(tfreeN, tfree) = markup_elem \<open>Markup.tfreeN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   475
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   476
tvarN :: String; tvar :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   477
(tvarN, tvar) = markup_elem \<open>Markup.tvarN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   478
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   479
freeN :: String; free :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   480
(freeN, free) = markup_elem \<open>Markup.freeN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   481
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   482
skolemN :: String; skolem :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   483
(skolemN, skolem) = markup_elem \<open>Markup.skolemN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   484
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   485
boundN :: String; bound :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   486
(boundN, bound) = markup_elem \<open>Markup.boundN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   487
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   488
varN :: String; var :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   489
(varN, var) = markup_elem \<open>Markup.varN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   490
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   491
numeralN :: String; numeral :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   492
(numeralN, numeral) = markup_elem \<open>Markup.numeralN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   493
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   494
literalN :: String; literal :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   495
(literalN, literal) = markup_elem \<open>Markup.literalN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   496
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   497
delimiterN :: String; delimiter :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   498
(delimiterN, delimiter) = markup_elem \<open>Markup.delimiterN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   499
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   500
inner_stringN :: String; inner_string :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   501
(inner_stringN, inner_string) = markup_elem \<open>Markup.inner_stringN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   502
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   503
inner_cartoucheN :: String; inner_cartouche :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   504
(inner_cartoucheN, inner_cartouche) = markup_elem \<open>Markup.inner_cartoucheN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   505
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   506
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   507
token_rangeN :: String; token_range :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   508
(token_rangeN, token_range) = markup_elem \<open>Markup.token_rangeN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   509
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   510
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   511
sortingN :: String; sorting :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   512
(sortingN, sorting) = markup_elem \<open>Markup.sortingN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   513
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   514
typingN :: String; typing :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   515
(typingN, typing) = markup_elem \<open>Markup.typingN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   516
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   517
class_parameterN :: String; class_parameter :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   518
(class_parameterN, class_parameter) = markup_elem \<open>Markup.class_parameterN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   519
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   520
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   521
{- antiquotations -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   522
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   523
antiquotedN :: String; antiquoted :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   524
(antiquotedN, antiquoted) = markup_elem \<open>Markup.antiquotedN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   525
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   526
antiquoteN :: String; antiquote :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   527
(antiquoteN, antiquote) = markup_elem \<open>Markup.antiquoteN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   528
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   529
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   530
{- text structure -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   531
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   532
paragraphN :: String; paragraph :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   533
(paragraphN, paragraph) = markup_elem \<open>Markup.paragraphN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   534
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   535
text_foldN :: String; text_fold :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   536
(text_foldN, text_fold) = markup_elem \<open>Markup.text_foldN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   537
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   538
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   539
{- outer syntax -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   540
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   541
keyword1N :: String; keyword1 :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   542
(keyword1N, keyword1) = markup_elem \<open>Markup.keyword1N\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   543
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   544
keyword2N :: String; keyword2 :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   545
(keyword2N, keyword2) = markup_elem \<open>Markup.keyword2N\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   546
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   547
keyword3N :: String; keyword3 :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   548
(keyword3N, keyword3) = markup_elem \<open>Markup.keyword3N\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   549
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   550
quasi_keywordN :: String; quasi_keyword :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   551
(quasi_keywordN, quasi_keyword) = markup_elem \<open>Markup.quasi_keywordN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   552
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   553
improperN :: String; improper :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   554
(improperN, improper) = markup_elem \<open>Markup.improperN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   555
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   556
operatorN :: String; operator :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   557
(operatorN, operator) = markup_elem \<open>Markup.operatorN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   558
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   559
stringN :: String; string :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   560
(stringN, string) = markup_elem \<open>Markup.stringN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   561
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   562
alt_stringN :: String; alt_string :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   563
(alt_stringN, alt_string) = markup_elem \<open>Markup.alt_stringN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   564
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   565
verbatimN :: String; verbatim :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   566
(verbatimN, verbatim) = markup_elem \<open>Markup.verbatimN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   567
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   568
cartoucheN :: String; cartouche :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   569
(cartoucheN, cartouche) = markup_elem \<open>Markup.cartoucheN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   570
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   571
commentN :: String; comment :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   572
(commentN, comment) = markup_elem \<open>Markup.commentN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   573
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   574
69320
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   575
{- comments -}
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   576
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   577
comment1N :: String; comment1 :: T
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   578
(comment1N, comment1) = markup_elem \<open>Markup.comment1N\<close>
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   579
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   580
comment2N :: String; comment2 :: T
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   581
(comment2N, comment2) = markup_elem \<open>Markup.comment2N\<close>
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   582
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   583
comment3N :: String; comment3 :: T
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   584
(comment3N, comment3) = markup_elem \<open>Markup.comment3N\<close>
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   585
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   586
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   587
{- messages -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   588
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   589
writelnN :: String; writeln :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   590
(writelnN, writeln) = markup_elem \<open>Markup.writelnN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   591
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   592
stateN :: String; state :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   593
(stateN, state) = markup_elem \<open>Markup.stateN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   594
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   595
informationN :: String; information :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   596
(informationN, information) = markup_elem \<open>Markup.informationN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   597
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   598
tracingN :: String; tracing :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   599
(tracingN, tracing) = markup_elem \<open>Markup.tracingN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   600
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   601
warningN :: String; warning :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   602
(warningN, warning) = markup_elem \<open>Markup.warningN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   603
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   604
legacyN :: String; legacy :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   605
(legacyN, legacy) = markup_elem \<open>Markup.legacyN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   606
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   607
errorN :: String; error :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   608
(errorN, error) = markup_elem \<open>Markup.errorN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   609
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   610
reportN :: String; report :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   611
(reportN, report) = markup_elem \<open>Markup.reportN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   612
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   613
no_reportN :: String; no_report :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   614
(no_reportN, no_report) = markup_elem \<open>Markup.no_reportN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   615
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   616
intensifyN :: String; intensify :: T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   617
(intensifyN, intensify) = markup_elem \<open>Markup.intensifyN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   618
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   619
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   620
{- output -}
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   621
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   622
type Output = (String, String)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   623
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   624
no_output :: Output
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   625
no_output = ("", "")
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
   626
\<close>
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
   627
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   628
generate_file "Isabelle/Completion.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   629
{-  Title:      Isabelle/Completion.hs
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   630
    Author:     Makarius
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   631
    LICENSE:    BSD 3-clause (Isabelle)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   632
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   633
Completion of names.
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   634
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   635
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/completion.ML\<close>.
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   636
-}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   637
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   638
module Isabelle.Completion (
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   639
    Name, T, names, none, make, markup_element, markup_report, make_report
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   640
  ) where
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   641
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   642
import qualified Data.List as List
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   643
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   644
import Isabelle.Library
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   645
import qualified Isabelle.Properties as Properties
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   646
import qualified Isabelle.Markup as Markup
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   647
import qualified Isabelle.XML.Encode as Encode
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   648
import qualified Isabelle.XML as XML
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   649
import qualified Isabelle.YXML as YXML
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   650
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   651
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   652
type Name = (String, (String, String))  -- external name, kind, internal name
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   653
data T = Completion Properties.T Int [Name]  -- position, total length, names
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   654
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   655
names :: Int -> Properties.T -> [Name] -> T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   656
names limit props names = Completion props (length names) (take limit names)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   657
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   658
none :: T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   659
none = names 0 [] []
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   660
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   661
make :: Int -> (String, Properties.T) -> ((String -> Bool) -> [Name]) -> T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   662
make limit (name, props) make_names =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   663
  if name /= "" && name /= "_"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   664
  then names limit props (make_names $ List.isPrefixOf $ clean_name name)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   665
  else none
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   666
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   667
markup_element :: T -> (Markup.T, XML.Body)
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   668
markup_element (Completion props total names) =
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   669
  if not (null names) then
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   670
    let
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   671
      markup = Markup.properties props Markup.completion
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   672
      body =
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   673
        Encode.pair Encode.int
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   674
          (Encode.list (Encode.pair Encode.string (Encode.pair Encode.string Encode.string)))
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   675
          (total, names)
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   676
    in (markup, body)
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   677
  else (Markup.empty, [])
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   678
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   679
markup_report :: [T] -> String
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   680
markup_report [] = ""
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   681
markup_report elems =
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   682
  YXML.string_of $ XML.Elem (Markup.report, map (XML.Elem . markup_element) elems)
69289
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   683
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   684
make_report :: Int -> (String, Properties.T) -> ((String -> Bool) -> [Name]) -> String
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   685
make_report limit name_props make_names =
bf6937af7fe8 clarified signature;
wenzelm
parents: 69288
diff changeset
   686
  markup_report [make limit name_props make_names]
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   687
\<close>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   688
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   689
generate_file "Isabelle/File.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   690
{-  Title:      Isabelle/File.hs
69278
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   691
    Author:     Makarius
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   692
    LICENSE:    BSD 3-clause (Isabelle)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   693
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   694
File-system operations.
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   695
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   696
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/file.ML\<close>.
69278
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   697
-}
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   698
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   699
module Isabelle.File (setup, read, write, append) where
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   700
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   701
import Prelude hiding (read)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   702
import System.IO (IO)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   703
import qualified System.IO as IO
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   704
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   705
setup :: IO.Handle -> IO ()
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   706
setup h = do
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   707
  IO.hSetEncoding h IO.utf8
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   708
  IO.hSetNewlineMode h IO.noNewlineTranslation
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   709
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   710
read :: IO.FilePath -> IO String
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   711
read path =
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   712
  IO.withFile path IO.ReadMode (\h ->
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   713
    do setup h; IO.hGetContents h >>= \s -> length s `seq` return s)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   714
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   715
write :: IO.FilePath -> String -> IO ()
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   716
write path s =
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   717
  IO.withFile path IO.WriteMode (\h -> do setup h; IO.hPutStr h s)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   718
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   719
append :: IO.FilePath -> String -> IO ()
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   720
append path s =
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   721
  IO.withFile path IO.AppendMode (\h -> do setup h; IO.hPutStr h s)
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   722
\<close>
30f6e8d2cd96 more Haskell operations;
wenzelm
parents: 69248
diff changeset
   723
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   724
generate_file "Isabelle/XML.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   725
{-  Title:      Isabelle/XML.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   726
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   727
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   728
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   729
Untyped XML trees and representation of ML values.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   730
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   731
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   732
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   733
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   734
module Isabelle.XML (Attributes, Body, Tree(..), wrap_elem, unwrap_elem, content_of)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   735
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   736
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   737
import qualified Data.List as List
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   738
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   739
import Isabelle.Library
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   740
import qualified Isabelle.Properties as Properties
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   741
import qualified Isabelle.Markup as Markup
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   742
import qualified Isabelle.Buffer as Buffer
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   743
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   744
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   745
{- types -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   746
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   747
type Attributes = Properties.T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   748
type Body = [Tree]
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   749
data Tree = Elem (Markup.T, Body) | Text String
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   750
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   751
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   752
{- wrapped elements -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   753
69236
wenzelm
parents: 69234
diff changeset
   754
wrap_elem (((a, atts), body1), body2) =
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   755
  Elem ((\<open>XML.xml_elemN\<close>, (\<open>XML.xml_nameN\<close>, a) : atts), Elem ((\<open>XML.xml_bodyN\<close>, []), body1) : body2)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   756
69236
wenzelm
parents: 69234
diff changeset
   757
unwrap_elem
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   758
  (Elem ((\<open>XML.xml_elemN\<close>, (\<open>XML.xml_nameN\<close>, a) : atts), Elem ((\<open>XML.xml_bodyN\<close>, []), body1) : body2)) =
69236
wenzelm
parents: 69234
diff changeset
   759
  Just (((a, atts), body1), body2)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   760
unwrap_elem _ = Nothing
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   761
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   762
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   763
{- text content -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   764
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   765
add_content tree =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   766
  case unwrap_elem tree of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   767
    Just (_, ts) -> fold add_content ts
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   768
    Nothing ->
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   769
      case tree of
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   770
        Elem (_, ts) -> fold add_content ts
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   771
        Text s -> Buffer.add s
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   772
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   773
content_of body = Buffer.empty |> fold add_content body |> Buffer.content
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   774
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   775
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   776
{- string representation -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   777
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   778
encode '<' = "&lt;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   779
encode '>' = "&gt;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   780
encode '&' = "&amp;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   781
encode '\'' = "&apos;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   782
encode '\"' = "&quot;"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   783
encode c = [c]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   784
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   785
instance Show Tree where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   786
  show tree =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   787
    Buffer.empty |> show_tree tree |> Buffer.content
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   788
    where
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   789
      show_tree (Elem ((name, atts), [])) =
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   790
        Buffer.add "<" #> Buffer.add (show_elem name atts) #> Buffer.add "/>"
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   791
      show_tree (Elem ((name, atts), ts)) =
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   792
        Buffer.add "<" #> Buffer.add (show_elem name atts) #> Buffer.add ">" #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   793
        fold show_tree ts #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   794
        Buffer.add "</" #> Buffer.add name #> Buffer.add ">"
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   795
      show_tree (Text s) = Buffer.add (show_text s)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   796
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   797
      show_elem name atts =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   798
        unwords (name : map (\(a, x) -> a ++ "=\"" ++ show_text x ++ "\"") atts)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   799
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   800
      show_text = concatMap encode
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   801
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   802
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   803
generate_file "Isabelle/XML/Encode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   804
{-  Title:      Isabelle/XML/Encode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   805
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   806
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   807
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   808
XML as data representation language.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   809
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   810
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   811
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   812
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   813
module Isabelle.XML.Encode (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   814
  A, T, V,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   815
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   816
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   817
69287
0fde0dca6744 proper export;
wenzelm
parents: 69280
diff changeset
   818
  tree, properties, string, int, bool, unit, pair, triple, list, variant
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   819
)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   820
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   821
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   822
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   823
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   824
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   825
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   826
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   827
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   828
type A a = a -> String
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   829
type T a = a -> XML.Body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   830
type V a = a -> Maybe ([String], XML.Body)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   831
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   832
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   833
-- atomic values
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   834
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   835
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   836
int_atom = Value.print_int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   837
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   838
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   839
bool_atom False = "0"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   840
bool_atom True = "1"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   841
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   842
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   843
unit_atom () = ""
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   844
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   845
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   846
-- structural nodes
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   847
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   848
node ts = XML.Elem ((":", []), ts)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   849
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   850
vector = map_index (\(i, x) -> (int_atom i, x))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   851
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   852
tagged (tag, (xs, ts)) = XML.Elem ((int_atom tag, vector xs), ts)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   853
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   854
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   855
-- representation of standard types
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   856
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   857
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   858
tree t = [t]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   859
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   860
properties :: T Properties.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   861
properties props = [XML.Elem ((":", props), [])]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   862
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   863
string :: T String
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   864
string "" = []
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   865
string s = [XML.Text s]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   866
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   867
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   868
int = string . int_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   869
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   870
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   871
bool = string . bool_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   872
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   873
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   874
unit = string . unit_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   875
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   876
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   877
pair f g (x, y) = [node (f x), node (g y)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   878
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   879
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   880
triple f g h (x, y, z) = [node (f x), node (g y), node (h z)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   881
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   882
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   883
list f xs = map (node . f) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   884
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   885
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   886
variant fs x = [tagged (the (get_index (\f -> f x) fs))]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   887
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   888
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   889
generate_file "Isabelle/XML/Decode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   890
{-  Title:      Isabelle/XML/Decode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   891
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   892
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   893
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   894
XML as data representation language.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   895
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   896
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   897
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   898
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   899
module Isabelle.XML.Decode (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   900
  A, T, V,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   901
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   902
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   903
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   904
  tree, properties, string, init, bool, unit, pair, triple, list, variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   905
)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   906
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   907
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   908
import Data.List ((!!))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   909
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   910
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   911
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   912
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   913
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   914
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   915
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   916
type A a = String -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   917
type T a = XML.Body -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   918
type V a = ([String], XML.Body) -> a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   919
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   920
err_atom = error "Malformed XML atom"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   921
err_body = error "Malformed XML body"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   922
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   923
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   924
{- atomic values -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   925
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   926
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   927
int_atom s =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   928
  case Value.parse_int s of
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   929
    Just i -> i
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   930
    Nothing -> err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   931
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   932
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   933
bool_atom "0" = False
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   934
bool_atom "1" = True
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   935
bool_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   936
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   937
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   938
unit_atom "" = ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   939
unit_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   940
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   941
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   942
{- structural nodes -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   943
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   944
node (XML.Elem ((":", []), ts)) = ts
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   945
node _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   946
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   947
vector atts =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   948
  map_index (\(i, (a, x)) -> if int_atom a == i then x else err_atom) atts
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   949
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   950
tagged (XML.Elem ((name, atts), ts)) = (int_atom name, (vector atts, ts))
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   951
tagged _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   952
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   953
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   954
{- representation of standard types -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   955
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   956
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   957
tree [t] = t
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   958
tree _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   959
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   960
properties :: T Properties.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
   961
properties [XML.Elem ((":", props), [])] = props
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   962
properties _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   963
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   964
string :: T String
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   965
string [] = ""
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   966
string [XML.Text s] = s
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   967
string _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   968
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   969
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   970
int = int_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   971
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   972
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   973
bool = bool_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   974
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   975
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   976
unit = unit_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   977
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   978
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   979
pair f g [t1, t2] = (f (node t1), g (node t2))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   980
pair _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   981
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   982
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   983
triple f g h [t1, t2, t3] = (f (node t1), g (node t2), h (node t3))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   984
triple _ _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   985
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   986
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   987
list f ts = map (f . node) ts
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   988
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   989
option :: T a -> T (Maybe a)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   990
option _ [] = Nothing
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   991
option f [t] = Just (f (node t))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   992
option _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   993
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   994
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   995
variant fs [t] = (fs !! tag) (xs, ts)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   996
  where (tag, (xs, ts)) = tagged t
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   997
variant _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   998
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   999
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1000
generate_file "Isabelle/YXML.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1001
{-  Title:      Isabelle/YXML.hs
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1002
    Author:     Makarius
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1003
    LICENSE:    BSD 3-clause (Isabelle)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1004
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1005
Efficient text representation of XML trees.  Suitable for direct
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1006
inlining into plain text.
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1007
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1008
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/yxml.ML\<close>.
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1009
-}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1010
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1011
module Isabelle.YXML (charX, charY, strX, strY, detect, output_markup,
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1012
  buffer_body, buffer, string_of_body, string_of, parse_body, parse)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1013
where
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1014
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1015
import qualified Data.Char as Char
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1016
import qualified Data.List as List
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1017
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1018
import Isabelle.Library
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1019
import qualified Isabelle.Markup as Markup
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1020
import qualified Isabelle.XML as XML
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1021
import qualified Isabelle.Buffer as Buffer
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1022
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1023
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1024
{- markers -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1025
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1026
charX, charY :: Char
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1027
charX = Char.chr 5
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1028
charY = Char.chr 6
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1029
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1030
strX, strY, strXY, strXYX :: String
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1031
strX = [charX]
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1032
strY = [charY]
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1033
strXY = strX ++ strY
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1034
strXYX = strXY ++ strX
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1035
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1036
detect :: String -> Bool
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1037
detect = any (\c -> c == charX || c == charY)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1038
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1039
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1040
{- output -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1041
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1042
output_markup :: Markup.T -> Markup.Output
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1043
output_markup markup@(name, atts) =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1044
  if Markup.is_empty markup then Markup.no_output
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1045
  else (strXY ++ name ++ concatMap (\(a, x) -> strY ++ a ++ "=" ++ x) atts ++ strX, strXYX)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1046
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1047
buffer_attrib (a, x) =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1048
  Buffer.add strY #> Buffer.add a #> Buffer.add "=" #> Buffer.add x
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1049
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1050
buffer_body :: XML.Body -> Buffer.T -> Buffer.T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1051
buffer_body = fold buffer
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1052
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1053
buffer :: XML.Tree -> Buffer.T -> Buffer.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1054
buffer (XML.Elem ((name, atts), ts)) =
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1055
  Buffer.add strXY #> Buffer.add name #> fold buffer_attrib atts #> Buffer.add strX #>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1056
  buffer_body ts #>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1057
  Buffer.add strXYX
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1058
buffer (XML.Text s) = Buffer.add s
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1059
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1060
string_of_body :: XML.Body -> String
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1061
string_of_body body = Buffer.empty |> buffer_body body |> Buffer.content
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1062
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1063
string_of :: XML.Tree -> String
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1064
string_of = string_of_body . single
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1065
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1066
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1067
{- parse -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1068
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1069
-- split: fields or non-empty tokens
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1070
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1071
split :: Bool -> Char -> String -> [String]
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1072
split _ _ [] = []
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1073
split fields sep str = splitting str
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1074
  where
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1075
    splitting rest =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1076
      case span (/= sep) rest of
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1077
        (_, []) -> cons rest []
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1078
        (prfx, _ : rest') -> cons prfx (splitting rest')
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1079
    cons item = if fields || not (null item) then (:) item else id
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1080
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1081
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1082
-- structural errors
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1083
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1084
err msg = error ("Malformed YXML: " ++ msg)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1085
err_attribute = err "bad attribute"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1086
err_element = err "bad element"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1087
err_unbalanced "" = err "unbalanced element"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1088
err_unbalanced name = err ("unbalanced element " ++ quote name)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1089
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1090
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1091
-- stack operations
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1092
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1093
add x ((elem, body) : pending) = (elem, x : body) : pending
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1094
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1095
push "" _ _ = err_element
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1096
push name atts pending = ((name, atts), []) : pending
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1097
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1098
pop ((("", _), _) : _) = err_unbalanced ""
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1099
pop ((markup, body) : pending) = add (XML.Elem (markup, reverse body)) pending
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1100
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1101
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1102
-- parsing
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1103
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1104
parse_attrib s =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1105
  case List.elemIndex '=' s of
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1106
    Just i | i > 0 -> (take i s, drop (i + 1) s)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1107
    _ -> err_attribute
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1108
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1109
parse_chunk ["", ""] = pop
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1110
parse_chunk ("" : name : atts) = push name (map parse_attrib atts)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1111
parse_chunk txts = fold (add . XML.Text) txts
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1112
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1113
parse_body :: String -> XML.Body
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1114
parse_body source =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1115
  case fold parse_chunk chunks [(("", []), [])] of
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1116
    [(("", _), result)] -> reverse result
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1117
    ((name, _), _) : _ -> err_unbalanced name
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1118
  where chunks = split False charX source |> map (split True charY)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1119
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1120
parse :: String -> XML.Tree
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1121
parse source =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1122
  case parse_body source of
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1123
    [result] -> result
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1124
    [] -> XML.Text ""
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1125
    _ -> err "multiple results"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1126
\<close>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1127
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1128
generate_file "Isabelle/Pretty.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1129
{-  Title:      Isabelle/Pretty.hs
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1130
    Author:     Makarius
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1131
    LICENSE:    BSD 3-clause (Isabelle)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1132
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1133
Generic pretty printing module.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1134
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1135
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/General/pretty.ML\<close>.
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1136
-}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1137
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1138
module Isabelle.Pretty (
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1139
  T, symbolic, formatted, unformatted,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1140
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1141
  str, brk_indent, brk, fbrk, breaks, fbreaks, blk, block, strs, markup, mark, mark_str, marks_str,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1142
  item, text_fold, keyword1, keyword2, text, paragraph, para, quote, cartouche, separate,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1143
  commas, enclose, enum, list, str_list, big_list)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1144
where
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1145
69453
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
  1146
import Isabelle.Library hiding (quote, commas)
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1147
import qualified Data.List as List
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1148
import qualified Isabelle.Buffer as Buffer
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1149
import qualified Isabelle.Markup as Markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1150
import qualified Isabelle.XML as XML
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1151
import qualified Isabelle.YXML as YXML
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1152
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1153
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1154
data T =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1155
    Block Markup.T Bool Int [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1156
  | Break Int Int
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1157
  | Str String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1158
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1159
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1160
{- output -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1161
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1162
output_spaces n = replicate n ' '
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1163
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1164
symbolic_text "" = []
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1165
symbolic_text s = [XML.Text s]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1166
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1167
symbolic_markup markup body =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1168
  if Markup.is_empty markup then body
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1169
  else [XML.Elem (markup, body)]
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1170
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1171
symbolic :: T -> XML.Body
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1172
symbolic (Block markup consistent indent prts) =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1173
  concatMap symbolic prts
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1174
  |> symbolic_markup block_markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1175
  |> symbolic_markup markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1176
  where block_markup = if null prts then Markup.empty else Markup.block consistent indent
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1177
symbolic (Break wd ind) = [XML.Elem (Markup.break wd ind, symbolic_text (output_spaces wd))]
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1178
symbolic (Str s) = symbolic_text s
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1179
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1180
formatted :: T -> String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1181
formatted = YXML.string_of_body . symbolic
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1182
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1183
unformatted :: T -> String
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1184
unformatted prt = Buffer.empty |> out prt |> Buffer.content
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1185
  where
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1186
    out (Block markup _ _ prts) =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1187
      let (bg, en) = YXML.output_markup markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1188
      in Buffer.add bg #> fold out prts #> Buffer.add en
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1189
    out (Break _ wd) = Buffer.add (output_spaces wd)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1190
    out (Str s) = Buffer.add s
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1191
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1192
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1193
{- derived operations to create formatting expressions -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1194
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1195
force_nat n | n < 0 = 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1196
force_nat n = n
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1197
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1198
str :: String -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1199
str = Str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1200
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1201
brk_indent :: Int -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1202
brk_indent wd ind = Break (force_nat wd) ind
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1203
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1204
brk :: Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1205
brk wd = brk_indent wd 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1206
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1207
fbrk :: T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1208
fbrk = str "\n"
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1209
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1210
breaks, fbreaks :: [T] -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1211
breaks = List.intersperse (brk 1)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1212
fbreaks = List.intersperse fbrk
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1213
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1214
blk :: (Int, [T]) -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1215
blk (indent, es) = Block Markup.empty False (force_nat indent) es
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1216
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1217
block :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1218
block prts = blk (2, prts)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1219
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1220
strs :: [String] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1221
strs = block . breaks . map str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1222
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1223
markup :: Markup.T -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1224
markup m = Block m False 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1225
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1226
mark :: Markup.T -> T -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1227
mark m prt = if m == Markup.empty then prt else markup m [prt]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1228
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1229
mark_str :: (Markup.T, String) -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1230
mark_str (m, s) = mark m (str s)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1231
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1232
marks_str :: ([Markup.T], String) -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1233
marks_str (ms, s) = fold_rev mark ms (str s)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1234
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1235
item :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1236
item = markup Markup.item
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1237
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1238
text_fold :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1239
text_fold = markup Markup.text_fold
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1240
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1241
keyword1, keyword2 :: String -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1242
keyword1 name = mark_str (Markup.keyword1, name)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1243
keyword2 name = mark_str (Markup.keyword2, name)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1244
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1245
text :: String -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1246
text = breaks . map str . words
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1247
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1248
paragraph :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1249
paragraph = markup Markup.paragraph
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1250
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1251
para :: String -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1252
para = paragraph . text
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1253
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1254
quote :: T -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1255
quote prt = blk (1, [str "\"", prt, str "\""])
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1256
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1257
cartouche :: T -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1258
cartouche prt = blk (1, [str "\92<open>", prt, str "\92<close>"])
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1259
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1260
separate :: String -> [T] -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1261
separate sep = List.intercalate [str sep, brk 1] . map single
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1262
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1263
commas :: [T] -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1264
commas = separate ","
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1265
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1266
enclose :: String -> String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1267
enclose lpar rpar prts = block (str lpar : prts ++ [str rpar])
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1268
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1269
enum :: String -> String -> String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1270
enum sep lpar rpar = enclose lpar rpar . separate sep
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1271
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1272
list :: String -> String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1273
list = enum ","
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1274
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1275
str_list :: String -> String -> [String] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1276
str_list lpar rpar = list lpar rpar . map str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1277
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1278
big_list :: String -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1279
big_list name prts = block (fbreaks (str name : prts))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1280
\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  1281
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1282
generate_file "Isabelle/Term.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1283
{-  Title:      Isabelle/Term.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1284
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1285
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1286
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1287
Lambda terms, types, sorts.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1288
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1289
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/term.scala\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1290
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1291
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1292
module Isabelle.Term (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1293
  Indexname,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1294
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1295
  Sort, dummyS,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1296
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1297
  Typ(..), dummyT, Term(..))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1298
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1299
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1300
type Indexname = (String, Int)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1301
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1302
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1303
type Sort = [String]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1304
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1305
dummyS :: Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1306
dummyS = [""]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1307
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1308
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1309
data Typ =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1310
    Type (String, [Typ])
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1311
  | TFree (String, Sort)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1312
  | TVar (Indexname, Sort)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1313
  deriving Show
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1314
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1315
dummyT :: Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1316
dummyT = Type (\<open>\<^type_name>\<open>dummy\<close>\<close>, [])
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1317
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1318
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1319
data Term =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1320
    Const (String, Typ)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1321
  | Free (String, Typ)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1322
  | Var (Indexname, Typ)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1323
  | Bound Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1324
  | Abs (String, Typ, Term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1325
  | App (Term, Term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1326
  deriving Show
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1327
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1328
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1329
generate_file "Isabelle/Term_XML/Encode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1330
{-  Title:      Isabelle/Term_XML/Encode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1331
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1332
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1333
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1334
XML data representation of lambda terms.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1335
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1336
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/term_xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1337
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1338
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1339
{-# LANGUAGE LambdaCase #-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1340
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1341
module Isabelle.Term_XML.Encode (sort, typ, term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1342
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1343
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1344
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1345
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1346
import Isabelle.XML.Encode
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1347
import Isabelle.Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1348
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1349
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1350
sort :: T Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1351
sort = list string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1352
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1353
typ :: T Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1354
typ ty =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1355
  ty |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1356
   [\case { Type (a, b) -> Just ([a], list typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1357
    \case { TFree (a, b) -> Just ([a], sort b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1358
    \case { TVar ((a, b), c) -> Just ([a, int_atom b], sort c); _ -> Nothing }]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1359
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1360
term :: T Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1361
term t =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1362
  t |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1363
   [\case { Const (a, b) -> Just ([a], typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1364
    \case { Free (a, b) -> Just ([a], typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1365
    \case { Var ((a, b), c) -> Just ([a, int_atom b], typ c); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1366
    \case { Bound a -> Just ([int_atom a], []); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1367
    \case { Abs (a, b, c) -> Just ([a], pair typ term (b, c)); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1368
    \case { App a -> Just ([], pair term term a); _ -> Nothing }]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1369
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1370
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1371
generate_file "Isabelle/Term_XML/Decode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1372
{-  Title:      Isabelle/Term_XML/Decode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1373
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1374
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1375
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1376
XML data representation of lambda terms.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1377
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1378
See also \<^file>\<open>$ISABELLE_HOME/src/Pure/term_xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1379
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1380
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1381
module Isabelle.Term_XML.Decode (sort, typ, term)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1382
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1383
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1384
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1385
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1386
import Isabelle.XML.Decode
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1387
import Isabelle.Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1388
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1389
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1390
sort :: T Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1391
sort = list string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1392
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1393
typ :: T Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1394
typ ty =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1395
  ty |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1396
  [\([a], b) -> Type (a, list typ b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1397
   \([a], b) -> TFree (a, sort b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1398
   \([a, b], c) -> TVar ((a, int_atom b), sort c)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1399
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1400
term :: T Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1401
term t =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1402
  t |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1403
   [\([a], b) -> Const (a, typ b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1404
    \([a], b) -> Free (a, typ b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1405
    \([a, b], c) -> Var ((a, int_atom b), typ c),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1406
    \([a], []) -> Bound (int_atom a),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1407
    \([a], b) -> let (c, d) = pair typ term b in Abs (a, c, d),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1408
    \([], a) -> App (pair term term a)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1409
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1410
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1411
generate_file "Isabelle/UUID.hs" = \<open>
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1412
{-  Title:      Isabelle/UUID.hs
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1413
    Author:     Makarius
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1414
    LICENSE:    BSD 3-clause (Isabelle)
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1415
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1416
Universally unique identifiers.
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1417
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1418
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/uuid.scala\<close>.
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1419
-}
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1420
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1421
module Isabelle.UUID (
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1422
    T,
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1423
    parse_string, parse_bytes,
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1424
    string, bytes,
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1425
    random, random_string, random_bytes
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1426
  )
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1427
where
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1428
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1429
import Data.ByteString (ByteString)
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1430
import qualified Data.ByteString
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1431
import Data.UUID (UUID)
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1432
import qualified Data.UUID as UUID
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1433
import Data.UUID.V4 (nextRandom)
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1434
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1435
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1436
type T = UUID
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1437
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1438
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1439
{- parse -}
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1440
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1441
parse_string :: String -> Maybe T
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1442
parse_string = UUID.fromString
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1443
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1444
parse_bytes :: ByteString -> Maybe T
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1445
parse_bytes = UUID.fromASCIIBytes
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1446
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1447
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1448
{- print -}
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1449
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1450
string :: T -> String
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1451
string = UUID.toString
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1452
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1453
bytes :: T -> ByteString
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1454
bytes = UUID.toASCIIBytes
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1455
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1456
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1457
{- random id -}
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1458
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1459
random :: IO T
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1460
random = nextRandom
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1461
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1462
random_string :: IO String
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1463
random_string = string <$> random
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1464
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1465
random_bytes :: IO ByteString
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1466
random_bytes = bytes <$> random
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1467
\<close>
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  1468
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1469
generate_file "Isabelle/Byte_Message.hs" = \<open>
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1470
{-  Title:      Isabelle/Byte_Message.hs
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1471
    Author:     Makarius
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1472
    LICENSE:    BSD 3-clause (Isabelle)
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1473
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1474
Byte-oriented messages.
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1475
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1476
See \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/byte_message.ML\<close>
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1477
and \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/byte_message.scala\<close>.
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1478
-}
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1479
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1480
module Isabelle.Byte_Message (
69467
e8893c893241 tuned signature;
wenzelm
parents: 69466
diff changeset
  1481
    write, write_line,
e8893c893241 tuned signature;
wenzelm
parents: 69466
diff changeset
  1482
    read, read_block, trim_line, read_line,
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1483
    make_message, write_message, read_message,
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1484
    make_line_message, write_line_message, read_line_message
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1485
  )
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1486
where
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1487
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1488
import Prelude hiding (read)
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1489
import Data.Maybe
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1490
import Data.ByteString (ByteString)
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1491
import qualified Data.ByteString as ByteString
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1492
import qualified Data.ByteString.UTF8 as UTF8
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1493
import Data.Word (Word8)
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1494
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1495
import Control.Monad (when)
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1496
import Network.Socket (Socket)
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1497
import qualified Network.Socket as Socket
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1498
import qualified Network.Socket.ByteString as ByteString
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1499
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1500
import Isabelle.Library hiding (trim_line)
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1501
import qualified Isabelle.Value as Value
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1502
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1503
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1504
{- output operations -}
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1505
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1506
write :: Socket -> [ByteString] -> IO ()
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1507
write = ByteString.sendMany
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1508
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1509
newline :: ByteString
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1510
newline = ByteString.singleton 10
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1511
69467
e8893c893241 tuned signature;
wenzelm
parents: 69466
diff changeset
  1512
write_line :: Socket -> ByteString -> IO ()
e8893c893241 tuned signature;
wenzelm
parents: 69466
diff changeset
  1513
write_line socket s = write socket [s, newline]
e8893c893241 tuned signature;
wenzelm
parents: 69466
diff changeset
  1514
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1515
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1516
{- input operations -}
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1517
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1518
read :: Socket -> Int -> IO ByteString
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1519
read socket n = read_body 0 []
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1520
  where
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1521
    result = ByteString.concat . reverse
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1522
    read_body len ss =
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1523
      if len >= n then return (result ss)
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1524
      else
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1525
        (do
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1526
          s <- ByteString.recv socket (min (n - len) 8192)
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1527
          case ByteString.length s of
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1528
            0 -> return (result ss)
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1529
            m -> read_body (len + m) (s : ss))
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1530
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1531
read_block :: Socket -> Int -> IO (Maybe ByteString, Int)
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1532
read_block socket n = do
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1533
  msg <- read socket n
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1534
  let len = ByteString.length msg
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1535
  return (if len == n then Just msg else Nothing, len)
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1536
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1537
trim_line :: ByteString -> ByteString
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1538
trim_line s =
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1539
  if n >= 2 && at (n - 2) == 13 && at (n - 1) == 10 then ByteString.take (n - 2) s
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1540
  else if n >= 1 && (at (n - 1) == 13 || at (n - 1) == 10) then ByteString.take (n - 1) s
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1541
  else s
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1542
  where
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1543
    n = ByteString.length s
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1544
    at = ByteString.index s
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  1545
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1546
read_line :: Socket -> IO (Maybe ByteString)
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1547
read_line socket = read_body []
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1548
  where
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1549
    result = trim_line . ByteString.pack . reverse
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1550
    read_body bs = do
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1551
      s <- ByteString.recv socket 1
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1552
      case ByteString.length s of
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1553
        0 -> return (if null bs then Nothing else Just (result bs))
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1554
        1 ->
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1555
          case ByteString.head s of
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1556
            10 -> return (Just (result bs))
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1557
            b -> read_body (b : bs)
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1558
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1559
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1560
{- messages with multiple chunks (arbitrary content) -}
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1561
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1562
make_header :: [Int] -> [ByteString]
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1563
make_header ns =
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1564
  [UTF8.fromString (space_implode "," (map Value.print_int ns)), newline]
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1565
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1566
make_message :: [ByteString] -> [ByteString]
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1567
make_message chunks = make_header (map ByteString.length chunks) ++ chunks
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1568
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1569
write_message :: Socket -> [ByteString] -> IO ()
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1570
write_message socket = write socket . make_message
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1571
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1572
parse_header :: ByteString -> [Int]
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1573
parse_header line =
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1574
  let
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1575
    res = map Value.parse_nat (space_explode ',' (UTF8.toString line))
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1576
  in
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1577
    if all isJust res then map fromJust res
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1578
    else error ("Malformed message header: " ++ quote (UTF8.toString line))
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1579
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1580
read_chunk :: Socket -> Int -> IO ByteString
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1581
read_chunk socket n = do
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1582
  res <- read_block socket n
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1583
  return $
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1584
    case res of
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1585
      (Just chunk, _) -> chunk
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1586
      (Nothing, len) ->
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1587
        error ("Malformed message chunk: unexpected EOF after " ++
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1588
          show len ++ " of " ++ show n ++ " bytes")
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1589
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1590
read_message :: Socket -> IO (Maybe [ByteString])
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1591
read_message socket = do
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1592
  res <- read_line socket
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1593
  case res of
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1594
    Just line -> Just <$> mapM (read_chunk socket) (parse_header line)
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1595
    Nothing -> return Nothing
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1596
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  1597
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1598
-- hybrid messages: line or length+block (with content restriction)
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1599
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1600
is_length :: ByteString -> Bool
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1601
is_length msg =
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1602
  not (ByteString.null msg) && ByteString.all (\b -> 48 <= b && b <= 57) msg
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1603
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1604
is_terminated :: ByteString -> Bool
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1605
is_terminated msg =
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1606
  not (ByteString.null msg) && (ByteString.last msg == 13 || ByteString.last msg == 10)
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1607
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1608
make_line_message :: ByteString -> [ByteString]
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1609
make_line_message msg =
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1610
  let n = ByteString.length msg in
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1611
    if is_length msg || is_terminated msg then
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1612
      error ("Bad content for line message:\n" ++ take 100 (UTF8.toString msg))
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1613
    else
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1614
      (if n > 100 || ByteString.any (== 10) msg then make_header [n + 1] else []) ++
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1615
      [msg, newline]
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1616
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1617
write_line_message :: Socket -> ByteString -> IO ()
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  1618
write_line_message socket = write socket . make_line_message
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1619
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1620
read_line_message :: Socket -> IO (Maybe ByteString)
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  1621
read_line_message socket = do
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1622
  opt_line <- read_line socket
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1623
  case opt_line of
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1624
    Nothing -> return Nothing
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1625
    Just line ->
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1626
      case Value.parse_nat (UTF8.toString line) of
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1627
        Nothing -> return $ Just line
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  1628
        Just n -> fmap trim_line . fst <$> read_block socket n
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1629
\<close>
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  1630
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1631
generate_file "Isabelle/Standard_Thread.hs" = \<open>
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1632
{-  Title:      Isabelle/Standard_Thread.hs
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1633
    Author:     Makarius
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1634
    LICENSE:    BSD 3-clause (Isabelle)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1635
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1636
Standard thread operations.
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1637
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1638
See \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/standard_thread.ML\<close>
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1639
and \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/standard_thread.scala\<close>.
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1640
-}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1641
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1642
{-# LANGUAGE NamedFieldPuns #-}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1643
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1644
module Isabelle.Standard_Thread (
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1645
  ThreadId, Result,
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1646
  properties, change_properties,
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1647
  stop, is_stopped,
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1648
  fork_finally, fork)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1649
where
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1650
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1651
import Data.Maybe
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1652
import Data.IORef
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1653
import System.IO.Unsafe
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1654
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1655
import Data.Map.Strict (Map)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1656
import qualified Data.Map.Strict as Map
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1657
import Control.Exception.Base (SomeException)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1658
import Control.Exception as Exception
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1659
import Control.Concurrent (ThreadId)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1660
import qualified Control.Concurrent as Concurrent
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1661
import Control.Concurrent.Thread (Result)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1662
import qualified Control.Concurrent.Thread as Thread
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1663
import qualified Isabelle.Properties as Properties
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1664
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1665
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1666
{- thread info -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1667
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1668
data Info = Info {props :: Properties.T, stopped :: Bool}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1669
type Infos = Map ThreadId Info
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1670
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1671
lookup_info :: Infos -> ThreadId -> Maybe Info
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1672
lookup_info state id = Map.lookup id state
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1673
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1674
init_info :: ThreadId -> Infos -> (Infos, ())
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1675
init_info id infos = (Map.insert id (Info [] False) infos, ())
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1676
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1677
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1678
{- global state -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1679
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1680
{-# NOINLINE global_state #-}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1681
global_state :: IORef Infos
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1682
global_state = unsafePerformIO (newIORef Map.empty)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1683
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1684
get_info :: ThreadId -> IO (Maybe Info)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1685
get_info id = do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1686
  state <- readIORef global_state
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1687
  return $ lookup_info state id
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1688
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1689
map_info :: ThreadId -> (Info -> Info) -> IO ()
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1690
map_info id f =
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1691
  atomicModifyIORef' global_state
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1692
    (\infos ->
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1693
      case lookup_info infos id of
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1694
        Nothing -> (infos, ())
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1695
        Just info -> (Map.insert id (f info) infos, ()))
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1696
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1697
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1698
{- thread properties -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1699
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1700
my_info :: IO Info
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1701
my_info = do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1702
  id <- Concurrent.myThreadId
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1703
  info <- get_info id
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1704
  return $ fromJust info
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1705
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1706
properties :: IO Properties.T
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1707
properties = props <$> my_info
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1708
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1709
change_properties :: (Properties.T -> Properties.T) -> IO ()
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1710
change_properties f = do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1711
  id <- Concurrent.myThreadId
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1712
  map_info id (\info -> info {props = f (props info)})
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1713
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1714
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1715
{- stop -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1716
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1717
is_stopped :: IO Bool
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1718
is_stopped = stopped <$> my_info
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1719
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1720
stop :: ThreadId -> IO ()
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1721
stop id = map_info id (\info -> info {stopped = True})
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1722
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1723
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1724
{- fork -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1725
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1726
fork_finally :: IO a -> (Either SomeException a -> IO b) -> IO (ThreadId, IO (Result b))
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1727
fork_finally body finally = do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1728
  (id, result) <-
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1729
    Exception.mask (\restore ->
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1730
      Thread.forkIO
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1731
        (Exception.try
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1732
          (do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1733
            id <- Concurrent.myThreadId
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1734
            atomicModifyIORef' global_state (init_info id)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1735
            restore body) >>= finally))
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1736
  return (id, result)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1737
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1738
fork :: IO a -> IO (ThreadId, IO (Result a))
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1739
fork body = fork_finally body Thread.result
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1740
\<close>
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1741
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1742
generate_file "Isabelle/Server.hs" = \<open>
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1743
{-  Title:      Isabelle/Server.hs
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1744
    Author:     Makarius
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1745
    LICENSE:    BSD 3-clause (Isabelle)
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1746
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1747
TCP server on localhost.
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1748
-}
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1749
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1750
module Isabelle.Server (
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1751
  localhost_name, localhost, publish_text, publish_stdout,
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1752
  server
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1753
)
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1754
where
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1755
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1756
import Data.ByteString (ByteString)
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1757
import Control.Monad (forever, when)
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1758
import qualified Control.Exception as Exception
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1759
import Network.Socket (Socket)
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1760
import qualified Network.Socket as Socket
69472
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  1761
import qualified System.IO as IO
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1762
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1763
import Isabelle.Library
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1764
import qualified Isabelle.UUID as UUID
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1765
import qualified Isabelle.Byte_Message as Byte_Message
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1766
import qualified Isabelle.Standard_Thread as Standard_Thread
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1767
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1768
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1769
{- server address -}
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1770
69463
6439c9024dcc clarified signature;
wenzelm
parents: 69462
diff changeset
  1771
localhost_name :: String
6439c9024dcc clarified signature;
wenzelm
parents: 69462
diff changeset
  1772
localhost_name = "127.0.0.1"
6439c9024dcc clarified signature;
wenzelm
parents: 69462
diff changeset
  1773
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1774
localhost :: Socket.HostAddress
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1775
localhost = Socket.tupleToHostAddress (127, 0, 0, 1)
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1776
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1777
publish_text :: String -> String -> UUID.T -> String
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1778
publish_text name address password =
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1779
  "server " ++ quote name ++ " = " ++ address ++ " (password " ++ quote (show password) ++ ")"
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1780
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1781
publish_stdout :: String -> String -> UUID.T -> IO ()
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1782
publish_stdout name address password = putStrLn (publish_text name address password)
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1783
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1784
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1785
{- server -}
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1786
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1787
server :: (String -> UUID.T -> IO ()) -> (Socket -> IO ()) -> IO ()
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1788
server publish handle =
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1789
  Socket.withSocketsDo $ Exception.bracket open (Socket.close . fst) (uncurry loop)
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1790
  where
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1791
    open :: IO (Socket, ByteString)
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1792
    open = do
69466
wenzelm
parents: 69465
diff changeset
  1793
      server_socket <- Socket.socket Socket.AF_INET Socket.Stream Socket.defaultProtocol
wenzelm
parents: 69465
diff changeset
  1794
      Socket.bind server_socket (Socket.SockAddrInet 0 localhost)
wenzelm
parents: 69465
diff changeset
  1795
      Socket.listen server_socket 50
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1796
69466
wenzelm
parents: 69465
diff changeset
  1797
      port <- Socket.socketPort server_socket
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1798
      let address = localhost_name ++ ":" ++ show port
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1799
      password <- UUID.random
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1800
      publish address password
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1801
69466
wenzelm
parents: 69465
diff changeset
  1802
      return (server_socket, UUID.bytes password)
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  1803
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1804
    loop :: Socket -> ByteString -> IO ()
69466
wenzelm
parents: 69465
diff changeset
  1805
    loop server_socket password = forever $ do
69480
wenzelm
parents: 69477
diff changeset
  1806
      (connection, _) <- Socket.accept server_socket
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1807
      Standard_Thread.fork_finally
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1808
        (do
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1809
          line <- Byte_Message.read_line connection
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  1810
          when (line == Just password) $ handle connection)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1811
        (\finally -> do
69472
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  1812
          Socket.close connection
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  1813
          case finally of
69472
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  1814
            Left exn -> IO.hPutStrLn IO.stderr $ Exception.displayException exn
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  1815
            Right () -> return ())
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1816
      return ()
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1817
\<close>
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  1818
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
  1819
end