src/Tools/Haskell/Haskell.thy
author wenzelm
Wed, 22 Jan 2025 22:22:19 +0100
changeset 81954 6f2bcdfa9a19
parent 80913 46f59511b7bb
permissions -rw-r--r--
misc tuning: more concise operations on prems (without change of exceptions); discontinue odd clone Drule.cprems_of (see also 991a3feaf270);
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
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
     8
  imports Main
69222
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
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    11
generate_file "Isabelle/Bytes.hs" = \<open>
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    12
{-  Title:      Isabelle/Bytes.hs
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    13
    Author:     Makarius
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    14
    LICENSE:    BSD 3-clause (Isabelle)
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    15
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    16
Compact byte strings.
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    17
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    18
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/bytes.ML\<close>
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    19
and \<^file>\<open>$ISABELLE_HOME/src/Pure/General/bytes.scala\<close>.
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    20
-}
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    21
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
    22
{-# LANGUAGE TypeApplications #-}
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
    23
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    24
module Isabelle.Bytes (
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    25
  Bytes,
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    26
  make, unmake, pack, unpack,
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    27
  empty, null, length, index, all, any,
74216
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    28
  head, last, take, drop, isPrefixOf, isSuffixOf, try_unprefix, try_unsuffix,
74137
49fd45ffd43f tuned signature;
wenzelm
parents: 74136
diff changeset
    29
  concat, space, spaces, char, all_char, any_char, byte, singleton
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    30
)
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    31
where
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    32
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    33
import Prelude hiding (null, length, all, any, head, last, take, drop, concat)
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    34
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    35
import qualified Data.ByteString.Short as ShortByteString
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    36
import Data.ByteString.Short (ShortByteString)
74090
c26f4ec59835 more operations;
wenzelm
parents: 74089
diff changeset
    37
import qualified Data.ByteString as ByteString
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    38
import Data.ByteString (ByteString)
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    39
import qualified Data.List as List
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    40
import Data.Word (Word8)
74090
c26f4ec59835 more operations;
wenzelm
parents: 74089
diff changeset
    41
import Data.Array (Array, array, (!))
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    42
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    43
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    44
type Bytes = ShortByteString
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    45
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    46
make :: ByteString -> Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    47
make = ShortByteString.toShort
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    48
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    49
unmake :: Bytes -> ByteString
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    50
unmake = ShortByteString.fromShort
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    51
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    52
pack :: [Word8] -> Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    53
pack = ShortByteString.pack
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    54
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    55
unpack :: Bytes -> [Word8]
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    56
unpack = ShortByteString.unpack
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    57
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    58
empty :: Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    59
empty = ShortByteString.empty
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    60
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    61
null :: Bytes -> Bool
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    62
null = ShortByteString.null
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    63
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    64
length :: Bytes -> Int
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    65
length = ShortByteString.length
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    66
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    67
index :: Bytes -> Int -> Word8
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    68
index = ShortByteString.index
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    69
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    70
all :: (Word8 -> Bool) -> Bytes -> Bool
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    71
all p = List.all p . unpack
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    72
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    73
any :: (Word8 -> Bool) -> Bytes -> Bool
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    74
any p = List.any p . unpack
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    75
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    76
head :: Bytes -> Word8
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    77
head bytes = index bytes 0
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    78
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    79
last :: Bytes -> Word8
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    80
last bytes = index bytes (length bytes - 1)
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    81
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    82
take :: Int -> Bytes -> Bytes
74216
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    83
take n bs
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    84
  | n == 0 = empty
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    85
  | n >= length bs = bs
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    86
  | otherwise = pack (List.take n (unpack bs))
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    87
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    88
drop :: Int -> Bytes -> Bytes
74216
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    89
drop n bs
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    90
  | n == 0 = bs
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    91
  | n >= length bs = empty
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
    92
  | otherwise = pack (List.drop n (unpack bs))
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
    93
74099
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
    94
isPrefixOf :: Bytes -> Bytes -> Bool
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
    95
isPrefixOf bs1 bs2 =
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
    96
  n1 <= n2 && List.all (\i -> index bs1 i == index bs2 i) [0 .. n1 - 1]
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
    97
  where n1 = length bs1; n2 = length bs2
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
    98
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
    99
isSuffixOf :: Bytes -> Bytes -> Bool
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
   100
isSuffixOf bs1 bs2 =
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
   101
  n1 <= n2 && List.all (\i -> index bs1 i == index bs2 (i + k)) [0 .. n1 - 1]
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
   102
  where n1 = length bs1; n2 = length bs2; k = n2 - n1
0bda15b1b937 clarified signature;
wenzelm
parents: 74098
diff changeset
   103
74216
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   104
try_unprefix :: Bytes -> Bytes -> Maybe Bytes
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   105
try_unprefix bs1 bs2 =
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   106
  if isPrefixOf bs1 bs2 then Just (drop (length bs1) bs2)
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   107
  else Nothing
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   108
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   109
try_unsuffix :: Bytes -> Bytes -> Maybe Bytes
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   110
try_unsuffix bs1 bs2 =
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   111
  if isSuffixOf bs1 bs2 then Just (take (length bs2 - length bs1) bs2)
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   112
  else Nothing
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
   113
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   114
concat :: [Bytes] -> Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   115
concat = mconcat
74088
6d8674ffb962 clarified signature;
wenzelm
parents: 74087
diff changeset
   116
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   117
space :: Word8
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   118
space = 32
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   119
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   120
small_spaces :: Array Int Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   121
small_spaces = array (0, 64) [(i, pack (replicate i space)) | i <- [0 .. 64]]
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   122
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   123
spaces :: Int -> Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   124
spaces n =
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   125
  if n < 64 then small_spaces ! n
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   126
  else concat ((small_spaces ! (n `mod` 64)) : replicate (n `div` 64) (small_spaces ! 64))
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   127
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   128
char :: Word8 -> Char
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   129
char = toEnum . fromEnum
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   130
74135
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
   131
all_char :: (Char -> Bool) -> Bytes -> Bool
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
   132
all_char pred = all (pred . char)
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
   133
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
   134
any_char :: (Char -> Bool) -> Bytes -> Bool
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
   135
any_char pred = any (pred . char)
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
   136
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   137
byte :: Char -> Word8
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   138
byte = toEnum . fromEnum
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   139
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   140
singletons :: Array Word8 Bytes
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   141
singletons =
74137
49fd45ffd43f tuned signature;
wenzelm
parents: 74136
diff changeset
   142
  array (minBound, maxBound)
49fd45ffd43f tuned signature;
wenzelm
parents: 74136
diff changeset
   143
    [(i, make (ByteString.singleton i)) | i <- [minBound .. maxBound]]
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   144
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   145
singleton :: Word8 -> Bytes
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   146
singleton b = singletons ! b
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   147
\<close>
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   148
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   149
generate_file "Isabelle/UTF8.hs" = \<open>
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   150
{-  Title:      Isabelle/UTF8.hs
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   151
    Author:     Makarius
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   152
    LICENSE:    BSD 3-clause (Isabelle)
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   153
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   154
Variations on UTF-8.
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   155
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   156
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/utf8.ML\<close>
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   157
and \<^file>\<open>$ISABELLE_HOME/src/Pure/General/utf8.scala\<close>.
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   158
-}
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   159
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   160
{-# LANGUAGE MultiParamTypeClasses #-}
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   161
{-# LANGUAGE TypeSynonymInstances #-}
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   162
{-# LANGUAGE FlexibleInstances #-}
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   163
{-# LANGUAGE InstanceSigs #-}
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   164
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   165
module Isabelle.UTF8 (
74098
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   166
  setup, setup3,
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   167
  Recode (..)
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   168
)
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   169
where
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   170
74098
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   171
import qualified System.IO as IO
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   172
import Data.Text (Text)
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   173
import qualified Data.Text as Text
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   174
import qualified Data.Text.Encoding as Encoding
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   175
import qualified Data.Text.Encoding.Error as Error
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   176
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   177
import Data.ByteString (ByteString)
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   178
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   179
import qualified Isabelle.Bytes as Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   180
import Isabelle.Bytes (Bytes)
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   181
74098
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   182
setup :: IO.Handle -> IO ()
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   183
setup h = do
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   184
  IO.hSetEncoding h IO.utf8
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   185
  IO.hSetNewlineMode h IO.noNewlineTranslation
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   186
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   187
setup3 :: IO.Handle -> IO.Handle -> IO.Handle -> IO ()
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   188
setup3 h1 h2 h3 = do
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   189
  setup h1
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   190
  setup h2
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
   191
  setup h3
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   192
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   193
class Recode a b where
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   194
  encode :: a -> b
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   195
  decode :: b -> a
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   196
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   197
instance Recode Text ByteString where
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   198
  encode :: Text -> ByteString
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   199
  encode = Encoding.encodeUtf8
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   200
  decode :: ByteString -> Text
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   201
  decode = Encoding.decodeUtf8With Error.lenientDecode
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   202
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   203
instance Recode Text Bytes where
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   204
  encode :: Text -> Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   205
  encode = Bytes.make . encode
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   206
  decode :: Bytes -> Text
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   207
  decode = decode . Bytes.unmake
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   208
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   209
instance Recode String ByteString where
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   210
  encode :: String -> ByteString
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   211
  encode = encode . Text.pack
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   212
  decode :: ByteString -> String
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   213
  decode = Text.unpack . decode
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   214
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   215
instance Recode String Bytes where
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   216
  encode :: String -> Bytes
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   217
  encode = encode . Text.pack
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
   218
  decode :: Bytes -> String
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   219
  decode = Text.unpack . decode
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   220
\<close>
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
   221
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   222
generate_file "Isabelle/Library.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   223
{-  Title:      Isabelle/Library.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   224
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   225
    LICENSE:    BSD 3-clause (Isabelle)
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
Basic library of Isabelle idioms.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   228
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
   229
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/basics.ML\<close>
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
   230
and \<^file>\<open>$ISABELLE_HOME/src/Pure/library.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   231
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   232
74086
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   233
{-# LANGUAGE OverloadedStrings #-}
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   234
{-# LANGUAGE TypeSynonymInstances #-}
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   235
{-# LANGUAGE FlexibleInstances #-}
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   236
{-# LANGUAGE InstanceSigs #-}
74086
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   237
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   238
module Isabelle.Library (
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   239
  (|>), (|->), (#>), (#->),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   240
74327
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   241
  fold, fold_rev, fold_map, single, the_single, singletonM,
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   242
  map_index, get_index, separate,
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   243
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   244
  StringLike, STRING (..), TEXT (..), BYTES (..),
74128
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   245
  show_bytes, show_text,
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   246
80913
46f59511b7bb proper Haskell setup, following 406a85a25189;
wenzelm
parents: 80910
diff changeset
   247
  proper_string, enclose, quote, space_implode, implode_space, commas, commas_quote,
46f59511b7bb proper Haskell setup, following 406a85a25189;
wenzelm
parents: 80910
diff changeset
   248
  cat_lines, space_explode, split_lines, trim_line, trim_split_lines,
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   249
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   250
  getenv, getenv_strict)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   251
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   252
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   253
import System.Environment (lookupEnv)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   254
import Data.Maybe (fromMaybe)
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   255
import qualified Data.Text as Text
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   256
import Data.Text (Text)
74096
cb64ccdc3ac1 support for Lazy.Text;
wenzelm
parents: 74095
diff changeset
   257
import qualified Data.Text.Lazy as Lazy
74086
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   258
import Data.String (IsString)
69453
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   259
import qualified Data.List.Split as Split
69491
wenzelm
parents: 69490
diff changeset
   260
import qualified Isabelle.Symbol as Symbol
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   261
import qualified Isabelle.Bytes as Bytes
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   262
import Isabelle.Bytes (Bytes)
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   263
import qualified Isabelle.UTF8 as UTF8
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   264
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   265
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   266
{- functions -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   267
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   268
(|>) :: a -> (a -> b) -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   269
x |> f = f x
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   270
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   271
(|->) :: (a, b) -> (a -> b -> c) -> c
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   272
(x, y) |-> f = f x y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   273
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   274
(#>) :: (a -> b) -> (b -> c) -> a -> c
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   275
(f #> g) x = x |> f |> g
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   276
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   277
(#->) :: (a -> (c, b)) -> (c -> b -> d) -> a -> d
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   278
(f #-> g) x  = x |> f |-> g
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   279
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   280
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   281
{- lists -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   282
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   283
fold :: (a -> b -> b) -> [a] -> b -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   284
fold _ [] y = y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   285
fold f (x : xs) y = fold f xs (f x y)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   286
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   287
fold_rev :: (a -> b -> b) -> [a] -> b -> b
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   288
fold_rev _ [] y = y
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   289
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
   290
74327
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   291
fold_map :: (a -> b -> (c, b)) -> [a] -> b -> ([c], b)
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   292
fold_map _ [] y = ([], y)
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   293
fold_map f (x : xs) y =
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   294
  let
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   295
    (x', y') = f x y
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   296
    (xs', y'') = fold_map f xs y'
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   297
  in (x' : xs', y'')
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
   298
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   299
single :: a -> [a]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   300
single x = [x]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   301
74203
92f08f3d77bd more Isabelle/Haskell operations;
wenzelm
parents: 74197
diff changeset
   302
the_single :: [a] -> a
92f08f3d77bd more Isabelle/Haskell operations;
wenzelm
parents: 74197
diff changeset
   303
the_single [x] = x
92f08f3d77bd more Isabelle/Haskell operations;
wenzelm
parents: 74197
diff changeset
   304
the_single _ = undefined
92f08f3d77bd more Isabelle/Haskell operations;
wenzelm
parents: 74197
diff changeset
   305
74204
c832f35ea571 more Isabelle/Haskell operations;
wenzelm
parents: 74203
diff changeset
   306
singletonM :: Monad m => ([a] -> m [b]) -> a -> m b
c832f35ea571 more Isabelle/Haskell operations;
wenzelm
parents: 74203
diff changeset
   307
singletonM f x = the_single <$> f [x]
c832f35ea571 more Isabelle/Haskell operations;
wenzelm
parents: 74203
diff changeset
   308
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   309
map_index :: ((Int, a) -> b) -> [a] -> [b]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   310
map_index f = map_aux 0
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   311
  where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   312
    map_aux _ [] = []
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   313
    map_aux i (x : xs) = f (i, x) : map_aux (i + 1) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   314
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   315
get_index :: (a -> Maybe b) -> [a] -> Maybe (Int, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   316
get_index f = get_aux 0
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   317
  where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   318
    get_aux _ [] = Nothing
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   319
    get_aux i (x : xs) =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   320
      case f x of
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   321
        Nothing -> get_aux (i + 1) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   322
        Just y -> Just (i, y)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
   323
74086
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   324
separate :: a -> [a] -> [a]
74871
0597884e6e91 tuned --- fewer IDE warnings;
wenzelm
parents: 74327
diff changeset
   325
separate s (x : xs@(_ : _)) = x : s : separate s xs
74086
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   326
separate _ xs = xs;
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   327
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   328
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   329
{- string-like interfaces -}
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   330
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   331
class (IsString a, Monoid a, Eq a, Ord a) => StringLike a where
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   332
  space_explode :: Char -> a -> [a]
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   333
  trim_line :: a -> a
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   334
74136
wenzelm
parents: 74135
diff changeset
   335
gen_trim_line :: Int -> (Int -> Char) -> (Int -> a -> a) -> a -> a
wenzelm
parents: 74135
diff changeset
   336
gen_trim_line n at trim s =
wenzelm
parents: 74135
diff changeset
   337
  if n >= 2 && at (n - 2) == '\r' && at (n - 1) == '\n' then trim (n - 2) s
wenzelm
parents: 74135
diff changeset
   338
  else if n >= 1 && Symbol.is_ascii_line_terminator (at (n - 1)) then trim (n - 1) s
wenzelm
parents: 74135
diff changeset
   339
  else s
wenzelm
parents: 74135
diff changeset
   340
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   341
instance StringLike String where
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   342
  space_explode :: Char -> String -> [String]
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   343
  space_explode c = Split.split (Split.dropDelims (Split.whenElt (== c)))
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   344
  trim_line :: String -> String
74871
0597884e6e91 tuned --- fewer IDE warnings;
wenzelm
parents: 74327
diff changeset
   345
  trim_line s = gen_trim_line (length s) (s !!) take s
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   346
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   347
instance StringLike Text where
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   348
  space_explode :: Char -> Text -> [Text]
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   349
  space_explode c str =
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   350
    if Text.null str then []
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   351
    else if Text.all (/= c) str then [str]
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   352
    else map Text.pack $ space_explode c $ Text.unpack str
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   353
  trim_line :: Text -> Text
74136
wenzelm
parents: 74135
diff changeset
   354
  trim_line s = gen_trim_line (Text.length s) (Text.index s) Text.take s
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   355
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   356
instance StringLike Lazy.Text where
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   357
  space_explode :: Char -> Lazy.Text -> [Lazy.Text]
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   358
  space_explode c str =
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   359
    if Lazy.null str then []
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   360
    else if Lazy.all (/= c) str then [str]
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   361
    else map Lazy.pack $ space_explode c $ Lazy.unpack str
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   362
  trim_line :: Lazy.Text -> Lazy.Text
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   363
  trim_line = Lazy.fromStrict . trim_line . Lazy.toStrict
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   364
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   365
instance StringLike Bytes where
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   366
  space_explode :: Char -> Bytes -> [Bytes]
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   367
  space_explode c str =
74130
54a108beed3e clarified modules;
wenzelm
parents: 74129
diff changeset
   368
    if Bytes.null str then []
74135
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
   369
    else if Bytes.all_char (/= c) str then [str]
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   370
    else
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   371
      explode (Bytes.unpack str)
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   372
      where
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   373
        explode rest =
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   374
          case span (/= (Bytes.byte c)) rest of
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   375
            (_, []) -> [Bytes.pack rest]
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   376
            (prfx, _ : rest') -> Bytes.pack prfx : explode rest'
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
   377
  trim_line :: Bytes -> Bytes
74136
wenzelm
parents: 74135
diff changeset
   378
  trim_line s = gen_trim_line (Bytes.length s) (Bytes.char . Bytes.index s) Bytes.take s
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   379
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   380
class StringLike a => STRING a where make_string :: a -> String
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   381
instance STRING String where make_string = id
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   382
instance STRING Text where make_string = Text.unpack
74096
cb64ccdc3ac1 support for Lazy.Text;
wenzelm
parents: 74095
diff changeset
   383
instance STRING Lazy.Text where make_string = Lazy.unpack
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   384
instance STRING Bytes where make_string = UTF8.decode
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   385
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   386
class StringLike a => TEXT a where make_text :: a -> Text
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   387
instance TEXT String where make_text = Text.pack
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   388
instance TEXT Text where make_text = id
74096
cb64ccdc3ac1 support for Lazy.Text;
wenzelm
parents: 74095
diff changeset
   389
instance TEXT Lazy.Text where make_text = Lazy.toStrict
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   390
instance TEXT Bytes where make_text = UTF8.decode
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   391
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   392
class StringLike a => BYTES a where make_bytes :: a -> Bytes
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   393
instance BYTES String where make_bytes = UTF8.encode
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   394
instance BYTES Text where make_bytes = UTF8.encode
74096
cb64ccdc3ac1 support for Lazy.Text;
wenzelm
parents: 74095
diff changeset
   395
instance BYTES Lazy.Text where make_bytes = UTF8.encode . Lazy.toStrict
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   396
instance BYTES Bytes where make_bytes = id
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   397
74128
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   398
show_bytes :: Show a => a -> Bytes
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   399
show_bytes = make_bytes . show
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   400
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   401
show_text :: Show a => a -> Text
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   402
show_text = make_text . show
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   403
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   404
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   405
{- strings -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   406
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   407
proper_string :: StringLike a => a -> Maybe a
74086
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   408
proper_string s = if s == "" then Nothing else Just s
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   409
74185
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
   410
enclose :: StringLike a => a -> a -> a -> a
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
   411
enclose lpar rpar str = lpar <> str <> rpar
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
   412
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   413
quote :: StringLike a => a -> a
74185
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
   414
quote = enclose "\"" "\""
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   415
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   416
space_implode :: StringLike a => a -> [a] -> a
74086
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   417
space_implode s = mconcat . separate s
73487ebd7332 clarified signature;
wenzelm
parents: 74084
diff changeset
   418
80913
46f59511b7bb proper Haskell setup, following 406a85a25189;
wenzelm
parents: 80910
diff changeset
   419
implode_space :: StringLike a => [a] -> a
46f59511b7bb proper Haskell setup, following 406a85a25189;
wenzelm
parents: 80910
diff changeset
   420
implode_space = space_implode " "
46f59511b7bb proper Haskell setup, following 406a85a25189;
wenzelm
parents: 80910
diff changeset
   421
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   422
commas, commas_quote :: StringLike a => [a] -> a
69453
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   423
commas = space_implode ", "
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   424
commas_quote = commas . map quote
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   425
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   426
split_lines :: StringLike a => a -> [a]
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   427
split_lines = space_explode '\n'
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
   428
74093
dc962d4248ca clarified signature --- more operations;
wenzelm
parents: 74092
diff changeset
   429
cat_lines :: StringLike a => [a] -> a
69453
dcea1fffbfe6 more Haskell operations;
wenzelm
parents: 69452
diff changeset
   430
cat_lines = space_implode "\n"
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   431
74213
12152390db34 more Isabelle/Haskell operations;
wenzelm
parents: 74211
diff changeset
   432
trim_split_lines :: StringLike a => a -> [a]
12152390db34 more Isabelle/Haskell operations;
wenzelm
parents: 74211
diff changeset
   433
trim_split_lines = trim_line #> split_lines #> map trim_line
12152390db34 more Isabelle/Haskell operations;
wenzelm
parents: 74211
diff changeset
   434
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   435
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   436
{- getenv -}
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   437
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   438
getenv :: Bytes -> IO Bytes
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   439
getenv x = do
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   440
  y <- lookupEnv (make_string x)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   441
  return $ make_bytes $ fromMaybe "" y
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   442
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   443
getenv_strict :: Bytes -> IO Bytes
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   444
getenv_strict x = do
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   445
  y <- getenv x
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   446
  if Bytes.null y then
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   447
    errorWithoutStackTrace $ make_string ("Undefined Isabelle environment variable: " <> quote x)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
   448
  else return y
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   449
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   450
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   451
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   452
generate_file "Isabelle/Symbol.hs" = \<open>
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   453
{-  Title:      Isabelle/Symbols.hs
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   454
    Author:     Makarius
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   455
    LICENSE:    BSD 3-clause (Isabelle)
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   456
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   457
Isabelle text symbols.
74172
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   458
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   459
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/symbol.ML\<close>
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   460
and \<^file>\<open>$ISABELLE_HOME/src/Pure/General/symbol_explode.ML\<close>.
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   461
-}
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   462
74172
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   463
{-# LANGUAGE OverloadedStrings #-}
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   464
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   465
module Isabelle.Symbol (
74177
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   466
  Symbol, eof, is_eof, not_eof,
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   467
74172
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   468
  is_ascii_letter, is_ascii_digit, is_ascii_hex, is_ascii_quasi,
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   469
  is_ascii_blank, is_ascii_line_terminator, is_ascii_letdig,
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   470
  is_ascii_identifier,
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   471
74177
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   472
  explode
74172
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   473
)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   474
where
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   475
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   476
import Data.Word (Word8)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   477
import qualified Isabelle.Bytes as Bytes
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   478
import Isabelle.Bytes (Bytes)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   479
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   480
74177
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   481
{- type -}
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   482
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   483
type Symbol = Bytes
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   484
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   485
eof :: Symbol
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   486
eof = ""
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   487
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   488
is_eof, not_eof :: Symbol -> Bool
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   489
is_eof = Bytes.null
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   490
not_eof = not . is_eof
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   491
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
   492
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   493
{- ASCII characters -}
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   494
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   495
is_ascii_letter :: Char -> Bool
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   496
is_ascii_letter c = 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z'
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   497
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   498
is_ascii_digit :: Char -> Bool
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   499
is_ascii_digit c = '0' <= c && c <= '9'
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   500
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   501
is_ascii_hex :: Char -> Bool
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   502
is_ascii_hex c = '0' <= c && c <= '9' || 'A' <= c && c <= 'F' || 'a' <= c && c <= 'f'
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   503
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   504
is_ascii_quasi :: Char -> Bool
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   505
is_ascii_quasi c = c == '_' || c == '\''
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   506
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   507
is_ascii_blank :: Char -> Bool
74172
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   508
is_ascii_blank c = c `elem` (" \t\n\11\f\r" :: String)
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   509
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   510
is_ascii_line_terminator :: Char -> Bool
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   511
is_ascii_line_terminator c = c == '\r' || c == '\n'
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   512
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   513
is_ascii_letdig :: Char -> Bool
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   514
is_ascii_letdig c = is_ascii_letter c || is_ascii_digit c || is_ascii_quasi c
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   515
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   516
is_ascii_identifier :: String -> Bool
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   517
is_ascii_identifier s =
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   518
  not (null s) && is_ascii_letter (head s) && all is_ascii_letdig s
74172
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   519
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   520
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   521
{- explode symbols: ASCII, UTF8, named -}
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   522
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   523
is_utf8 :: Word8 -> Bool
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   524
is_utf8 b = b >= 128
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   525
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   526
is_utf8_trailer :: Word8 -> Bool
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   527
is_utf8_trailer b = 128 <= b && b < 192
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   528
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   529
is_utf8_control :: Word8 -> Bool
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   530
is_utf8_control b = 128 <= b && b < 160
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   531
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   532
(|>) :: a -> (a -> b) -> b
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   533
x |> f = f x
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   534
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   535
explode :: Bytes -> [Symbol]
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   536
explode string = scan 0
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   537
  where
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   538
    byte = Bytes.index string
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   539
    substring i j =
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   540
      if i == j - 1 then Bytes.singleton (byte i)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   541
      else Bytes.pack (map byte [i .. j - 1])
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   542
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   543
    n = Bytes.length string
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   544
    test pred i = i < n && pred (byte i)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   545
    test_char pred i = i < n && pred (Bytes.char (byte i))
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   546
    many pred i = if test pred i then many pred (i + 1) else i
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   547
    maybe_char c i = if test_char (== c) i then i + 1 else i
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   548
    maybe_ascii_id i =
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   549
      if test_char is_ascii_letter i
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   550
      then many (is_ascii_letdig . Bytes.char) (i + 1)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   551
      else i
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   552
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   553
    scan i =
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   554
      if i < n then
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   555
        let
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   556
          b = byte i
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   557
          c = Bytes.char b
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   558
        in
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   559
          {-encoded newline-}
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   560
          if c == '\r' then "\n" : scan (maybe_char '\n' (i + 1))
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   561
          {-pseudo utf8: encoded ascii control-}
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   562
          else if b == 192 && test is_utf8_control (i + 1) && not (test is_utf8 (i + 2))
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   563
          then Bytes.singleton (byte (i + 1) - 128) : scan (i + 2)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   564
          {-utf8-}
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   565
          else if is_utf8 b then
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   566
            let j = many is_utf8_trailer (i + 1)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   567
            in substring i j : scan j
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   568
          {-named symbol-}
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   569
          else if c == '\\' && test_char (== '<') (i + 1) then
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   570
            let j = (i + 2) |> maybe_char '^' |> maybe_ascii_id |> maybe_char '>'
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   571
            in substring i j : scan j
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   572
          {-single character-}
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   573
          else Bytes.singleton b : scan (i + 1)
c576a4e2ffbc more Haskell operations;
wenzelm
parents: 74169
diff changeset
   574
      else []
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   575
\<close>
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
   576
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   577
generate_file "Isabelle/Buffer.hs" = \<open>
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   578
{-  Title:      Isabelle/Buffer.hs
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   579
    Author:     Makarius
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   580
    LICENSE:    BSD 3-clause (Isabelle)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   581
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   582
Efficient buffer of byte strings.
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   583
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
   584
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/buffer.ML\<close>.
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   585
-}
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   586
74231
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   587
module Isabelle.Buffer (T, empty, add, content, build, build_content)
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   588
where
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   589
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   590
import qualified Isabelle.Bytes as Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   591
import Isabelle.Bytes (Bytes)
74231
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   592
import Isabelle.Library
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   593
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   594
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   595
newtype T = Buffer [Bytes]
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   596
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   597
empty :: T
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   598
empty = Buffer []
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   599
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   600
add :: Bytes -> T -> T
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   601
add b (Buffer bs) = Buffer (if Bytes.null b then bs else b : bs)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   602
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   603
content :: T -> Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   604
content (Buffer bs) = Bytes.concat (reverse bs)
74231
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   605
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   606
build :: (T -> T) -> T
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   607
build f = f empty
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   608
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   609
build_content :: (T -> T) -> Bytes
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
   610
build_content f = build f |> content
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   611
\<close>
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   612
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   613
generate_file "Isabelle/Value.hs" = \<open>
73246
b9c480878663 tuned comments;
wenzelm
parents: 73199
diff changeset
   614
{-  Title:      Isabelle/Value.hs
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   615
    Author:     Makarius
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   616
    LICENSE:    BSD 3-clause (Isabelle)
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   617
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   618
Plain values, represented as string.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   619
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
   620
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/value.ML\<close>.
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   621
-}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   622
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   623
{-# LANGUAGE OverloadedStrings #-}
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   624
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   625
module Isabelle.Value
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   626
  (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
   627
where
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   628
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   629
import qualified Data.List as List
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   630
import qualified Text.Read as Read
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   631
import Isabelle.Bytes (Bytes)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   632
import Isabelle.Library
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   633
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   634
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   635
{- bool -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   636
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   637
print_bool :: Bool -> Bytes
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   638
print_bool True = "true"
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   639
print_bool False = "false"
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   640
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   641
parse_bool :: Bytes -> Maybe Bool
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   642
parse_bool "true" = Just True
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   643
parse_bool "false" = Just False
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   644
parse_bool _ = Nothing
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   645
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   646
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   647
{- nat -}
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   648
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   649
parse_nat :: Bytes -> Maybe Int
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   650
parse_nat s =
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   651
  case Read.readMaybe (make_string s) of
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   652
    Just n | n >= 0 -> Just n
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   653
    _ -> Nothing
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   654
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
   655
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   656
{- int -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   657
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   658
print_int :: Int -> Bytes
74128
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
   659
print_int = show_bytes
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   660
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   661
parse_int :: Bytes -> Maybe Int
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   662
parse_int = Read.readMaybe . make_string
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   663
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   664
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   665
{- real -}
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   666
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   667
print_real :: Double -> Bytes
69233
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   668
print_real x =
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   669
  let s = show x in
560263485988 ported from src/Pure/General/value.ML;
wenzelm
parents: 69228
diff changeset
   670
    case span (/= '.') s of
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   671
      (a, '.' : b) | List.all (== '0') b -> make_bytes a
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   672
      _ -> make_bytes s
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   673
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   674
parse_real :: Bytes -> Maybe Double
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   675
parse_real = Read.readMaybe . make_string
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   676
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   677
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   678
generate_file "Isabelle/Properties.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
   679
{-  Title:      Isabelle/Properties.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   680
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   681
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   682
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   683
Property lists.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   684
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
   685
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/properties.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   686
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   687
69477
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   688
module Isabelle.Properties (Entry, T, defined, get, get_value, put, remove)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   689
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   690
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   691
import qualified Data.List as List
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   692
import Isabelle.Bytes (Bytes)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   693
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   694
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   695
type Entry = (Bytes, Bytes)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   696
type T = [Entry]
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   697
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   698
defined :: T -> Bytes -> Bool
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   699
defined props name = any (\(a, _) -> a == name) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   700
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   701
get :: T -> Bytes -> Maybe Bytes
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   702
get props name = List.lookup name props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   703
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   704
get_value :: (Bytes -> Maybe a) -> T -> Bytes -> Maybe a
74871
0597884e6e91 tuned --- fewer IDE warnings;
wenzelm
parents: 74327
diff changeset
   705
get_value parse props name = maybe Nothing parse (get props name)
69477
1690ba936016 more Isabelle/Haskell operations;
wenzelm
parents: 69476
diff changeset
   706
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   707
put :: Entry -> T -> T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   708
put entry props = entry : remove (fst entry) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   709
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   710
remove :: Bytes -> T -> T
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   711
remove name props =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   712
  if defined props name then filter (\(a, _) -> a /= name) props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   713
  else props
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   714
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   715
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
   716
generate_file "Isabelle/Markup.hs" = \<open>
73246
b9c480878663 tuned comments;
wenzelm
parents: 73199
diff changeset
   717
{-  Title:      Isabelle/Markup.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   718
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   719
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   720
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   721
Quasi-abstract markup elements.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
   722
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
   723
See \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/markup.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   724
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   725
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   726
{-# LANGUAGE OverloadedStrings #-}
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
   727
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
   728
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   729
module Isabelle.Markup (
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   730
  T, empty, is_empty, properties,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   731
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   732
  nameN, name, xnameN, xname, kindN,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   733
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   734
  bindingN, binding, entityN, entity, defN, refN,
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   735
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   736
  completionN, completion, no_completionN, no_completion,
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   737
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
   738
  lineN, end_lineN, offsetN, end_offsetN, labelN, fileN, idN, positionN, position,
74182
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   739
  position_properties, def_name,
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   740
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   741
  expressionN, expression,
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   742
71489
e8da4a8d364a more complete signature;
wenzelm
parents: 70845
diff changeset
   743
  pathN, path, urlN, url, docN, doc,
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   744
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   745
  markupN, consistentN, unbreakableN, indentN, widthN,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   746
  blockN, block, breakN, break, fbreakN, fbreak, itemN, item,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   747
69968
1a400b14fd3a clarified spell-checking (see also 30233285270a);
wenzelm
parents: 69794
diff changeset
   748
  wordsN, words,
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   749
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   750
  tfreeN, tfree, tvarN, tvar, freeN, free, skolemN, skolem, boundN, bound, varN, var,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   751
  numeralN, numeral, literalN, literal, delimiterN, delimiter, inner_stringN, inner_string,
69320
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   752
  inner_cartoucheN, inner_cartouche,
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   753
  token_rangeN, token_range,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   754
  sortingN, sorting, typingN, typing, class_parameterN, class_parameter,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   755
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   756
  antiquotedN, antiquoted, antiquoteN, antiquote,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   757
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   758
  paragraphN, paragraph, text_foldN, text_fold,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   759
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   760
  keyword1N, keyword1, keyword2N, keyword2, keyword3N, keyword3, quasi_keywordN, quasi_keyword,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   761
  improperN, improper, operatorN, operator, stringN, string, alt_stringN, alt_string,
69320
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   762
  verbatimN, verbatim, cartoucheN, cartouche, commentN, comment, comment1N, comment1,
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
   763
  comment2N, comment2, comment3N, comment3,
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   764
70667
3cab8dad5b40 obsolete (see 94442fce40a5);
wenzelm
parents: 70047
diff changeset
   765
  forkedN, forked, joinedN, joined, runningN, running, finishedN, finished,
69794
a19fdf64726c tuned signature: proper exports;
wenzelm
parents: 69793
diff changeset
   766
  failedN, failed, canceledN, canceled, initializedN, initialized, finalizedN, finalized,
a19fdf64726c tuned signature: proper exports;
wenzelm
parents: 69793
diff changeset
   767
  consolidatedN, consolidated,
a19fdf64726c tuned signature: proper exports;
wenzelm
parents: 69793
diff changeset
   768
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   769
  writelnN, writeln, stateN, state, informationN, information, tracingN, tracing,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   770
  warningN, warning, legacyN, legacy, errorN, error, reportN, report, no_reportN, no_report,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   771
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   772
  intensifyN, intensify,
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   773
  Output, no_output)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   774
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   775
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   776
import Prelude hiding (words, error, break)
74182
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   777
import Data.Map.Strict (Map)
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   778
import qualified Data.Map.Strict as Map
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   779
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   780
import Isabelle.Library
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   781
import qualified Isabelle.Properties as Properties
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   782
import qualified Isabelle.Value as Value
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   783
import qualified Isabelle.Bytes as Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   784
import Isabelle.Bytes (Bytes)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   785
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   786
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   787
{- basic markup -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   788
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   789
type T = (Bytes, Properties.T)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   790
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   791
empty :: T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   792
empty = ("", [])
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   793
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   794
is_empty :: T -> Bool
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   795
is_empty ("", _) = True
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   796
is_empty _ = False
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
   797
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   798
properties :: Properties.T -> T -> T
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   799
properties more_props (elem, props) =
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   800
  (elem, fold_rev Properties.put more_props props)
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   801
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   802
markup_elem :: Bytes -> T
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   803
markup_elem name = (name, [])
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   804
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   805
markup_string :: Bytes -> Bytes -> Bytes -> T
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   806
markup_string name prop = \s -> (name, [(prop, s)])
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   807
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   808
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   809
{- misc properties -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   810
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   811
nameN :: Bytes
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   812
nameN = \<open>Markup.nameN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   813
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   814
name :: Bytes -> T -> T
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   815
name a = properties [(nameN, a)]
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   816
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   817
xnameN :: Bytes
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   818
xnameN = \<open>Markup.xnameN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   819
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   820
xname :: Bytes -> T -> T
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   821
xname a = properties [(xnameN, a)]
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   822
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   823
kindN :: Bytes
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   824
kindN = \<open>Markup.kindN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   825
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   826
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   827
{- formal entities -}
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   828
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   829
bindingN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   830
bindingN = \<open>Markup.bindingN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   831
binding :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   832
binding = markup_elem bindingN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   833
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   834
entityN :: Bytes
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   835
entityN = \<open>Markup.entityN\<close>
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   836
entity :: Bytes -> Bytes -> T
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   837
entity kind name =
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   838
  (entityN,
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   839
    (if Bytes.null name then [] else [(nameN, name)]) <>
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   840
    (if Bytes.null kind then [] else [(kindN, kind)]))
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   841
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   842
defN :: Bytes
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   843
defN = \<open>Markup.defN\<close>
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   844
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   845
refN :: Bytes
69315
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   846
refN = \<open>Markup.refN\<close>
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   847
fc1a8df3062d more Haskell operations;
wenzelm
parents: 69291
diff changeset
   848
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   849
{- completion -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   850
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   851
completionN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   852
completionN = \<open>Markup.completionN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   853
completion :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   854
completion = markup_elem completionN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   855
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   856
no_completionN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   857
no_completionN = \<open>Markup.no_completionN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   858
no_completion :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   859
no_completion = markup_elem no_completionN
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   860
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
   861
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   862
{- position -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   863
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   864
lineN, end_lineN :: Bytes
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   865
lineN = \<open>Markup.lineN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   866
end_lineN = \<open>Markup.end_lineN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   867
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   868
offsetN, end_offsetN :: Bytes
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   869
offsetN = \<open>Markup.offsetN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   870
end_offsetN = \<open>Markup.end_offsetN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   871
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
   872
labelN, fileN, idN :: Bytes
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
   873
labelN = \<open>Markup.labelN\<close>
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   874
fileN = \<open>Markup.fileN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   875
idN = \<open>Markup.idN\<close>
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   876
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   877
positionN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   878
positionN = \<open>Markup.positionN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   879
position :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   880
position = markup_elem positionN
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   881
74182
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   882
position_properties :: [Bytes]
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
   883
position_properties = [lineN, offsetN, end_offsetN, labelN, fileN, idN]
74182
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   884
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   885
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   886
{- position "def" names -}
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   887
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   888
make_def :: Bytes -> Bytes
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   889
make_def a = "def_" <> a
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   890
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   891
def_names :: Map Bytes Bytes
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   892
def_names = Map.fromList $ map (\a -> (a, make_def a)) position_properties
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   893
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   894
def_name :: Bytes -> Bytes
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   895
def_name a =
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   896
  case Map.lookup a def_names of
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   897
    Just b -> b
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   898
    Nothing -> make_def a
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
   899
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   900
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   901
{- expression -}
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   902
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   903
expressionN :: Bytes
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   904
expressionN = \<open>Markup.expressionN\<close>
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   905
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   906
expression :: Bytes -> T
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   907
expression kind = (expressionN, if kind == "" then [] else [(kindN, kind)])
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   908
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   909
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   910
{- external resources -}
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   911
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   912
pathN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   913
pathN = \<open>Markup.pathN\<close>
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   914
path :: Bytes -> T
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   915
path = markup_string pathN nameN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   916
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   917
urlN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   918
urlN = \<open>Markup.urlN\<close>
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   919
url :: Bytes -> T
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   920
url = markup_string urlN nameN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   921
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   922
docN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   923
docN = \<open>Markup.docN\<close>
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   924
doc :: Bytes -> T
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   925
doc = markup_string docN nameN
69291
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   926
36d711008292 more Haskell operations;
wenzelm
parents: 69290
diff changeset
   927
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   928
{- pretty printing -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   929
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   930
markupN, consistentN, unbreakableN, indentN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   931
markupN = \<open>Markup.markupN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   932
consistentN = \<open>Markup.consistentN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   933
unbreakableN = \<open>Markup.unbreakableN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   934
indentN = \<open>Markup.indentN\<close>
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   935
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   936
widthN :: Bytes
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   937
widthN = \<open>Markup.widthN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   938
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   939
blockN :: Bytes
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   940
blockN = \<open>Markup.blockN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   941
block :: Bool -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   942
block c i =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   943
  (blockN,
74081
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
   944
    (if c then [(consistentN, Value.print_bool c)] else []) <>
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   945
    (if i /= 0 then [(indentN, Value.print_int i)] else []))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   946
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   947
breakN :: Bytes
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   948
breakN = \<open>Markup.breakN\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   949
break :: Int -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   950
break w i =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   951
  (breakN,
74081
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
   952
    (if w /= 0 then [(widthN, Value.print_int w)] else []) <>
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   953
    (if i /= 0 then [(indentN, Value.print_int i)] else []))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   954
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   955
fbreakN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   956
fbreakN = \<open>Markup.fbreakN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   957
fbreak :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   958
fbreak = markup_elem fbreakN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   959
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   960
itemN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   961
itemN = \<open>Markup.itemN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   962
item :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   963
item = markup_elem itemN
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   964
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
   965
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   966
{- text properties -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   967
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   968
wordsN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   969
wordsN = \<open>Markup.wordsN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   970
words :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   971
words = markup_elem wordsN
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   972
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   973
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   974
{- inner syntax -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
   975
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   976
tfreeN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   977
tfreeN = \<open>Markup.tfreeN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   978
tfree :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   979
tfree = markup_elem tfreeN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   980
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   981
tvarN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   982
tvarN = \<open>Markup.tvarN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   983
tvar :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   984
tvar = markup_elem tvarN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   985
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   986
freeN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   987
freeN = \<open>Markup.freeN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   988
free :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   989
free = markup_elem freeN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   990
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   991
skolemN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   992
skolemN = \<open>Markup.skolemN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   993
skolem :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   994
skolem = markup_elem skolemN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   995
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
   996
boundN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   997
boundN = \<open>Markup.boundN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   998
bound :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
   999
bound = markup_elem boundN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1000
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1001
varN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1002
varN = \<open>Markup.varN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1003
var :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1004
var = markup_elem varN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1005
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1006
numeralN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1007
numeralN = \<open>Markup.numeralN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1008
numeral :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1009
numeral = markup_elem numeralN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1010
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1011
literalN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1012
literalN = \<open>Markup.literalN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1013
literal :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1014
literal = markup_elem literalN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1015
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1016
delimiterN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1017
delimiterN = \<open>Markup.delimiterN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1018
delimiter :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1019
delimiter = markup_elem delimiterN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1020
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1021
inner_stringN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1022
inner_stringN = \<open>Markup.inner_stringN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1023
inner_string :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1024
inner_string = markup_elem inner_stringN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1025
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1026
inner_cartoucheN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1027
inner_cartoucheN = \<open>Markup.inner_cartoucheN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1028
inner_cartouche :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1029
inner_cartouche = markup_elem inner_cartoucheN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1030
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1031
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1032
token_rangeN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1033
token_rangeN = \<open>Markup.token_rangeN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1034
token_range :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1035
token_range = markup_elem token_rangeN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1036
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1037
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1038
sortingN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1039
sortingN = \<open>Markup.sortingN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1040
sorting :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1041
sorting = markup_elem sortingN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1042
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1043
typingN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1044
typingN = \<open>Markup.typingN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1045
typing :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1046
typing = markup_elem typingN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1047
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1048
class_parameterN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1049
class_parameterN = \<open>Markup.class_parameterN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1050
class_parameter :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1051
class_parameter = markup_elem class_parameterN
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1052
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1053
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1054
{- antiquotations -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1055
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1056
antiquotedN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1057
antiquotedN = \<open>Markup.antiquotedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1058
antiquoted :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1059
antiquoted = markup_elem antiquotedN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1060
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1061
antiquoteN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1062
antiquoteN = \<open>Markup.antiquoteN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1063
antiquote :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1064
antiquote = markup_elem antiquoteN
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1065
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1066
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1067
{- text structure -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1068
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1069
paragraphN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1070
paragraphN = \<open>Markup.paragraphN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1071
paragraph :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1072
paragraph = markup_elem paragraphN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1073
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1074
text_foldN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1075
text_foldN = \<open>Markup.text_foldN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1076
text_fold :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1077
text_fold = markup_elem text_foldN
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1078
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1079
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1080
{- outer syntax -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1081
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1082
keyword1N :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1083
keyword1N = \<open>Markup.keyword1N\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1084
keyword1 :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1085
keyword1 = markup_elem keyword1N
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1086
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1087
keyword2N :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1088
keyword2N = \<open>Markup.keyword2N\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1089
keyword2 :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1090
keyword2 = markup_elem keyword2N
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1091
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1092
keyword3N :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1093
keyword3N = \<open>Markup.keyword3N\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1094
keyword3 :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1095
keyword3 = markup_elem keyword3N
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1096
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1097
quasi_keywordN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1098
quasi_keywordN = \<open>Markup.quasi_keywordN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1099
quasi_keyword :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1100
quasi_keyword = markup_elem quasi_keywordN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1101
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1102
improperN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1103
improperN = \<open>Markup.improperN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1104
improper :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1105
improper = markup_elem improperN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1106
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1107
operatorN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1108
operatorN = \<open>Markup.operatorN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1109
operator :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1110
operator = markup_elem operatorN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1111
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1112
stringN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1113
stringN = \<open>Markup.stringN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1114
string :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1115
string = markup_elem stringN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1116
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1117
alt_stringN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1118
alt_stringN = \<open>Markup.alt_stringN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1119
alt_string :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1120
alt_string = markup_elem alt_stringN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1121
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1122
verbatimN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1123
verbatimN = \<open>Markup.verbatimN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1124
verbatim :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1125
verbatim = markup_elem verbatimN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1126
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1127
cartoucheN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1128
cartoucheN = \<open>Markup.cartoucheN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1129
cartouche :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1130
cartouche = markup_elem cartoucheN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1131
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1132
commentN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1133
commentN = \<open>Markup.commentN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1134
comment :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1135
comment = markup_elem commentN
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1136
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1137
69320
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
  1138
{- comments -}
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
  1139
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1140
comment1N :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1141
comment1N = \<open>Markup.comment1N\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1142
comment1 :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1143
comment1 = markup_elem comment1N
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1144
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1145
comment2N :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1146
comment2N = \<open>Markup.comment2N\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1147
comment2 :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1148
comment2 = markup_elem comment2N
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1149
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1150
comment3N :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1151
comment3N = \<open>Markup.comment3N\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1152
comment3 :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1153
comment3 = markup_elem comment3N
69320
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
  1154
fc221fa79741 more comment markup;
wenzelm
parents: 69315
diff changeset
  1155
69793
0f2dc49250fb more Haskell operations;
wenzelm
parents: 69662
diff changeset
  1156
{- command status -}
0f2dc49250fb more Haskell operations;
wenzelm
parents: 69662
diff changeset
  1157
70667
3cab8dad5b40 obsolete (see 94442fce40a5);
wenzelm
parents: 70047
diff changeset
  1158
forkedN, joinedN, runningN, finishedN, failedN, canceledN,
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1159
  initializedN, finalizedN, consolidatedN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1160
forkedN = \<open>Markup.forkedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1161
joinedN = \<open>Markup.joinedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1162
runningN = \<open>Markup.runningN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1163
finishedN = \<open>Markup.finishedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1164
failedN = \<open>Markup.failedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1165
canceledN = \<open>Markup.canceledN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1166
initializedN = \<open>Markup.initializedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1167
finalizedN = \<open>Markup.finalizedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1168
consolidatedN = \<open>Markup.consolidatedN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1169
70667
3cab8dad5b40 obsolete (see 94442fce40a5);
wenzelm
parents: 70047
diff changeset
  1170
forked, joined, running, finished, failed, canceled,
69793
0f2dc49250fb more Haskell operations;
wenzelm
parents: 69662
diff changeset
  1171
  initialized, finalized, consolidated :: T
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1172
forked = markup_elem forkedN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1173
joined = markup_elem joinedN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1174
running = markup_elem runningN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1175
finished = markup_elem finishedN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1176
failed = markup_elem failedN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1177
canceled = markup_elem canceledN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1178
initialized = markup_elem initializedN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1179
finalized = markup_elem finalizedN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1180
consolidated = markup_elem consolidatedN
69793
0f2dc49250fb more Haskell operations;
wenzelm
parents: 69662
diff changeset
  1181
0f2dc49250fb more Haskell operations;
wenzelm
parents: 69662
diff changeset
  1182
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1183
{- messages -}
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1184
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1185
writelnN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1186
writelnN = \<open>Markup.writelnN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1187
writeln :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1188
writeln = markup_elem writelnN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1189
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1190
stateN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1191
stateN = \<open>Markup.stateN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1192
state :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1193
state = markup_elem stateN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1194
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1195
informationN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1196
informationN = \<open>Markup.informationN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1197
information :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1198
information = markup_elem informationN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1199
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1200
tracingN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1201
tracingN = \<open>Markup.tracingN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1202
tracing :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1203
tracing = markup_elem tracingN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1204
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1205
warningN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1206
warningN = \<open>Markup.warningN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1207
warning :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1208
warning = markup_elem warningN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1209
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1210
legacyN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1211
legacyN = \<open>Markup.legacyN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1212
legacy :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1213
legacy = markup_elem legacyN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1214
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1215
errorN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1216
errorN = \<open>Markup.errorN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1217
error :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1218
error = markup_elem errorN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1219
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1220
reportN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1221
reportN = \<open>Markup.reportN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1222
report :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1223
report = markup_elem reportN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1224
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1225
no_reportN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1226
no_reportN = \<open>Markup.no_reportN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1227
no_report :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1228
no_report = markup_elem no_reportN
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1229
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1230
intensifyN :: Bytes
73199
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1231
intensifyN = \<open>Markup.intensifyN\<close>
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1232
intensify :: T
d300574cee4e more robust type signatures, notably for the sake of haskell-stack-trace-plugin-0.1.1.1;
wenzelm
parents: 73178
diff changeset
  1233
intensify = markup_elem intensifyN
69234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1234
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1235
2dec32c7313f more Haskell operations;
wenzelm
parents: 69233
diff changeset
  1236
{- output -}
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1237
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1238
type Output = (Bytes, Bytes)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1239
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1240
no_output :: Output
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1241
no_output = ("", "")
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
  1242
\<close>
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
  1243
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1244
generate_file "Isabelle/Position.hs" = \<open>
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1245
{-  Title:      Isabelle/Position.hs
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1246
    Author:     Makarius
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1247
    LICENSE:    BSD 3-clause (Isabelle)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1248
74173
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1249
Source positions starting from 1; values <= 0 mean "absent". Count Isabelle
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1250
symbols, not UTF8 bytes nor UTF16 characters. Position range specifies a
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1251
right-open interval offset .. end_offset (exclusive).
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1252
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  1253
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/position.ML\<close>.
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1254
-}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1255
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1256
{-# LANGUAGE OverloadedStrings #-}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1257
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1258
module Isabelle.Position (
78307
4c8b04679944 clarified signature;
wenzelm
parents: 78021
diff changeset
  1259
  T, line_of, column_of, offset_of, end_offset_of, label_of, file_of, id_of,
4c8b04679944 clarified signature;
wenzelm
parents: 78021
diff changeset
  1260
  start, none, label, put_file, file, file_only, put_id, id, id_only,
74174
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1261
  symbol, symbol_explode, symbol_explode_string, shift_offsets,
74184
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1262
  of_properties, properties_of, def_properties_of, entity_markup, make_entity_markup,
74187
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  1263
  Report, Report_Text, is_reported, is_reported_range, here,
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1264
  Range, no_range, no_range_position, range_position, range
74184
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1265
)
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1266
where
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1267
74185
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  1268
import Prelude hiding (id)
74168
f0b2136e2204 tuned signature: prefer existing Haskell operations;
wenzelm
parents: 74167
diff changeset
  1269
import Data.Maybe (isJust, fromMaybe)
74182
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
  1270
import Data.Bifunctor (first)
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1271
import qualified Isabelle.Properties as Properties
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1272
import qualified Isabelle.Bytes as Bytes
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1273
import qualified Isabelle.Value as Value
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1274
import Isabelle.Bytes (Bytes)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1275
import qualified Isabelle.Markup as Markup
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1276
import qualified Isabelle.YXML as YXML
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1277
import Isabelle.Library
74173
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1278
import qualified Isabelle.Symbol as Symbol
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1279
import Isabelle.Symbol (Symbol)
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1280
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1281
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1282
{- position -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1283
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1284
data T =
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1285
  Position {
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1286
    _line :: Int,
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1287
    _column :: Int,
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1288
    _offset :: Int,
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1289
    _end_offset :: Int,
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1290
    _label :: Bytes,
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1291
    _file :: Bytes,
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1292
    _id :: Bytes }
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1293
  deriving (Eq, Ord)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1294
74173
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1295
valid, invalid :: Int -> Bool
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1296
valid i = i > 0
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1297
invalid = not . valid
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1298
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1299
maybe_valid :: Int -> Maybe Int
74173
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1300
maybe_valid i = if valid i then Just i else Nothing
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1301
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1302
if_valid :: Int -> Int -> Int
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1303
if_valid i i' = if valid i then i' else i
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1304
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1305
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1306
{- fields -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1307
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1308
line_of, column_of, offset_of, end_offset_of :: T -> Maybe Int
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1309
line_of = maybe_valid . _line
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1310
column_of = maybe_valid . _column
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1311
offset_of = maybe_valid . _offset
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1312
end_offset_of = maybe_valid . _end_offset
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1313
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1314
label_of :: T -> Maybe Bytes
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1315
label_of = proper_string . _label
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1316
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1317
file_of :: T -> Maybe Bytes
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1318
file_of = proper_string . _file
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1319
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1320
id_of :: T -> Maybe Bytes
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1321
id_of = proper_string . _id
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1322
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1323
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1324
{- make position -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1325
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1326
start :: T
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1327
start = Position 1 1 1 0 Bytes.empty Bytes.empty Bytes.empty
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1328
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1329
none :: T
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1330
none = Position 0 0 0 0 Bytes.empty Bytes.empty Bytes.empty
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1331
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1332
label :: Bytes -> T -> T
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1333
label label pos = pos { _label = label }
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1334
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1335
put_file :: Bytes -> T -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1336
put_file file pos = pos { _file = file }
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1337
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1338
file :: Bytes -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1339
file file = put_file file start
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1340
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1341
file_only :: Bytes -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1342
file_only file = put_file file none
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1343
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1344
put_id :: Bytes -> T -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1345
put_id id pos = pos { _id = id }
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1346
74185
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  1347
id :: Bytes -> T
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  1348
id id = put_id id start
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  1349
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  1350
id_only :: Bytes -> T
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  1351
id_only id = put_id id none
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  1352
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1353
74176
wenzelm
parents: 74174
diff changeset
  1354
{- count position -}
wenzelm
parents: 74174
diff changeset
  1355
wenzelm
parents: 74174
diff changeset
  1356
count_line :: Symbol -> Int -> Int
wenzelm
parents: 74174
diff changeset
  1357
count_line "\n" line = if_valid line (line + 1)
wenzelm
parents: 74174
diff changeset
  1358
count_line _ line = line
wenzelm
parents: 74174
diff changeset
  1359
wenzelm
parents: 74174
diff changeset
  1360
count_column :: Symbol -> Int -> Int
wenzelm
parents: 74174
diff changeset
  1361
count_column "\n" column = if_valid column 1
74177
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
  1362
count_column s column = if Symbol.not_eof s then if_valid column (column + 1) else column
74176
wenzelm
parents: 74174
diff changeset
  1363
wenzelm
parents: 74174
diff changeset
  1364
count_offset :: Symbol -> Int -> Int
74177
a8b032dede5c treat Symbol.eof as in ML (but: presently unused);
wenzelm
parents: 74176
diff changeset
  1365
count_offset s offset = if Symbol.not_eof s then if_valid offset (offset + 1) else offset
74173
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1366
74174
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1367
symbol :: Symbol -> T -> T
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1368
symbol s pos =
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1369
  pos {
74176
wenzelm
parents: 74174
diff changeset
  1370
    _line = count_line s (_line pos),
wenzelm
parents: 74174
diff changeset
  1371
    _column = count_column s (_column pos),
wenzelm
parents: 74174
diff changeset
  1372
    _offset = count_offset s (_offset pos) }
74173
8d03d548df1c proper Isabelle symbol positions;
wenzelm
parents: 74172
diff changeset
  1373
74174
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1374
symbol_explode :: BYTES a => a -> T -> T
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1375
symbol_explode = fold symbol . Symbol.explode . make_bytes
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1376
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1377
symbol_explode_string :: String -> T -> T
a3b0fc510705 clarified signature;
wenzelm
parents: 74173
diff changeset
  1378
symbol_explode_string = symbol_explode
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1379
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1380
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1381
{- shift offsets -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1382
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1383
shift_offsets :: Int -> T -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1384
shift_offsets shift pos = pos { _offset = offset', _end_offset = end_offset' }
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1385
  where
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1386
    offset = _offset pos
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1387
    end_offset = _end_offset pos
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1388
    offset' = if invalid offset || invalid shift then offset else offset + shift
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1389
    end_offset' = if invalid end_offset || invalid shift then end_offset else end_offset + shift
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1390
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1391
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1392
{- markup properties -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1393
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1394
get_string :: Properties.T -> Bytes -> Bytes
74168
f0b2136e2204 tuned signature: prefer existing Haskell operations;
wenzelm
parents: 74167
diff changeset
  1395
get_string props name = fromMaybe "" (Properties.get_value Just props name)
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1396
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1397
get_int :: Properties.T -> Bytes -> Int
74168
f0b2136e2204 tuned signature: prefer existing Haskell operations;
wenzelm
parents: 74167
diff changeset
  1398
get_int props name = fromMaybe 0 (Properties.get_value Value.parse_int props name)
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1399
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1400
of_properties :: Properties.T -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1401
of_properties props =
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1402
  none {
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1403
    _line = get_int props Markup.lineN,
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1404
    _offset = get_int props Markup.offsetN,
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1405
    _end_offset = get_int props Markup.end_offsetN,
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1406
    _label = get_string props Markup.labelN,
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1407
    _file = get_string props Markup.fileN,
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1408
    _id = get_string props Markup.idN }
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1409
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1410
string_entry :: Bytes -> Bytes -> Properties.T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1411
string_entry k s = if Bytes.null s then [] else [(k, s)]
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1412
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1413
int_entry :: Bytes -> Int -> Properties.T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1414
int_entry k i = if invalid i then [] else [(k, Value.print_int i)]
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1415
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1416
properties_of :: T -> Properties.T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1417
properties_of pos =
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1418
  int_entry Markup.lineN (_line pos) ++
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1419
  int_entry Markup.offsetN (_offset pos) ++
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1420
  int_entry Markup.end_offsetN (_end_offset pos) ++
78021
ce6e3bc34343 more informative position information;
wenzelm
parents: 77029
diff changeset
  1421
  string_entry Markup.labelN (_label pos) ++
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1422
  string_entry Markup.fileN (_file pos) ++
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1423
  string_entry Markup.idN (_id pos)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1424
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1425
def_properties_of :: T -> Properties.T
74182
72bb7e9143f7 minor performance tuning;
wenzelm
parents: 74178
diff changeset
  1426
def_properties_of = properties_of #> map (first Markup.def_name)
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1427
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1428
entity_markup :: Bytes -> (Bytes, T) -> Markup.T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1429
entity_markup kind (name, pos) =
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1430
  Markup.entity kind name |> Markup.properties (def_properties_of pos)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1431
74184
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1432
make_entity_markup :: Bool -> Int -> Bytes -> (Bytes, T) -> Markup.T
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1433
make_entity_markup def serial kind (name, pos) =
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1434
  let
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1435
    props =
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1436
      if def then (Markup.defN, Value.print_int serial) : properties_of pos
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1437
      else (Markup.refN, Value.print_int serial) : def_properties_of pos
7652f8d29d10 clarified signature;
wenzelm
parents: 74182
diff changeset
  1438
  in Markup.entity kind name |> Markup.properties props
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1439
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1440
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1441
{- reports -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1442
74187
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  1443
type Report = (T, Markup.T)
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  1444
type Report_Text = (Report, Bytes)
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  1445
74167
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1446
is_reported :: T -> Bool
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1447
is_reported pos = isJust (offset_of pos) && isJust (id_of pos)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1448
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1449
is_reported_range :: T -> Bool
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1450
is_reported_range pos = is_reported pos && isJust (end_offset_of pos)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1451
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1452
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1453
{- here: user output -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1454
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1455
here :: T -> Bytes
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1456
here pos = if Bytes.null s2 then "" else s1 <> m1 <> s2 <> m2
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1457
  where
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1458
    props = properties_of pos
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1459
    (m1, m2) = YXML.output_markup (Markup.properties props Markup.position)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1460
    (s1, s2) =
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1461
      case (line_of pos, file_of pos) of
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1462
        (Just i, Nothing) -> (" ", "(line " <> Value.print_int i <> ")")
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1463
        (Just i, Just name) -> (" ", "(line " <> Value.print_int i <> " of " <> quote name <> ")")
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1464
        (Nothing, Just name) -> (" ", "(file " <> quote name <> ")")
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1465
        _ -> if is_reported pos then ("", "\092<^here>") else ("", "")
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1466
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1467
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1468
{- range -}
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1469
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1470
type Range = (T, T)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1471
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1472
no_range :: Range
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1473
no_range = (none, none)
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1474
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1475
no_range_position :: T -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1476
no_range_position pos = pos { _end_offset = 0 }
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1477
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1478
range_position :: Range -> T
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1479
range_position (pos, pos') = pos { _end_offset = _offset pos' }
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1480
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1481
range :: Range -> Range
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1482
range (pos, pos') = (range_position (pos, pos'), no_range_position pos')
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1483
\<close>
25c672c32467 more Haskell operations;
wenzelm
parents: 74161
diff changeset
  1484
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1485
generate_file "Isabelle/XML.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1486
{-  Title:      Isabelle/XML.hs
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1487
    Author:     Makarius
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1488
    LICENSE:    BSD 3-clause (Isabelle)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1489
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1490
Untyped XML trees and representation of ML values.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1491
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  1492
See \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1493
-}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1494
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1495
{-# LANGUAGE OverloadedStrings #-}
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1496
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1497
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1498
module Isabelle.XML (Attributes, Body, Tree(..), wrap_elem, unwrap_elem, content_of)
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1499
where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1500
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1501
import Isabelle.Library
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1502
import qualified Isabelle.Properties as Properties
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1503
import qualified Isabelle.Markup as Markup
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1504
import qualified Isabelle.Buffer as Buffer
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1505
import qualified Isabelle.Bytes as Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1506
import Isabelle.Bytes (Bytes)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1507
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1508
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1509
{- types -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1510
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1511
type Attributes = Properties.T
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1512
type Body = [Tree]
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1513
data Tree = Elem (Markup.T, Body) | Text Bytes
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1514
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1515
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1516
{- wrapped elements -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1517
69482
186b03abb764 tuned signature;
wenzelm
parents: 69480
diff changeset
  1518
wrap_elem :: ((Markup.T, Body), [Tree]) -> Tree
69236
wenzelm
parents: 69234
diff changeset
  1519
wrap_elem (((a, atts), body1), body2) =
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1520
  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
  1521
69482
186b03abb764 tuned signature;
wenzelm
parents: 69480
diff changeset
  1522
unwrap_elem :: Tree -> Maybe ((Markup.T, Body), [Tree])
69236
wenzelm
parents: 69234
diff changeset
  1523
unwrap_elem
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1524
  (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
  1525
  Just (((a, atts), body1), body2)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1526
unwrap_elem _ = Nothing
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1527
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1528
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1529
{- text content -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1530
69482
186b03abb764 tuned signature;
wenzelm
parents: 69480
diff changeset
  1531
add_content :: Tree -> Buffer.T -> Buffer.T
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1532
add_content tree =
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1533
  case unwrap_elem tree of
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1534
    Just (_, ts) -> fold add_content ts
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1535
    Nothing ->
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1536
      case tree of
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1537
        Elem (_, ts) -> fold add_content ts
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1538
        Text s -> Buffer.add s
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1539
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1540
content_of :: Body -> Bytes
74231
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
  1541
content_of = Buffer.build_content . fold add_content
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1542
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1543
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1544
{- string representation -}
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1545
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1546
encode_char :: Char -> String
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1547
encode_char '<' = "&lt;"
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1548
encode_char '>' = "&gt;"
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1549
encode_char '&' = "&amp;"
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1550
encode_char '\'' = "&apos;"
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1551
encode_char '\"' = "&quot;"
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1552
encode_char c = [c]
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1553
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1554
encode_text :: Bytes -> Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1555
encode_text = make_bytes . concatMap (encode_char . Bytes.char) . Bytes.unpack
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1556
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1557
instance Show Tree where
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1558
  show tree =
74231
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
  1559
    make_string $ Buffer.build_content (show_tree tree)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1560
    where
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1561
      show_tree (Elem ((name, atts), [])) =
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1562
        Buffer.add "<" #> Buffer.add (show_elem name atts) #> Buffer.add "/>"
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1563
      show_tree (Elem ((name, atts), ts)) =
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1564
        Buffer.add "<" #> Buffer.add (show_elem name atts) #> Buffer.add ">" #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1565
        fold show_tree ts #>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1566
        Buffer.add "</" #> Buffer.add name #> Buffer.add ">"
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1567
      show_tree (Text s) = Buffer.add (encode_text s)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1568
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1569
      show_elem name atts =
80910
406a85a25189 clarified signature: more explicit operations;
wenzelm
parents: 80601
diff changeset
  1570
        implode_space (name : map (\(a, x) -> a <> "=\"" <> encode_text x <> "\"") atts)
69225
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1571
\<close>
bf2fecda8383 support for Isabelle tools in Haskell;
wenzelm
parents: 69222
diff changeset
  1572
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1573
generate_file "Isabelle/XML/Encode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1574
{-  Title:      Isabelle/XML/Encode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1575
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1576
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1577
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1578
XML as data representation language.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1579
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  1580
See \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1581
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1582
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1583
{-# LANGUAGE OverloadedStrings #-}
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1584
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1585
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1586
module Isabelle.XML.Encode (
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  1587
  A, T, V, P,
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1588
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1589
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1590
71490
3488c0eb4cc8 more complete signature;
wenzelm
parents: 71489
diff changeset
  1591
  tree, properties, string, int, bool, unit, pair, triple, list, option, variant
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1592
)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1593
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1594
74168
f0b2136e2204 tuned signature: prefer existing Haskell operations;
wenzelm
parents: 74167
diff changeset
  1595
import Data.Maybe (fromJust)
f0b2136e2204 tuned signature: prefer existing Haskell operations;
wenzelm
parents: 74167
diff changeset
  1596
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1597
import Isabelle.Library
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1598
import Isabelle.Bytes (Bytes)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1599
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1600
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1601
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1602
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1603
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1604
type A a = a -> Bytes
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1605
type T a = a -> XML.Body
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1606
type V a = a -> Maybe ([Bytes], XML.Body)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1607
type P a = a -> [Bytes]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1608
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1609
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1610
-- atomic values
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1611
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1612
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1613
int_atom = Value.print_int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1614
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1615
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1616
bool_atom False = "0"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1617
bool_atom True = "1"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1618
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1619
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1620
unit_atom () = ""
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1621
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1622
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1623
-- structural nodes
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1624
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1625
node ts = XML.Elem ((":", []), ts)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1626
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1627
vector = map_index (\(i, x) -> (int_atom i, x))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1628
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1629
tagged (tag, (xs, ts)) = XML.Elem ((int_atom tag, vector xs), ts)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1630
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1631
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1632
-- representation of standard types
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1633
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1634
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1635
tree t = [t]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1636
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1637
properties :: T Properties.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1638
properties props = [XML.Elem ((":", props), [])]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1639
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1640
string :: T Bytes
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1641
string "" = []
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1642
string s = [XML.Text s]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1643
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1644
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1645
int = string . int_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1646
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1647
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1648
bool = string . bool_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1649
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1650
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1651
unit = string . unit_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1652
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1653
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1654
pair f g (x, y) = [node (f x), node (g y)]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1655
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1656
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1657
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
  1658
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1659
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1660
list f xs = map (node . f) xs
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1661
71490
3488c0eb4cc8 more complete signature;
wenzelm
parents: 71489
diff changeset
  1662
option :: T a -> T (Maybe a)
3488c0eb4cc8 more complete signature;
wenzelm
parents: 71489
diff changeset
  1663
option _ Nothing = []
3488c0eb4cc8 more complete signature;
wenzelm
parents: 71489
diff changeset
  1664
option f (Just x) = [node (f x)]
3488c0eb4cc8 more complete signature;
wenzelm
parents: 71489
diff changeset
  1665
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1666
variant :: [V a] -> T a
74168
f0b2136e2204 tuned signature: prefer existing Haskell operations;
wenzelm
parents: 74167
diff changeset
  1667
variant fs x = [tagged (fromJust (get_index (\f -> f x) fs))]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1668
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1669
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1670
generate_file "Isabelle/XML/Decode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1671
{-  Title:      Isabelle/XML/Decode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1672
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1673
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1674
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1675
XML as data representation language.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  1676
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  1677
See \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1678
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1679
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1680
{-# LANGUAGE OverloadedStrings #-}
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1681
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1682
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1683
module Isabelle.XML.Decode (
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  1684
  A, T, V, P,
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1685
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1686
  int_atom, bool_atom, unit_atom,
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1687
71490
3488c0eb4cc8 more complete signature;
wenzelm
parents: 71489
diff changeset
  1688
  tree, properties, string, int, bool, unit, pair, triple, list, option, variant
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1689
)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1690
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1691
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1692
import Isabelle.Library
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1693
import Isabelle.Bytes (Bytes)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1694
import qualified Isabelle.Value as Value
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1695
import qualified Isabelle.Properties as Properties
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1696
import qualified Isabelle.XML as XML
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1697
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1698
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1699
type A a = Bytes -> a
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1700
type T a = XML.Body -> a
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1701
type V a = ([Bytes], XML.Body) -> a
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1702
type P a = [Bytes] -> a
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1703
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1704
err_atom = error "Malformed XML atom"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1705
err_body = error "Malformed XML body"
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1706
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1707
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1708
{- atomic values -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1709
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1710
int_atom :: A Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1711
int_atom s =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1712
  case Value.parse_int s of
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1713
    Just i -> i
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1714
    Nothing -> err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1715
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1716
bool_atom :: A Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1717
bool_atom "0" = False
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1718
bool_atom "1" = True
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1719
bool_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1720
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1721
unit_atom :: A ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1722
unit_atom "" = ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1723
unit_atom _ = err_atom
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1724
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1725
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1726
{- structural nodes -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1727
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1728
node (XML.Elem ((":", []), ts)) = ts
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1729
node _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1730
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1731
vector atts =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1732
  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
  1733
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1734
tagged (XML.Elem ((name, atts), ts)) = (int_atom name, (vector atts, ts))
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1735
tagged _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1736
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1737
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1738
{- representation of standard types -}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1739
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1740
tree :: T XML.Tree
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1741
tree [t] = t
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1742
tree _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1743
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1744
properties :: T Properties.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1745
properties [XML.Elem ((":", props), [])] = props
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1746
properties _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1747
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1748
string :: T Bytes
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1749
string [] = ""
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1750
string [XML.Text s] = s
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1751
string _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1752
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1753
int :: T Int
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1754
int = int_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1755
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1756
bool :: T Bool
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1757
bool = bool_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1758
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1759
unit :: T ()
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1760
unit = unit_atom . string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1761
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1762
pair :: T a -> T b -> T (a, b)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1763
pair f g [t1, t2] = (f (node t1), g (node t2))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1764
pair _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1765
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1766
triple :: T a -> T b -> T c -> T (a, b, c)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1767
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
  1768
triple _ _ _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1769
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1770
list :: T a -> T [a]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1771
list f ts = map (f . node) ts
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1772
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1773
option :: T a -> T (Maybe a)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1774
option _ [] = Nothing
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1775
option f [t] = Just (f (node t))
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1776
option _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1777
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1778
variant :: [V a] -> T a
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1779
variant fs [t] = (fs !! tag) (xs, ts)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1780
  where (tag, (xs, ts)) = tagged t
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1781
variant _ _ = err_body
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1782
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  1783
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  1784
generate_file "Isabelle/YXML.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  1785
{-  Title:      Isabelle/YXML.hs
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1786
    Author:     Makarius
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1787
    LICENSE:    BSD 3-clause (Isabelle)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1788
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1789
Efficient text representation of XML trees.  Suitable for direct
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1790
inlining into plain text.
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1791
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  1792
See \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/yxml.ML\<close>.
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1793
-}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1794
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1795
{-# LANGUAGE OverloadedStrings #-}
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1796
{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-incomplete-patterns #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  1797
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1798
module Isabelle.YXML (charX, charY, strX, strY, detect, output_markup,
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1799
  buffer_body, buffer, string_of_body, string_of, parse_body, parse)
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1800
where
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1801
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1802
import qualified Data.List as List
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1803
import Data.Word (Word8)
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1804
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1805
import Isabelle.Library
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1806
import qualified Isabelle.Bytes as Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1807
import Isabelle.Bytes (Bytes)
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1808
import qualified Isabelle.Markup as Markup
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1809
import qualified Isabelle.XML as XML
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1810
import qualified Isabelle.Buffer as Buffer
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1811
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1812
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1813
{- markers -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1814
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1815
charX, charY :: Word8
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1816
charX = 5
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1817
charY = 6
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1818
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1819
strX, strY, strXY, strXYX :: Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1820
strX = Bytes.singleton charX
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1821
strY = Bytes.singleton charY
74081
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
  1822
strXY = strX <> strY
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
  1823
strXYX = strXY <> strX
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1824
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1825
detect :: Bytes -> Bool
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1826
detect = Bytes.any (\c -> c == charX || c == charY)
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1827
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1828
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1829
{- output -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1830
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1831
output_markup :: Markup.T -> Markup.Output
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1832
output_markup markup@(name, atts) =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1833
  if Markup.is_empty markup then Markup.no_output
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1834
  else (strXY <> name <> Bytes.concat (map (\(a, x) -> strY <> a <> "=" <> x) atts) <> strX, strXYX)
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1835
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1836
buffer_attrib (a, x) =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1837
  Buffer.add strY #> Buffer.add a #> Buffer.add "=" #> Buffer.add x
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1838
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1839
buffer_body :: XML.Body -> Buffer.T -> Buffer.T
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1840
buffer_body = fold buffer
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1841
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1842
buffer :: XML.Tree -> Buffer.T -> Buffer.T
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  1843
buffer (XML.Elem ((name, atts), ts)) =
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1844
  Buffer.add strXY #> Buffer.add name #> fold buffer_attrib atts #> Buffer.add strX #>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1845
  buffer_body ts #>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1846
  Buffer.add strXYX
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1847
buffer (XML.Text s) = Buffer.add s
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1848
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1849
string_of_body :: XML.Body -> Bytes
74231
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
  1850
string_of_body = Buffer.build_content . buffer_body
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1851
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1852
string_of :: XML.Tree -> Bytes
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1853
string_of = string_of_body . single
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1854
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1855
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1856
{- parse -}
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1857
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1858
-- split: fields or non-empty tokens
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1859
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1860
split :: Bool -> Word8 -> [Word8] -> [[Word8]]
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1861
split _ _ [] = []
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1862
split fields sep str = splitting str
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1863
  where
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1864
    splitting rest =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1865
      case span (/= sep) rest of
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1866
        (_, []) -> cons rest []
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1867
        (prfx, _ : rest') -> cons prfx (splitting rest')
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1868
    cons item = if fields || not (null item) then (:) item else id
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1869
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1870
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1871
-- structural errors
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1872
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1873
err :: Bytes -> a
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1874
err msg = error (make_string ("Malformed YXML: " <> msg))
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1875
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1876
err_attribute = err "bad attribute"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1877
err_element = err "bad element"
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1878
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1879
err_unbalanced :: Bytes -> a
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1880
err_unbalanced name =
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1881
  if Bytes.null name then err "unbalanced element"
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1882
  else err ("unbalanced element " <> quote name)
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1883
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1884
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1885
-- stack operations
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1886
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1887
add x ((elem, body) : pending) = (elem, x : body) : pending
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1888
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1889
push name atts pending =
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1890
  if Bytes.null name then err_element
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1891
  else ((name, atts), []) : pending
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1892
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1893
pop (((name, atts), body) : pending) =
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1894
  if Bytes.null name then err_unbalanced name
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1895
  else add (XML.Elem ((name, atts), reverse body)) pending
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1896
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1897
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1898
-- parsing
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1899
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1900
parse_attrib s =
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1901
  case List.elemIndex (Bytes.byte '=') s of
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1902
    Just i | i > 0 -> (Bytes.pack $ take i s, Bytes.pack $ drop (i + 1) s)
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1903
    _ -> err_attribute
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1904
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1905
parse_chunk [[], []] = pop
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1906
parse_chunk ([] : name : atts) = push (Bytes.pack name) (map parse_attrib atts)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1907
parse_chunk txts = fold (add . XML.Text . Bytes.pack) txts
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1908
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1909
parse_body :: Bytes -> XML.Body
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1910
parse_body source =
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1911
  case fold parse_chunk chunks [((Bytes.empty, []), [])] of
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1912
    [((name, _), result)] | Bytes.null name -> reverse result
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1913
    ((name, _), _) : _ -> err_unbalanced name
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1914
  where chunks = source |> Bytes.unpack |> split False charX |> map (split True charY)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1915
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1916
parse :: Bytes -> XML.Tree
69288
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1917
parse source =
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1918
  case parse_body source of
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1919
    [result] -> result
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1920
    [] -> XML.Text ""
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1921
    _ -> err "multiple results"
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1922
\<close>
4c3704ecb0e6 more Haskell operations;
wenzelm
parents: 69287
diff changeset
  1923
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1924
generate_file "Isabelle/Completion.hs" = \<open>
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1925
{-  Title:      Isabelle/Completion.hs
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1926
    Author:     Makarius
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1927
    LICENSE:    BSD 3-clause (Isabelle)
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1928
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1929
Completion of names.
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1930
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  1931
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/completion.ML\<close>.
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1932
-}
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1933
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1934
{-# LANGUAGE OverloadedStrings #-}
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1935
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1936
module Isabelle.Completion (
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1937
    Name, T, names, none, make, markup_element, markup_report, make_report
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1938
  ) where
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1939
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1940
import qualified Isabelle.Bytes as Bytes
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1941
import qualified Isabelle.Name as Name
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1942
import Isabelle.Name (Name)
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1943
import qualified Isabelle.Properties as Properties
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1944
import qualified Isabelle.Markup as Markup
74129
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  1945
import Isabelle.XML.Classes
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1946
import qualified Isabelle.XML as XML
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1947
import qualified Isabelle.YXML as YXML
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1948
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1949
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1950
type Names = [(Name, (Name, Name))]  -- external name, kind, internal name
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1951
data T = Completion Properties.T Int Names  -- position, total length, names
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1952
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1953
names :: Int -> Properties.T -> Names -> T
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1954
names limit props names = Completion props (length names) (take limit names)
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1955
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1956
none :: T
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1957
none = names 0 [] []
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1958
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1959
make :: Int -> (Name, Properties.T) -> ((Name -> Bool) -> Names) -> T
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1960
make limit (name, props) make_names =
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1961
  if name /= "" && name /= "_" then
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1962
    names limit props (make_names (Bytes.isPrefixOf (Name.clean name)))
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1963
  else none
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1964
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1965
markup_element :: T -> (Markup.T, XML.Body)
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1966
markup_element (Completion props total names) =
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1967
  if not (null names) then
74129
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  1968
    (Markup.properties props Markup.completion, encode (total, names))
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1969
  else (Markup.empty, [])
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1970
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1971
markup_report :: [T] -> Name
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  1972
markup_report [] = Bytes.empty
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1973
markup_report elems =
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1974
  YXML.string_of $ XML.Elem (Markup.report, map (XML.Elem . markup_element) elems)
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1975
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  1976
make_report :: Int -> (Name, Properties.T) -> ((Name -> Bool) -> Names) -> Name
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1977
make_report limit name_props make_names =
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1978
  markup_report [make limit name_props make_names]
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1979
\<close>
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1980
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1981
generate_file "Isabelle/File.hs" = \<open>
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1982
{-  Title:      Isabelle/File.hs
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1983
    Author:     Makarius
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1984
    LICENSE:    BSD 3-clause (Isabelle)
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1985
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1986
File-system operations.
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1987
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  1988
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/file.ML\<close>.
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1989
-}
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1990
74098
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  1991
module Isabelle.File (read, write, append) where
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1992
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1993
import Prelude hiding (read)
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  1994
import qualified System.IO as IO
74098
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  1995
import qualified Data.ByteString as ByteString
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  1996
import qualified Isabelle.Bytes as Bytes
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  1997
import Isabelle.Bytes (Bytes)
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  1998
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  1999
read :: IO.FilePath -> IO Bytes
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  2000
read path = Bytes.make <$> IO.withFile path IO.ReadMode ByteString.hGetContents
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  2001
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  2002
write :: IO.FilePath -> Bytes -> IO ()
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  2003
write path bs = IO.withFile path IO.WriteMode (\h -> ByteString.hPut h (Bytes.unmake bs))
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  2004
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  2005
append :: IO.FilePath -> Bytes -> IO ()
5aaccec7c1a1 clarified signature;
wenzelm
parents: 74096
diff changeset
  2006
append path bs = IO.withFile path IO.AppendMode (\h -> ByteString.hPut h (Bytes.unmake bs))
74091
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  2007
\<close>
5721f1843e93 clarified order of modules;
wenzelm
parents: 74090
diff changeset
  2008
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  2009
generate_file "Isabelle/Pretty.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  2010
{-  Title:      Isabelle/Pretty.hs
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2011
    Author:     Makarius
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2012
    LICENSE:    BSD 3-clause (Isabelle)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2013
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2014
Generic pretty printing module.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  2015
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  2016
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/pretty.ML\<close>.
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2017
-}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2018
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2019
{-# LANGUAGE OverloadedStrings #-}
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  2020
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  2021
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2022
module Isabelle.Pretty (
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2023
  T, symbolic, formatted, unformatted,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2024
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2025
  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
  2026
  item, text_fold, keyword1, keyword2, text, paragraph, para, quote, cartouche, separate,
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2027
  commas, enclose, enum, list, str_list, big_list)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2028
where
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2029
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2030
import qualified Data.List as List
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2031
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2032
import qualified Isabelle.Bytes as Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2033
import Isabelle.Bytes (Bytes)
74185
2508ea6a9a11 more Isabelle/Haskell operations;
wenzelm
parents: 74184
diff changeset
  2034
import Isabelle.Library hiding (enclose, quote, separate, commas)
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2035
import qualified Isabelle.Buffer as Buffer
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2036
import qualified Isabelle.Markup as Markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2037
import qualified Isabelle.XML as XML
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2038
import qualified Isabelle.YXML as YXML
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2039
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2040
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2041
data T =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2042
    Block Markup.T Bool Int [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2043
  | Break Int Int
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2044
  | Str Bytes
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2045
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2046
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2047
{- output -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2048
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2049
symbolic_text s = if Bytes.null s then [] else [XML.Text s]
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2050
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2051
symbolic_markup markup body =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2052
  if Markup.is_empty markup then body
69290
fb77612d11eb tuned signature;
wenzelm
parents: 69289
diff changeset
  2053
  else [XML.Elem (markup, body)]
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2054
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2055
symbolic :: T -> XML.Body
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2056
symbolic (Block markup consistent indent prts) =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2057
  concatMap symbolic prts
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2058
  |> symbolic_markup block_markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2059
  |> symbolic_markup markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2060
  where block_markup = if null prts then Markup.empty else Markup.block consistent indent
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2061
symbolic (Break wd ind) = [XML.Elem (Markup.break wd ind, symbolic_text (Bytes.spaces wd))]
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2062
symbolic (Str s) = symbolic_text s
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2063
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2064
formatted :: T -> Bytes
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2065
formatted = YXML.string_of_body . symbolic
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2066
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2067
unformatted :: T -> Bytes
74231
b3c65c984210 tuned signature;
wenzelm
parents: 74218
diff changeset
  2068
unformatted = Buffer.build_content . out
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2069
  where
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2070
    out (Block markup _ _ prts) =
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2071
      let (bg, en) = YXML.output_markup markup
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2072
      in Buffer.add bg #> fold out prts #> Buffer.add en
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2073
    out (Break _ wd) = Buffer.add (Bytes.spaces wd)
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2074
    out (Str s) = Buffer.add s
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2075
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2076
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2077
{- derived operations to create formatting expressions -}
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2078
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2079
force_nat n | n < 0 = 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2080
force_nat n = n
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2081
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2082
str :: BYTES a => a -> T
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2083
str = Str . make_bytes
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2084
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2085
brk_indent :: Int -> Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2086
brk_indent wd ind = Break (force_nat wd) ind
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2087
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2088
brk :: Int -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2089
brk wd = brk_indent wd 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2090
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2091
fbrk :: T
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2092
fbrk = Str "\n"
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2093
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2094
breaks, fbreaks :: [T] -> [T]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2095
breaks = List.intersperse (brk 1)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2096
fbreaks = List.intersperse fbrk
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2097
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2098
blk :: (Int, [T]) -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2099
blk (indent, es) = Block Markup.empty False (force_nat indent) es
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2100
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2101
block :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2102
block prts = blk (2, prts)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2103
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2104
strs :: BYTES a => [a] -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2105
strs = block . breaks . map str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2106
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2107
markup :: Markup.T -> [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2108
markup m = Block m False 0
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2109
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2110
mark :: Markup.T -> T -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2111
mark m prt = if m == Markup.empty then prt else markup m [prt]
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2112
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2113
mark_str :: BYTES a => (Markup.T, a) -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2114
mark_str (m, s) = mark m (str s)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2115
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2116
marks_str :: BYTES a => ([Markup.T], a) -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2117
marks_str (ms, s) = fold_rev mark ms (str s)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2118
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2119
item :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2120
item = markup Markup.item
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2121
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2122
text_fold :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2123
text_fold = markup Markup.text_fold
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2124
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2125
keyword1, keyword2 :: BYTES a => a -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2126
keyword1 name = mark_str (Markup.keyword1, name)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2127
keyword2 name = mark_str (Markup.keyword2, name)
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2128
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2129
text :: BYTES a => a -> [T]
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
  2130
text = breaks . map str . filter (not . Bytes.null) . space_explode ' ' . make_bytes
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2131
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2132
paragraph :: [T] -> T
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2133
paragraph = markup Markup.paragraph
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2134
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2135
para :: BYTES a => a -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2136
para = paragraph . text
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2137
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2138
quote :: T -> T
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2139
quote prt = blk (1, [Str "\"", prt, Str "\""])
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2140
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2141
cartouche :: T -> T
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2142
cartouche prt = blk (1, [Str "\92<open>", prt, Str "\92<close>"])
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2143
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2144
separate :: BYTES a => a -> [T] -> [T]
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2145
separate sep = List.intercalate [str sep, brk 1] . map single
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2146
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2147
commas :: [T] -> [T]
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2148
commas = separate ("," :: Bytes)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2149
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2150
enclose :: BYTES a => a -> a -> [T] -> T
74081
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
  2151
enclose lpar rpar prts = block (str lpar : prts <> [str rpar])
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2152
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2153
enum :: BYTES a => a -> a -> a -> [T] -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2154
enum sep lpar rpar = enclose lpar rpar . separate sep
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2155
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2156
list :: BYTES a => a -> a -> [T] -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2157
list = enum ","
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2158
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2159
str_list :: BYTES a => a -> a -> [a] -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2160
str_list lpar rpar = list lpar rpar . map str
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2161
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2162
big_list :: BYTES a => a -> [T] -> T
69248
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2163
big_list name prts = block (fbreaks (str name : prts))
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2164
\<close>
9f21381600e3 more Haskell operations;
wenzelm
parents: 69240
diff changeset
  2165
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2166
generate_file "Isabelle/Name.hs" = \<open>
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2167
{-  Title:      Isabelle/Name.hs
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2168
    Author:     Makarius
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2169
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2170
Names of basic logical entities (variables etc.).
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2171
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  2172
See \<^file>\<open>$ISABELLE_HOME/src/Pure/name.ML\<close>.
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2173
-}
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2174
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2175
{-# LANGUAGE OverloadedStrings #-}
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2176
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2177
module Isabelle.Name (
74194
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2178
  Name,
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2179
  uu, uu_, aT,
74217
736374547a7f more Isabelle/Haskell operations;
wenzelm
parents: 74216
diff changeset
  2180
  clean_index, clean, internal, skolem, is_internal, is_skolem, dest_internal, dest_skolem,
80601
4e8845bbcd81 clarified signature: more robust operations;
wenzelm
parents: 80589
diff changeset
  2181
  Context, declare, declare_renamed, is_declared, declared, context, make_context,
74327
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
  2182
  variant, variant_list
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2183
)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2184
where
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2185
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2186
import Data.Maybe (fromMaybe)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2187
import Data.Map.Strict (Map)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2188
import qualified Data.Map.Strict as Map
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2189
import Data.Word (Word8)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2190
import qualified Isabelle.Bytes as Bytes
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2191
import Isabelle.Bytes (Bytes)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2192
import qualified Isabelle.Symbol as Symbol
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2193
import Isabelle.Library
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2194
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2195
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2196
type Name = Bytes
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2197
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2198
74194
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2199
{- common defaults -}
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2200
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2201
uu, uu_, aT :: Name
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2202
uu = "uu"
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2203
uu_ = "uu_"
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2204
aT = "'a"
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2205
ffe24c7da1c6 more Isabelle/Haskell operations;
wenzelm
parents: 74188
diff changeset
  2206
74196
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2207
{- internal names -- NB: internal subsumes skolem -}
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2208
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2209
underscore :: Word8
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2210
underscore = Bytes.byte '_'
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2211
74196
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2212
internal, skolem :: Name -> Name
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2213
internal x = x <> "_"
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2214
skolem x = x <> "__"
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2215
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2216
is_internal, is_skolem :: Name -> Bool
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2217
is_internal = Bytes.isSuffixOf "_"
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2218
is_skolem = Bytes.isSuffixOf "__"
6dc7ff326906 more Isabelle/Haskell operations;
wenzelm
parents: 74195
diff changeset
  2219
74217
736374547a7f more Isabelle/Haskell operations;
wenzelm
parents: 74216
diff changeset
  2220
dest_internal, dest_skolem :: Name -> Maybe Name
736374547a7f more Isabelle/Haskell operations;
wenzelm
parents: 74216
diff changeset
  2221
dest_internal = Bytes.try_unsuffix "_"
736374547a7f more Isabelle/Haskell operations;
wenzelm
parents: 74216
diff changeset
  2222
dest_skolem = Bytes.try_unsuffix "__"
736374547a7f more Isabelle/Haskell operations;
wenzelm
parents: 74216
diff changeset
  2223
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2224
clean_index :: (Name, Int) -> (Name, Int)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2225
clean_index (x, i) =
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2226
  case dest_internal x of
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2227
    Nothing -> (x, i)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2228
    Just x' -> clean_index (x', i + 1)
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2229
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2230
clean :: Name -> Name
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2231
clean x = fst (clean_index (x, 0))
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2232
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2233
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2234
{- context for used names -}
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2235
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2236
newtype Context = Context (Map Name (Maybe Name))  {-declared names with latest renaming-}
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2237
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2238
declare :: Name -> Context -> Context
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2239
declare x (Context names) =
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2240
  Context (
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2241
    let a = clean x
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2242
    in if Map.member a names then names else Map.insert a Nothing names)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2243
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2244
declare_renaming :: (Name, Name) -> Context -> Context
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2245
declare_renaming (x, x') (Context names) =
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2246
  Context (Map.insert (clean x) (Just (clean x')) names)
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2247
80601
4e8845bbcd81 clarified signature: more robust operations;
wenzelm
parents: 80589
diff changeset
  2248
declare_renamed :: (Name, Name) -> Context -> Context
4e8845bbcd81 clarified signature: more robust operations;
wenzelm
parents: 80589
diff changeset
  2249
declare_renamed (x, x') =
4e8845bbcd81 clarified signature: more robust operations;
wenzelm
parents: 80589
diff changeset
  2250
  (if clean x /= clean x' then declare_renaming (x, x') else id) #> declare x'
4e8845bbcd81 clarified signature: more robust operations;
wenzelm
parents: 80589
diff changeset
  2251
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2252
is_declared :: Context -> Name -> Bool
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2253
is_declared (Context names) x = Map.member x names
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2254
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2255
declared :: Context -> Name -> Maybe (Maybe Name)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2256
declared (Context names) a = Map.lookup a names
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2257
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2258
context :: Context
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2259
context = Context Map.empty |> fold declare ["", "'"]
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2260
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2261
make_context :: [Name] -> Context
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2262
make_context used = fold declare used context
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2263
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2264
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2265
{- generating fresh names -}
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2266
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2267
bump_init :: Name -> Name
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2268
bump_init str = str <> "a"
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2269
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2270
bump_string :: Name -> Name
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2271
bump_string str =
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2272
  let
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2273
    a = Bytes.byte 'a'
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2274
    z = Bytes.byte 'z'
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2275
    bump (b : bs) | b == z = a : bump bs
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2276
    bump (b : bs) | a <= b && b < z = b + 1 : bs
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2277
    bump bs = a : bs
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2278
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2279
    rev = reverse (Bytes.unpack str)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2280
    part2 = reverse (takeWhile (Symbol.is_ascii_quasi . Bytes.char) rev)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2281
    part1 = reverse (bump (drop (length part2) rev))
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2282
  in Bytes.pack (part1 <> part2)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2283
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2284
variant :: Name -> Context -> (Name, Context)
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2285
variant name ctxt =
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2286
  let
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2287
    vary x =
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2288
      case declared ctxt x of
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2289
        Nothing -> x
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2290
        Just x' -> vary (bump_string (fromMaybe x x'))
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2291
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2292
    (x, n) = clean_index (name, 0)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2293
    (x', ctxt') =
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2294
      if not (is_declared ctxt x) then (x, declare x ctxt)
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2295
      else
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2296
        let
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2297
          x0 = bump_init x
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2298
          x' = vary x0
80601
4e8845bbcd81 clarified signature: more robust operations;
wenzelm
parents: 80589
diff changeset
  2299
          ctxt' = ctxt |> declare_renamed (x0, x')
74315
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2300
        in (x', ctxt')
30a0f5879d90 clarified operations: follow Isabelle/ML more closely;
wenzelm
parents: 74310
diff changeset
  2301
  in (x' <> Bytes.pack (replicate n underscore), ctxt')
74327
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
  2302
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
  2303
variant_list :: [Name] -> [Name] -> [Name]
9dca3df78b6a more operations from Isabelle/ML;
wenzelm
parents: 74315
diff changeset
  2304
variant_list used names = fst (make_context used |> fold_map variant names)
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2305
\<close>
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2306
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  2307
generate_file "Isabelle/Term.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  2308
{-  Title:      Isabelle/Term.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2309
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2310
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2311
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2312
Lambda terms, types, sorts.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  2313
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  2314
See \<^file>\<open>$ISABELLE_HOME/src/Pure/term.scala\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2315
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2316
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2317
{-# LANGUAGE OverloadedStrings #-}
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2318
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2319
module Isabelle.Term (
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2320
  Indexname, Sort, Typ(..), Term(..),
74214
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2321
  Free, lambda, declare_frees, incr_boundvars, subst_bound, dest_lambda, strip_lambda,
74197
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2322
  type_op0, type_op1, op0, op1, op2, typed_op0, typed_op1, typed_op2, binder,
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2323
  dummyS, dummyT, is_dummyT, propT, is_propT, (-->), dest_funT, (--->),
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2324
  aconv, list_comb, strip_comb, head_of
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2325
)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2326
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2327
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2328
import Isabelle.Library
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2329
import qualified Isabelle.Name as Name
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2330
import Isabelle.Name (Name)
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2331
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2332
infixr 5 -->
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2333
infixr --->
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2334
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2335
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2336
{- types and terms -}
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2337
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2338
type Indexname = (Name, Int)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2339
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2340
type Sort = [Name]
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2341
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2342
data Typ =
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2343
    Type (Name, [Typ])
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2344
  | TFree (Name, Sort)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2345
  | TVar (Indexname, Sort)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2346
  deriving (Show, Eq, Ord)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2347
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2348
data Term =
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2349
    Const (Name, [Typ])
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2350
  | Free (Name, Typ)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2351
  | Var (Indexname, Typ)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2352
  | Bound Int
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2353
  | Abs (Name, Typ, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2354
  | App (Term, Term)
80568
fbb655bf62d4 clarified Isabelle/Haskell type Term, following Isabelle/Scala (see 446b887e23c7);
wenzelm
parents: 79741
diff changeset
  2355
  | OFCLASS (Typ, Name)
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2356
  deriving (Show, Eq, Ord)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2357
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2358
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2359
{- free and bound variables -}
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2360
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2361
type Free = (Name, Typ)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2362
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2363
lambda :: Free -> Term -> Term
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2364
lambda (name, typ) body = Abs (name, typ, abstract 0 body)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2365
  where
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2366
    abstract lev (Free (x, ty)) | name == x && typ == ty = Bound lev
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2367
    abstract lev (Abs (a, ty, t)) = Abs (a, ty, abstract (lev + 1) t)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2368
    abstract lev (App (t, u)) = App (abstract lev t, abstract lev u)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2369
    abstract _ t = t
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2370
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2371
declare_frees :: Term -> Name.Context -> Name.Context
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2372
declare_frees (Free (x, _)) = Name.declare x
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2373
declare_frees (Abs (_, _, b)) = declare_frees b
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2374
declare_frees (App (t, u)) = declare_frees t #> declare_frees u
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2375
declare_frees _ = id
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2376
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2377
incr_boundvars :: Int -> Term -> Term
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2378
incr_boundvars inc = if inc == 0 then id else incr 0
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2379
  where
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2380
    incr lev (Bound i) = if i >= lev then Bound (i + inc) else Bound i
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2381
    incr lev (Abs (a, ty, b)) = Abs (a, ty, incr (lev + 1) b)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2382
    incr lev (App (t, u)) = App (incr lev t, incr lev u)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2383
    incr _ t = t
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2384
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2385
subst_bound :: Term -> Term -> Term
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2386
subst_bound arg = subst 0
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2387
  where
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2388
    subst lev (Bound i) =
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2389
      if i < lev then Bound i
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2390
      else if i == lev then incr_boundvars lev arg
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2391
      else Bound (i - 1)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2392
    subst lev (Abs (a, ty, b)) = Abs (a, ty, subst (lev + 1) b)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2393
    subst lev (App (t, u)) = App (subst lev t, subst lev u)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2394
    subst _ t = t
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2395
74214
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2396
dest_lambda :: Name.Context -> Term -> Maybe (Free, Term)
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2397
dest_lambda names (Abs (x, ty, b)) =
74106
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2398
  let
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2399
    (x', _) = Name.variant x (declare_frees b names)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2400
    v = (x', ty)
4984fad0e91d more operations, notably free and bound variables as in Isabelle/Pure;
wenzelm
parents: 74105
diff changeset
  2401
  in Just (v, subst_bound (Free v) b)
74214
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2402
dest_lambda _ _ = Nothing
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2403
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2404
strip_lambda :: Name.Context -> Term -> ([Free], Term)
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2405
strip_lambda names tm =
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2406
  case dest_lambda names tm of
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2407
    Just (v, t) ->
74214
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2408
      let (vs, t') = strip_lambda names t'
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2409
      in (v : vs, t')
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2410
    Nothing -> ([], tm)
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2411
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2412
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2413
{- type and term operators -}
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2414
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2415
type_op0 :: Name -> (Typ, Typ -> Bool)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2416
type_op0 name = (mk, is)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2417
  where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2418
    mk = Type (name, [])
74205
5f0f0553762f proper test for type constructor;
wenzelm
parents: 74204
diff changeset
  2419
    is (Type (c, _)) = c == name
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2420
    is _ = False
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2421
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2422
type_op1 :: Name -> (Typ -> Typ, Typ -> Maybe Typ)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2423
type_op1 name = (mk, dest)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2424
  where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2425
    mk ty = Type (name, [ty])
74205
5f0f0553762f proper test for type constructor;
wenzelm
parents: 74204
diff changeset
  2426
    dest (Type (c, [ty])) | c == name = Just ty
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2427
    dest _ = Nothing
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2428
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2429
type_op2 :: Name -> (Typ -> Typ -> Typ, Typ -> Maybe (Typ, Typ))
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2430
type_op2 name = (mk, dest)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2431
  where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2432
    mk ty1 ty2 = Type (name, [ty1, ty2])
74205
5f0f0553762f proper test for type constructor;
wenzelm
parents: 74204
diff changeset
  2433
    dest (Type (c, [ty1, ty2])) | c == name = Just (ty1, ty2)
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2434
    dest _ = Nothing
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2435
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2436
op0 :: Name -> (Term, Term -> Bool)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2437
op0 name = (mk, is)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2438
  where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2439
    mk = Const (name, [])
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2440
    is (Const (c, _)) = c == name
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2441
    is _ = False
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2442
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2443
op1 :: Name -> (Term -> Term, Term -> Maybe Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2444
op1 name = (mk, dest)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2445
  where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2446
    mk t = App (Const (name, []), t)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2447
    dest (App (Const (c, _), t)) | c == name = Just t
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2448
    dest _ = Nothing
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2449
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2450
op2 :: Name -> (Term -> Term -> Term, Term -> Maybe (Term, Term))
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2451
op2 name = (mk, dest)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2452
  where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2453
    mk t u = App (App (Const (name, []), t), u)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2454
    dest (App (App (Const (c, _), t), u)) | c == name = Just (t, u)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2455
    dest _ = Nothing
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2456
74197
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2457
typed_op0 :: Name -> (Typ -> Term, Term -> Maybe Typ)
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2458
typed_op0 name = (mk, dest)
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2459
  where
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2460
    mk ty = Const (name, [ty])
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2461
    dest (Const (c, [ty])) | c == name = Just ty
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2462
    dest _ = Nothing
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2463
74188
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2464
typed_op1 :: Name -> (Typ -> Term -> Term, Term -> Maybe (Typ, Term))
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2465
typed_op1 name = (mk, dest)
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2466
  where
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2467
    mk ty t = App (Const (name, [ty]), t)
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2468
    dest (App (Const (c, [ty]), t)) | c == name = Just (ty, t)
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2469
    dest _ = Nothing
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2470
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2471
typed_op2 :: Name -> (Typ -> Term -> Term -> Term, Term -> Maybe (Typ, Term, Term))
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2472
typed_op2 name = (mk, dest)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2473
  where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2474
    mk ty t u = App (App (Const (name, [ty]), t), u)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2475
    dest (App (App (Const (c, [ty]), t), u)) | c == name = Just (ty, t, u)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2476
    dest _ = Nothing
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2477
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2478
binder :: Name -> (Free -> Term -> Term, Name.Context -> Term -> Maybe (Free, Term))
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2479
binder name = (mk, dest)
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2480
  where
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2481
    mk (a, ty) b = App (Const (name, [ty]), lambda (a, ty) b)
74214
e16ac8907148 tuned signature;
wenzelm
parents: 74213
diff changeset
  2482
    dest names (App (Const (c, _), t)) | c == name = dest_lambda names t
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2483
    dest _ _ = Nothing
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2484
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2485
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2486
{- type operations -}
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2487
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2488
dummyS :: Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2489
dummyS = [""]
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2490
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2491
dummyT :: Typ; is_dummyT :: Typ -> Bool
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2492
(dummyT, is_dummyT) = type_op0 \<open>\<^type_name>\<open>dummy\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2493
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2494
propT :: Typ; is_propT :: Typ -> Bool
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2495
(propT, is_propT) = type_op0 \<open>\<^type_name>\<open>prop\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2496
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2497
(-->) :: Typ -> Typ -> Typ; dest_funT :: Typ -> Maybe (Typ, Typ)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2498
((-->), dest_funT) = type_op2 \<open>\<^type_name>\<open>fun\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2499
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2500
(--->) :: [Typ] -> Typ -> Typ
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2501
[] ---> b = b
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2502
(a : as) ---> b = a --> (as ---> b)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2503
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2504
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2505
{- term operations -}
74100
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2506
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2507
aconv :: Term -> Term -> Bool
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2508
aconv (App (t1, u1)) (App (t2, u2)) = aconv t1 t2 && aconv u1 u2
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2509
aconv (Abs (_, ty1, t1)) (Abs (_, ty2, t2)) = aconv t1 t2 && ty1 == ty2
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2510
aconv a1 a2 = a1 == a2
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2511
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2512
list_comb :: Term -> [Term] -> Term
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2513
list_comb f [] = f
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2514
list_comb f (t : ts) = list_comb (App (f, t)) ts
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2515
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2516
strip_comb :: Term -> (Term, [Term])
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2517
strip_comb tm = strip (tm, [])
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2518
  where
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2519
    strip (App (f, t), ts) = strip (f, t : ts)
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2520
    strip x = x
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2521
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2522
head_of :: Term -> Term
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2523
head_of (App (f, _)) = head_of f
fb9c119e5b49 more operations;
wenzelm
parents: 74099
diff changeset
  2524
head_of u = u
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2525
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2526
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2527
generate_file "Isabelle/Pure.hs" = \<open>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2528
{-  Title:      Isabelle/Term.hs
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2529
    Author:     Makarius
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2530
    LICENSE:    BSD 3-clause (Isabelle)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2531
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2532
Support for Isabelle/Pure logic.
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2533
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  2534
See \<^file>\<open>$ISABELLE_HOME/src/Pure/logic.ML\<close>.
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2535
-}
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2536
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2537
{-# LANGUAGE OverloadedStrings #-}
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2538
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2539
module Isabelle.Pure (
74188
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2540
  mk_forall_op, dest_forall_op, mk_forall, dest_forall,
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2541
  mk_equals, dest_equals, mk_implies, dest_implies
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2542
)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2543
where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2544
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2545
import qualified Isabelle.Name as Name
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2546
import Isabelle.Term
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2547
74188
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2548
mk_forall_op :: Typ -> Term -> Term; dest_forall_op :: Term -> Maybe (Typ, Term)
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2549
(mk_forall_op, dest_forall_op) = typed_op1 \<open>\<^const_name>\<open>Pure.all\<close>\<close>
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2550
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2551
mk_forall :: Free -> Term -> Term; dest_forall :: Name.Context -> Term -> Maybe (Free, Term)
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2552
(mk_forall, dest_forall) = binder \<open>\<^const_name>\<open>Pure.all\<close>\<close>
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2553
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2554
mk_equals :: Typ -> Term -> Term -> Term; dest_equals :: Term -> Maybe (Typ, Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2555
(mk_equals, dest_equals) = typed_op2 \<open>\<^const_name>\<open>Pure.eq\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2556
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2557
mk_implies :: Term -> Term -> Term; dest_implies :: Term -> Maybe (Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2558
(mk_implies, dest_implies) = op2 \<open>\<^const_name>\<open>Pure.imp\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2559
\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2560
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2561
generate_file "Isabelle/HOL.hs" = \<open>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2562
{-  Title:      Isabelle/Term.hs
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2563
    Author:     Makarius
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2564
    LICENSE:    BSD 3-clause (Isabelle)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2565
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2566
Support for Isabelle/HOL logic.
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2567
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  2568
See \<^file>\<open>$ISABELLE_HOME/src/HOL/Tools/hologic.ML\<close>.
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2569
-}
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2570
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2571
{-# LANGUAGE OverloadedStrings #-}
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2572
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2573
module Isabelle.HOL (
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2574
  boolT, is_boolT, mk_trueprop, dest_trueprop,
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2575
  mk_setT, dest_setT, mk_mem, dest_mem,
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2576
  mk_eq, dest_eq, true, is_true, false, is_false,
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2577
  mk_not, dest_not, mk_conj, dest_conj, mk_disj, dest_disj,
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2578
  mk_imp, dest_imp, mk_iff, dest_iff,
74188
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2579
  mk_all_op, dest_all_op, mk_ex_op, dest_ex_op,
74197
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2580
  mk_all, dest_all, mk_ex, dest_ex,
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2581
  mk_undefined, dest_undefined
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2582
)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2583
where
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2584
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2585
import qualified Isabelle.Name as Name
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2586
import Isabelle.Term
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2587
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2588
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2589
boolT :: Typ; is_boolT :: Typ -> Bool
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2590
(boolT, is_boolT) = type_op0 \<open>\<^type_name>\<open>bool\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2591
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2592
mk_trueprop :: Term -> Term; dest_trueprop :: Term -> Maybe Term
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2593
(mk_trueprop, dest_trueprop) = op1 \<open>\<^const_name>\<open>Trueprop\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2594
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2595
mk_setT :: Typ -> Typ; dest_setT :: Typ -> Maybe Typ
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2596
(mk_setT, dest_setT) = type_op1 \<open>\<^type_name>\<open>set\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2597
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2598
mk_mem :: Typ -> Term -> Term -> Term; dest_mem :: Term -> Maybe (Typ, Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2599
(mk_mem, dest_mem) = typed_op2 \<open>\<^const_name>\<open>Set.member\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2600
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2601
mk_eq :: Typ -> Term -> Term -> Term; dest_eq :: Term -> Maybe (Typ, Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2602
(mk_eq, dest_eq) = typed_op2 \<open>\<^const_name>\<open>HOL.eq\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2603
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2604
true :: Term; is_true :: Term -> Bool
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2605
(true, is_true) = op0 \<open>\<^const_name>\<open>True\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2606
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2607
false :: Term; is_false :: Term -> Bool
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2608
(false, is_false) = op0 \<open>\<^const_name>\<open>False\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2609
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2610
mk_not :: Term -> Term; dest_not :: Term -> Maybe Term
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2611
(mk_not, dest_not) = op1 \<open>\<^const_name>\<open>Not\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2612
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2613
mk_conj :: Term -> Term -> Term; dest_conj :: Term -> Maybe (Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2614
(mk_conj, dest_conj) = op2 \<open>\<^const_name>\<open>conj\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2615
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2616
mk_disj :: Term -> Term -> Term; dest_disj :: Term -> Maybe (Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2617
(mk_disj, dest_disj) = op2 \<open>\<^const_name>\<open>disj\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2618
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2619
mk_imp :: Term -> Term -> Term; dest_imp :: Term -> Maybe (Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2620
(mk_imp, dest_imp) = op2 \<open>\<^const_name>\<open>implies\<close>\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2621
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2622
mk_iff :: Term -> Term -> Term
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2623
mk_iff = mk_eq boolT
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2624
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2625
dest_iff :: Term -> Maybe (Term, Term)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2626
dest_iff tm =
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2627
  case dest_eq tm of
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2628
    Just (ty, t, u) | ty == boolT -> Just (t, u)
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2629
    _ -> Nothing
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2630
74188
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2631
mk_all_op :: Typ -> Term -> Term; dest_all_op :: Term -> Maybe (Typ, Term)
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2632
(mk_all_op, dest_all_op) = typed_op1 \<open>\<^const_name>\<open>All\<close>\<close>
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2633
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2634
mk_ex_op :: Typ -> Term -> Term; dest_ex_op :: Term -> Maybe (Typ, Term)
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2635
(mk_ex_op, dest_ex_op) = typed_op1 \<open>\<^const_name>\<open>Ex\<close>\<close>
ea10e06adede more Isabelle/Haskell operations;
wenzelm
parents: 74187
diff changeset
  2636
74124
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2637
mk_all :: Free -> Term -> Term; dest_all :: Name.Context -> Term -> Maybe (Free, Term)
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2638
(mk_all, dest_all) = binder \<open>\<^const_name>\<open>All\<close>\<close>
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2639
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2640
mk_ex :: Free -> Term -> Term; dest_ex :: Name.Context -> Term -> Maybe (Free, Term)
d36e40f3c171 more operations: dest binders;
wenzelm
parents: 74106
diff changeset
  2641
(mk_ex, dest_ex) = binder \<open>\<^const_name>\<open>Ex\<close>\<close>
74197
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2642
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2643
mk_undefined :: Typ -> Term; dest_undefined :: Term -> Maybe Typ
1f78a40e4399 more Isabelle/Haskell operations;
wenzelm
parents: 74196
diff changeset
  2644
(mk_undefined, dest_undefined) = typed_op0 \<open>\<^const_name>\<open>undefined\<close>\<close>
74105
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2645
\<close>
d3d6e01a6b00 more operations on types and terms;
wenzelm
parents: 74100
diff changeset
  2646
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  2647
generate_file "Isabelle/Term_XML/Encode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  2648
{-  Title:      Isabelle/Term_XML/Encode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2649
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2650
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2651
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2652
XML data representation of lambda terms.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  2653
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  2654
See \<^file>\<open>$ISABELLE_HOME/src/Pure/term_xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2655
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2656
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2657
{-# LANGUAGE LambdaCase #-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2658
80589
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2659
module Isabelle.Term_XML.Encode (indexname, sort, typ, term)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2660
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2661
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2662
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2663
import Isabelle.XML.Encode
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2664
import Isabelle.Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2665
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2666
indexname :: P Indexname
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2667
indexname (a, b) = if b == 0 then [a] else [a, int_atom b]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2668
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2669
sort :: T Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2670
sort = list string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2671
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2672
typ :: T Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2673
typ ty =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2674
  ty |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2675
   [\case { Type (a, b) -> Just ([a], list typ b); _ -> Nothing },
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2676
    \case { TFree (a, b) -> Just ([a], sort b); _ -> Nothing },
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2677
    \case { TVar (a, b) -> Just (indexname a, sort b); _ -> Nothing }]
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2678
80589
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2679
var_type :: T Typ
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2680
var_type ty = if is_dummyT ty then [] else typ ty
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2681
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2682
term :: T Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2683
term t =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2684
  t |> variant
70784
799437173553 Term_XML.Encode/Decode.term uses Const "typargs";
wenzelm
parents: 70667
diff changeset
  2685
   [\case { Const (a, b) -> Just ([a], list typ b); _ -> Nothing },
80589
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2686
    \case { Free (a, b) -> Just ([a], var_type b); _ -> Nothing },
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2687
    \case { Var (a, b) -> Just (indexname a, var_type b); _ -> Nothing },
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2688
    \case { Bound a -> Just ([], int a); _ -> Nothing },
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2689
    \case { Abs (a, b, c) -> Just ([a], pair typ term (b, c)); _ -> Nothing },
80568
fbb655bf62d4 clarified Isabelle/Haskell type Term, following Isabelle/Scala (see 446b887e23c7);
wenzelm
parents: 79741
diff changeset
  2690
    \case { App a -> Just ([], pair term term a); _ -> Nothing },
fbb655bf62d4 clarified Isabelle/Haskell type Term, following Isabelle/Scala (see 446b887e23c7);
wenzelm
parents: 79741
diff changeset
  2691
    \case { OFCLASS (a, b) -> Just ([b], typ a); _ -> Nothing }]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2692
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2693
69444
c3c9440cbf9b more formal Haskell project setup, with dependencies on packages from "stackage";
wenzelm
parents: 69381
diff changeset
  2694
generate_file "Isabelle/Term_XML/Decode.hs" = \<open>
69445
bff0011cdf42 tuned headers;
wenzelm
parents: 69444
diff changeset
  2695
{-  Title:      Isabelle/Term_XML/Decode.hs
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2696
    Author:     Makarius
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2697
    LICENSE:    BSD 3-clause (Isabelle)
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2698
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2699
XML data representation of lambda terms.
69280
e1d01b351724 more formal references;
wenzelm
parents: 69278
diff changeset
  2700
74178
5f81ebfb551e tuned comments;
wenzelm
parents: 74177
diff changeset
  2701
See \<^file>\<open>$ISABELLE_HOME/src/Pure/term_xml.ML\<close>.
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2702
-}
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2703
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  2704
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  2705
80589
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2706
module Isabelle.Term_XML.Decode (indexname, sort, typ, term)
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2707
where
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2708
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2709
import Isabelle.Library
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2710
import Isabelle.XML.Decode
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2711
import Isabelle.Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2712
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2713
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2714
indexname :: P Indexname
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2715
indexname [a] = (a, 0)
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2716
indexname [a, b] = (a, int_atom b)
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2717
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2718
sort :: T Sort
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2719
sort = list string
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2720
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2721
typ :: T Typ
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2722
typ ty =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2723
  ty |> variant
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2724
  [\([a], b) -> Type (a, list typ b),
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2725
   \([a], b) -> TFree (a, sort b),
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2726
   \(a, b) -> TVar (indexname a, sort b)]
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2727
80589
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2728
var_type :: T Typ
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2729
var_type [] = dummyT
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2730
var_type body = typ body
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2731
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2732
term :: T Term
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2733
term t =
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2734
  t |> variant
70784
799437173553 Term_XML.Encode/Decode.term uses Const "typargs";
wenzelm
parents: 70667
diff changeset
  2735
   [\([a], b) -> Const (a, list typ b),
80589
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2736
    \([a], b) -> Free (a, var_type b),
7849b6370425 clarified signature, following zterm.ML;
wenzelm
parents: 80568
diff changeset
  2737
    \(a, b) -> Var (indexname a, var_type b),
70845
8e51ea8d4609 adapted to ML version;
wenzelm
parents: 70784
diff changeset
  2738
    \([], a) -> Bound (int a),
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2739
    \([a], b) -> let (c, d) = pair typ term b in Abs (a, c, d),
80568
fbb655bf62d4 clarified Isabelle/Haskell type Term, following Isabelle/Scala (see 446b887e23c7);
wenzelm
parents: 79741
diff changeset
  2740
    \([], a) -> App (pair term term a),
fbb655bf62d4 clarified Isabelle/Haskell type Term, following Isabelle/Scala (see 446b887e23c7);
wenzelm
parents: 79741
diff changeset
  2741
    \([a], b) -> OFCLASS (typ b, a)]
69240
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2742
\<close>
16ca270090b6 more Haskell operations;
wenzelm
parents: 69236
diff changeset
  2743
74129
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2744
generate_file "Isabelle/XML/Classes.hs" = \<open>
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2745
{- generated by Isabelle -}
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2746
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2747
{-  Title:      Isabelle/XML/Classes.hs
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2748
    Author:     Makarius
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2749
    LICENSE:    BSD 3-clause (Isabelle)
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2750
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2751
Type classes for XML data representation.
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2752
-}
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2753
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2754
{-# LANGUAGE FlexibleInstances #-}
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2755
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2756
module Isabelle.XML.Classes
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2757
  (Encode_Atom(..), Decode_Atom(..), Encode (..), Decode (..))
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2758
where
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2759
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2760
import qualified Isabelle.XML as XML
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2761
import qualified Isabelle.XML.Encode as Encode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2762
import qualified Isabelle.XML.Decode as Decode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2763
import qualified Isabelle.Term_XML.Encode as Encode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2764
import qualified Isabelle.Term_XML.Decode as Decode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2765
import qualified Isabelle.Properties as Properties
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2766
import Isabelle.Bytes (Bytes)
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2767
import Isabelle.Term (Typ, Term)
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2768
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2769
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2770
class Encode_Atom a where encode_atom :: Encode.A a
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2771
class Decode_Atom a where decode_atom :: Decode.A a
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2772
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2773
instance Encode_Atom Int where encode_atom = Encode.int_atom
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2774
instance Decode_Atom Int where decode_atom = Decode.int_atom
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2775
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2776
instance Encode_Atom Bool where encode_atom = Encode.bool_atom
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2777
instance Decode_Atom Bool where decode_atom = Decode.bool_atom
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2778
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2779
instance Encode_Atom () where encode_atom = Encode.unit_atom
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2780
instance Decode_Atom () where decode_atom = Decode.unit_atom
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2781
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2782
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2783
class Encode a where encode :: Encode.T a
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2784
class Decode a where decode :: Decode.T a
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2785
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2786
instance Encode Bytes where encode = Encode.string
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2787
instance Decode Bytes where decode = Decode.string
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2788
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2789
instance Encode Int where encode = Encode.int
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2790
instance Decode Int where decode = Decode.int
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2791
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2792
instance Encode Bool where encode = Encode.bool
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2793
instance Decode Bool where decode = Decode.bool
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2794
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2795
instance Encode () where encode = Encode.unit
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2796
instance Decode () where decode = Decode.unit
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2797
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2798
instance (Encode a, Encode b) => Encode (a, b)
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2799
  where encode = Encode.pair encode encode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2800
instance (Decode a, Decode b) => Decode (a, b)
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2801
  where decode = Decode.pair decode decode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2802
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2803
instance (Encode a, Encode b, Encode c) => Encode (a, b, c)
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2804
  where encode = Encode.triple encode encode encode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2805
instance (Decode a, Decode b, Decode c) => Decode (a, b, c)
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2806
  where decode = Decode.triple decode decode decode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2807
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2808
instance Encode a => Encode [a] where encode = Encode.list encode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2809
instance Decode a => Decode [a] where decode = Decode.list decode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2810
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2811
instance Encode a => Encode (Maybe a) where encode = Encode.option encode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2812
instance Decode a => Decode (Maybe a) where decode = Decode.option decode
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2813
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2814
instance Encode XML.Tree where encode = Encode.tree
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2815
instance Decode XML.Tree where decode = Decode.tree
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2816
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2817
instance Encode Properties.T where encode = Encode.properties
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2818
instance Decode Properties.T where decode = Decode.properties
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2819
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2820
instance Encode Typ where encode = Encode.typ
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2821
instance Decode Typ where decode = Decode.typ
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2822
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2823
instance Encode Term where encode = Encode.term
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2824
instance Decode Term where decode = Decode.term
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2825
\<close>
c3794f56a2e2 type classes for XML data representation;
wenzelm
parents: 74128
diff changeset
  2826
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2827
generate_file "Isabelle/UUID.hs" = \<open>
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2828
{-  Title:      Isabelle/UUID.hs
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2829
    Author:     Makarius
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2830
    LICENSE:    BSD 3-clause (Isabelle)
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2831
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2832
Universally unique identifiers.
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2833
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2834
See \<^file>\<open>$ISABELLE_HOME/src/Pure/General/uuid.scala\<close>.
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2835
-}
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2836
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2837
module Isabelle.UUID (T, random, print, parse)
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2838
where
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2839
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2840
import Prelude hiding (print)
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2841
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2842
import Data.UUID (UUID)
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2843
import qualified Data.UUID as UUID
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2844
import Data.UUID.V4 (nextRandom)
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2845
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2846
import qualified Isabelle.Bytes as Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2847
import Isabelle.Bytes (Bytes)
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2848
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2849
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  2850
type T = UUID
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  2851
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  2852
random :: IO T
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2853
random = nextRandom
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2854
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2855
print :: T -> Bytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2856
print = Bytes.make . UUID.toASCIIBytes
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2857
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2858
parse :: Bytes -> Maybe T
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2859
parse = UUID.fromASCIIBytes . Bytes.unmake
69459
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2860
\<close>
bbb61a9cb99a more Haskell operations;
wenzelm
parents: 69455
diff changeset
  2861
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2862
generate_file "Isabelle/Byte_Message.hs" = \<open>
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2863
{-  Title:      Isabelle/Byte_Message.hs
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2864
    Author:     Makarius
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2865
    LICENSE:    BSD 3-clause (Isabelle)
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2866
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2867
Byte-oriented messages.
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2868
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2869
See \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/byte_message.ML\<close>
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2870
and \<^file>\<open>$ISABELLE_HOME/src/Pure/PIDE/byte_message.scala\<close>.
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2871
-}
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2872
74083
wenzelm
parents: 74082
diff changeset
  2873
{-# LANGUAGE OverloadedStrings #-}
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  2874
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  2875
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2876
module Isabelle.Byte_Message (
69467
e8893c893241 tuned signature;
wenzelm
parents: 69466
diff changeset
  2877
    write, write_line,
74088
6d8674ffb962 clarified signature;
wenzelm
parents: 74087
diff changeset
  2878
    read, read_block, read_line,
74187
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  2879
    make_message, write_message, read_message,
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  2880
    exchange_message, exchange_message0,
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  2881
    make_line_message, write_line_message, read_line_message,
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  2882
    read_yxml, write_yxml
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2883
  )
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2884
where
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2885
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2886
import Prelude hiding (read)
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2887
import Data.Maybe
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2888
import qualified Data.ByteString as ByteString
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2889
import qualified Isabelle.Bytes as Bytes
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2890
import Isabelle.Bytes (Bytes)
74135
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
  2891
import qualified Isabelle.Symbol as Symbol
74080
5b68a5cd7061 prefer UTF8 implementation from Data.Text.Encoding (foreign C);
wenzelm
parents: 73246
diff changeset
  2892
import qualified Isabelle.UTF8 as UTF8
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  2893
import qualified Isabelle.XML as XML
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  2894
import qualified Isabelle.YXML as YXML
73177
9288ac2eda12 fewer warnings, notably in Naproche-SAD;
wenzelm
parents: 71692
diff changeset
  2895
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2896
import Network.Socket (Socket)
74082
f81d2a1cad69 tuned signature;
wenzelm
parents: 74081
diff changeset
  2897
import qualified Network.Socket.ByteString as Socket
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2898
74088
6d8674ffb962 clarified signature;
wenzelm
parents: 74087
diff changeset
  2899
import Isabelle.Library
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2900
import qualified Isabelle.Value as Value
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2901
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2902
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2903
{- output operations -}
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2904
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2905
write :: Socket -> [Bytes] -> IO ()
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2906
write socket = Socket.sendMany socket . map Bytes.unmake
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2907
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2908
write_line :: Socket -> Bytes -> IO ()
74083
wenzelm
parents: 74082
diff changeset
  2909
write_line socket s = write socket [s, "\n"]
69467
e8893c893241 tuned signature;
wenzelm
parents: 69466
diff changeset
  2910
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2911
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2912
{- input operations -}
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2913
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2914
read :: Socket -> Int -> IO Bytes
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2915
read socket n = read_body 0 []
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2916
  where
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2917
    result = Bytes.concat . reverse
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2918
    read_body len ss =
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2919
      if len >= n then return (result ss)
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2920
      else
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2921
        (do
74082
f81d2a1cad69 tuned signature;
wenzelm
parents: 74081
diff changeset
  2922
          s <- Socket.recv socket (min (n - len) 8192)
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2923
          case ByteString.length s of
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2924
            0 -> return (result ss)
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2925
            m -> read_body (len + m) (Bytes.make s : ss))
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2926
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2927
read_block :: Socket -> Int -> IO (Maybe Bytes, Int)
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2928
read_block socket n = do
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2929
  msg <- read socket n
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2930
  let len = Bytes.length msg
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2931
  return (if len == n then Just msg else Nothing, len)
69449
b516fdf8005c more uniform multi-language operations;
wenzelm
parents: 69448
diff changeset
  2932
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2933
read_line :: Socket -> IO (Maybe Bytes)
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2934
read_line socket = read_body []
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2935
  where
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
  2936
    result = trim_line . Bytes.pack . reverse
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2937
    read_body bs = do
74082
f81d2a1cad69 tuned signature;
wenzelm
parents: 74081
diff changeset
  2938
      s <- Socket.recv socket 1
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2939
      case ByteString.length s of
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2940
        0 -> return (if null bs then Nothing else Just (result bs))
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2941
        1 ->
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2942
          case ByteString.head s of
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2943
            10 -> return (Just (result bs))
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2944
            b -> read_body (b : bs)
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  2945
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2946
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2947
{- messages with multiple chunks (arbitrary content) -}
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2948
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2949
make_header :: [Int] -> [Bytes]
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  2950
make_header ns = [space_implode "," (map Value.print_int ns), "\n"]
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2951
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2952
make_message :: [Bytes] -> [Bytes]
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2953
make_message chunks = make_header (map Bytes.length chunks) <> chunks
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2954
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2955
write_message :: Socket -> [Bytes] -> IO ()
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  2956
write_message socket = write socket . make_message
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2957
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2958
parse_header :: Bytes -> [Int]
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2959
parse_header line =
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2960
  let
74132
9f18eb2a8039 clarified signature;
wenzelm
parents: 74130
diff changeset
  2961
    res = map Value.parse_nat (space_explode ',' line)
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2962
  in
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2963
    if all isJust res then map fromJust res
74081
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
  2964
    else error ("Malformed message header: " <> quote (UTF8.decode line))
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2965
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2966
read_chunk :: Socket -> Int -> IO Bytes
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2967
read_chunk socket n = do
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2968
  res <- read_block socket n
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2969
  return $
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2970
    case res of
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2971
      (Just chunk, _) -> chunk
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2972
      (Nothing, len) ->
74081
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
  2973
        error ("Malformed message chunk: unexpected EOF after " <>
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
  2974
          show len <> " of " <> show n <> " bytes")
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2975
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2976
read_message :: Socket -> IO (Maybe [Bytes])
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2977
read_message socket = do
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2978
  res <- read_line socket
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2979
  case res of
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2980
    Just line -> Just <$> mapM (read_chunk socket) (parse_header line)
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2981
    Nothing -> return Nothing
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2982
74186
92e74f9305a4 more Isabelle/Haskell operations;
wenzelm
parents: 74185
diff changeset
  2983
exchange_message :: Socket -> [Bytes] -> IO (Maybe [Bytes])
92e74f9305a4 more Isabelle/Haskell operations;
wenzelm
parents: 74185
diff changeset
  2984
exchange_message socket msg = do
92e74f9305a4 more Isabelle/Haskell operations;
wenzelm
parents: 74185
diff changeset
  2985
  write_message socket msg
92e74f9305a4 more Isabelle/Haskell operations;
wenzelm
parents: 74185
diff changeset
  2986
  read_message socket
92e74f9305a4 more Isabelle/Haskell operations;
wenzelm
parents: 74185
diff changeset
  2987
74187
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  2988
exchange_message0 :: Socket -> [Bytes] -> IO ()
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  2989
exchange_message0 socket msg = do
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  2990
  _ <- exchange_message socket msg
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  2991
  return ()
6109a9105a7a more Isabelle/Haskell operations;
wenzelm
parents: 74186
diff changeset
  2992
69454
ef051edd4d10 more uniform multi-language operations;
wenzelm
parents: 69453
diff changeset
  2993
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2994
-- hybrid messages: line or length+block (with content restriction)
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  2995
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2996
is_length :: Bytes -> Bool
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  2997
is_length msg =
74135
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
  2998
  not (Bytes.null msg) && Bytes.all_char (\c -> '0' <= c && c <= '9') msg
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  2999
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3000
is_terminated :: Bytes -> Bool
69452
704915cf59fa more uniform multi-language operations;
wenzelm
parents: 69449
diff changeset
  3001
is_terminated msg =
74135
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
  3002
  not (Bytes.null msg) && Symbol.is_ascii_line_terminator (Bytes.char $ Bytes.last msg)
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3003
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3004
make_line_message :: Bytes -> [Bytes]
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  3005
make_line_message msg =
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3006
  let n = Bytes.length msg in
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  3007
    if is_length msg || is_terminated msg then
74081
adaa2e9a4111 tuned signature: more generic operations;
wenzelm
parents: 74080
diff changeset
  3008
      error ("Bad content for line message:\n" <> take 100 (UTF8.decode msg))
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  3009
    else
74135
6a16f7a67193 clarified signature;
wenzelm
parents: 74134
diff changeset
  3010
      (if n > 100 || Bytes.any_char (== '\n') msg then make_header [n + 1] else []) <> [msg, "\n"]
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3011
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3012
write_line_message :: Socket -> Bytes -> IO ()
69476
d93fe3557a98 clarified signature;
wenzelm
parents: 69474
diff changeset
  3013
write_line_message socket = write socket . make_line_message
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  3014
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3015
read_line_message :: Socket -> IO (Maybe Bytes)
69448
51e696887b81 more uniform multi-language operations;
wenzelm
parents: 69446
diff changeset
  3016
read_line_message socket = do
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  3017
  opt_line <- read_line socket
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  3018
  case opt_line of
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  3019
    Nothing -> return Nothing
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  3020
    Just line ->
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  3021
      case Value.parse_nat line of
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  3022
        Nothing -> return $ Just line
74134
ede8a01f063a clarified signature;
wenzelm
parents: 74133
diff changeset
  3023
        Just n -> fmap trim_line . fst <$> read_block socket n
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3024
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3025
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3026
read_yxml :: Socket -> IO (Maybe XML.Body)
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3027
read_yxml socket = do
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3028
  res <- read_line_message socket
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  3029
  return (YXML.parse_body <$> res)
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3030
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3031
write_yxml :: Socket -> XML.Body -> IO ()
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3032
write_yxml socket body =
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  3033
  write_line_message socket (YXML.string_of_body body)
69446
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  3034
\<close>
9cf0b79dfb7f more Haskell operations;
wenzelm
parents: 69445
diff changeset
  3035
71692
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3036
generate_file "Isabelle/Isabelle_Thread.hs" = \<open>
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3037
{-  Title:      Isabelle/Isabelle_Thread.hs
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3038
    Author:     Makarius
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3039
    LICENSE:    BSD 3-clause (Isabelle)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3040
71692
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3041
Isabelle-specific thread management.
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3042
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3043
See \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/isabelle_thread.ML\<close>
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3044
and \<^file>\<open>$ISABELLE_HOME/src/Pure/Concurrent/isabelle_thread.scala\<close>.
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3045
-}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3046
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3047
{-# LANGUAGE NamedFieldPuns #-}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3048
71692
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3049
module Isabelle.Isabelle_Thread (
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3050
  ThreadId, Result,
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3051
  find_id,
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3052
  properties, change_properties,
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3053
  add_resource, del_resource, bracket_resource,
69497
c434ca819aea more Haskell operations;
wenzelm
parents: 69496
diff changeset
  3054
  is_stopped, expose_stopped, stop,
69496
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3055
  my_uuid, stop_uuid,
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3056
  Fork, fork_finally, fork)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3057
where
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3058
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3059
import Data.Unique
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3060
import Data.IORef
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3061
import System.IO.Unsafe
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3062
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3063
import qualified Data.List as List
69497
c434ca819aea more Haskell operations;
wenzelm
parents: 69496
diff changeset
  3064
import Control.Monad (when, forM_)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3065
import Data.Map.Strict (Map)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3066
import qualified Data.Map.Strict as Map
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3067
import Control.Exception as Exception
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3068
import Control.Concurrent (ThreadId)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3069
import qualified Control.Concurrent as Concurrent
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3070
import Control.Concurrent.Thread (Result)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3071
import qualified Control.Concurrent.Thread as Thread
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3072
import qualified Isabelle.UUID as UUID
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3073
import qualified Isabelle.Properties as Properties
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3074
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3075
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3076
{- thread info -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3077
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3078
type Resources = Map Unique (IO ())
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3079
data Info = Info {uuid :: UUID.T, props :: Properties.T, stopped :: Bool, resources :: Resources}
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3080
type Infos = Map ThreadId Info
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3081
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3082
lookup_info :: Infos -> ThreadId -> Maybe Info
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3083
lookup_info infos id = Map.lookup id infos
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3084
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3085
init_info :: ThreadId -> UUID.T -> Infos -> (Infos, ())
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3086
init_info id uuid infos = (Map.insert id (Info uuid [] False Map.empty) infos, ())
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3087
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3088
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3089
{- global state -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3090
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3091
{-# NOINLINE global_state #-}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3092
global_state :: IORef Infos
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3093
global_state = unsafePerformIO (newIORef Map.empty)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3094
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3095
find_id :: UUID.T -> IO (Maybe ThreadId)
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3096
find_id uuid = do
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3097
  state <- readIORef global_state
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3098
  return $ fst <$> List.find (\(_, Info{uuid = uuid'}) -> uuid == uuid') (Map.assocs state)
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3099
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3100
get_info :: ThreadId -> IO (Maybe Info)
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3101
get_info id = do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3102
  state <- readIORef global_state
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3103
  return $ lookup_info state id
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3104
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3105
map_info :: ThreadId -> (Info -> Info) -> IO (Maybe Info)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3106
map_info id f =
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3107
  atomicModifyIORef' global_state
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3108
    (\infos ->
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3109
      case lookup_info infos id of
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3110
        Nothing -> (infos, Nothing)
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3111
        Just info ->
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3112
          let info' = f info
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3113
          in (Map.insert id info' infos, Just info'))
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3114
69495
c34dfa431b89 proper cleanup;
wenzelm
parents: 69494
diff changeset
  3115
delete_info :: ThreadId -> IO ()
c34dfa431b89 proper cleanup;
wenzelm
parents: 69494
diff changeset
  3116
delete_info id =
c34dfa431b89 proper cleanup;
wenzelm
parents: 69494
diff changeset
  3117
  atomicModifyIORef' global_state (\infos -> (Map.delete id infos, ()))
c34dfa431b89 proper cleanup;
wenzelm
parents: 69494
diff changeset
  3118
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3119
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3120
{- thread properties -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3121
69498
22e958b76bf6 more robust: suitable defaults for unmanaged threads;
wenzelm
parents: 69497
diff changeset
  3122
my_info :: IO (Maybe Info)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3123
my_info = do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3124
  id <- Concurrent.myThreadId
69498
22e958b76bf6 more robust: suitable defaults for unmanaged threads;
wenzelm
parents: 69497
diff changeset
  3125
  get_info id
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3126
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3127
properties :: IO Properties.T
69498
22e958b76bf6 more robust: suitable defaults for unmanaged threads;
wenzelm
parents: 69497
diff changeset
  3128
properties = maybe [] props <$> my_info
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3129
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3130
change_properties :: (Properties.T -> Properties.T) -> IO ()
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3131
change_properties f = do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3132
  id <- Concurrent.myThreadId
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3133
  map_info id (\info -> info {props = f (props info)})
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3134
  return ()
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3135
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3136
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3137
{- managed resources -}
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3138
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3139
add_resource :: IO () -> IO Unique
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3140
add_resource resource = do
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3141
  id <- Concurrent.myThreadId
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3142
  u <- newUnique
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3143
  map_info id (\info -> info {resources = Map.insert u resource (resources info)})
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3144
  return u
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3145
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3146
del_resource :: Unique -> IO ()
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3147
del_resource u = do
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3148
  id <- Concurrent.myThreadId
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3149
  map_info id (\info -> info {resources = Map.delete u (resources info)})
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3150
  return ()
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3151
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3152
bracket_resource :: IO () -> IO a -> IO a
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3153
bracket_resource resource body =
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3154
  Exception.bracket (add_resource resource) del_resource (const body)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3155
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3156
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3157
{- stop -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3158
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3159
is_stopped :: IO Bool
69498
22e958b76bf6 more robust: suitable defaults for unmanaged threads;
wenzelm
parents: 69497
diff changeset
  3160
is_stopped = maybe False stopped <$> my_info
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3161
69497
c434ca819aea more Haskell operations;
wenzelm
parents: 69496
diff changeset
  3162
expose_stopped :: IO ()
c434ca819aea more Haskell operations;
wenzelm
parents: 69496
diff changeset
  3163
expose_stopped = do
c434ca819aea more Haskell operations;
wenzelm
parents: 69496
diff changeset
  3164
  stopped <- is_stopped
c434ca819aea more Haskell operations;
wenzelm
parents: 69496
diff changeset
  3165
  when stopped $ throw ThreadKilled
c434ca819aea more Haskell operations;
wenzelm
parents: 69496
diff changeset
  3166
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3167
stop :: ThreadId -> IO ()
69499
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3168
stop id = do
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3169
  info <- map_info id (\info -> info {stopped = True})
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3170
  let ops = case info of Nothing -> []; Just Info{resources} -> map snd (Map.toDescList resources)
638fdbbc7d1f more Haskell operations: managed resources for threads;
wenzelm
parents: 69498
diff changeset
  3171
  sequence_ ops
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3172
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3173
69496
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3174
{- UUID -}
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3175
69498
22e958b76bf6 more robust: suitable defaults for unmanaged threads;
wenzelm
parents: 69497
diff changeset
  3176
my_uuid :: IO (Maybe UUID.T)
22e958b76bf6 more robust: suitable defaults for unmanaged threads;
wenzelm
parents: 69497
diff changeset
  3177
my_uuid = fmap uuid <$> my_info
69496
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3178
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3179
stop_uuid :: UUID.T -> IO ()
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3180
stop_uuid uuid = do
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3181
  id <- find_id uuid
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3182
  forM_ id stop
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3183
5256e7f26640 more Haskell operations;
wenzelm
parents: 69495
diff changeset
  3184
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3185
{- fork -}
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3186
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3187
type Fork a = (ThreadId, UUID.T, IO (Result a))
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3188
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3189
fork_finally :: IO a -> (Either SomeException a -> IO b) -> IO (Fork b)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3190
fork_finally body finally = do
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3191
  uuid <- UUID.random
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3192
  (id, result) <-
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3193
    Exception.mask (\restore ->
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3194
      Thread.forkIO
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3195
        (Exception.try
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3196
          (do
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3197
            id <- Concurrent.myThreadId
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3198
            atomicModifyIORef' global_state (init_info id uuid)
69495
c34dfa431b89 proper cleanup;
wenzelm
parents: 69494
diff changeset
  3199
            restore body)
c34dfa431b89 proper cleanup;
wenzelm
parents: 69494
diff changeset
  3200
         >>= (\res -> do id <- Concurrent.myThreadId; delete_info id; finally res)))
69494
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3201
  return (id, uuid, result)
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3202
7e44f8e2cc49 more Haskell operations;
wenzelm
parents: 69491
diff changeset
  3203
fork :: IO a -> IO (Fork a)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3204
fork body = fork_finally body Thread.result
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3205
\<close>
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3206
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3207
generate_file "Isabelle/Server.hs" = \<open>
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3208
{-  Title:      Isabelle/Server.hs
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3209
    Author:     Makarius
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3210
    LICENSE:    BSD 3-clause (Isabelle)
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3211
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3212
TCP server on localhost.
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3213
-}
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3214
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3215
{-# LANGUAGE OverloadedStrings #-}
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3216
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3217
module Isabelle.Server (
74216
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
  3218
  localhost_name, localhost_prefix, localhost, publish_text, publish_stdout,
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3219
  server, connection
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3220
)
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3221
where
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3222
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3223
import Control.Monad (forever, when)
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3224
import qualified Control.Exception as Exception
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3225
import Network.Socket (Socket)
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3226
import qualified Network.Socket as Socket
69472
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  3227
import qualified System.IO as IO
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3228
import qualified Data.ByteString.Char8 as Char8
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3229
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3230
import Isabelle.Library
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3231
import qualified Isabelle.Bytes as Bytes
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3232
import Isabelle.Bytes (Bytes)
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3233
import qualified Isabelle.UUID as UUID
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3234
import qualified Isabelle.Byte_Message as Byte_Message
71692
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3235
import qualified Isabelle.Isabelle_Thread as Isabelle_Thread
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3236
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3237
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3238
{- server address -}
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3239
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3240
localhost_name :: Bytes
69463
6439c9024dcc clarified signature;
wenzelm
parents: 69462
diff changeset
  3241
localhost_name = "127.0.0.1"
6439c9024dcc clarified signature;
wenzelm
parents: 69462
diff changeset
  3242
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3243
localhost_prefix :: Bytes
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3244
localhost_prefix = localhost_name <> ":"
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3245
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3246
localhost :: Socket.HostAddress
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3247
localhost = Socket.tupleToHostAddress (127, 0, 0, 1)
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3248
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3249
publish_text :: Bytes -> Bytes -> UUID.T -> Bytes
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3250
publish_text name address password =
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3251
  "server " <> quote name <> " = " <> address <>
74128
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
  3252
    " (password " <> quote (show_bytes password) <> ")"
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3253
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3254
publish_stdout :: Bytes -> Bytes -> UUID.T -> IO ()
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  3255
publish_stdout name address password =
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3256
  Char8.putStrLn (Bytes.unmake $ publish_text name address password)
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3257
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3258
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3259
{- server -}
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3260
74127
9e97833a0bf0 clarified types: prefer Isabelle byte strings;
wenzelm
parents: 74124
diff changeset
  3261
server :: (Bytes -> UUID.T -> IO ()) -> (Socket -> IO ()) -> IO ()
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3262
server publish handle =
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3263
  Socket.withSocketsDo $ Exception.bracket open (Socket.close . fst) (uncurry loop)
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3264
  where
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3265
    open :: IO (Socket, Bytes)
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3266
    open = do
69466
wenzelm
parents: 69465
diff changeset
  3267
      server_socket <- Socket.socket Socket.AF_INET Socket.Stream Socket.defaultProtocol
wenzelm
parents: 69465
diff changeset
  3268
      Socket.bind server_socket (Socket.SockAddrInet 0 localhost)
wenzelm
parents: 69465
diff changeset
  3269
      Socket.listen server_socket 50
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3270
69466
wenzelm
parents: 69465
diff changeset
  3271
      port <- Socket.socketPort server_socket
74128
17e84ae97562 tuned signature;
wenzelm
parents: 74127
diff changeset
  3272
      let address = localhost_name <> ":" <> show_bytes port
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3273
      password <- UUID.random
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3274
      publish address password
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3275
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  3276
      return (server_socket, UUID.print password)
69462
fe125722f7a9 more Haskell operations;
wenzelm
parents: 69459
diff changeset
  3277
74084
a8bbeb266651 prefer Isabelle.Bytes, based on ShortByteString;
wenzelm
parents: 74083
diff changeset
  3278
    loop :: Socket -> Bytes -> IO ()
69466
wenzelm
parents: 69465
diff changeset
  3279
    loop server_socket password = forever $ do
69480
wenzelm
parents: 69477
diff changeset
  3280
      (connection, _) <- Socket.accept server_socket
71692
f8e52c0152fe clarified names;
wenzelm
parents: 71490
diff changeset
  3281
      Isabelle_Thread.fork_finally
69465
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3282
        (do
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3283
          line <- Byte_Message.read_line connection
16fa609a62b1 clarified UUID operations;
wenzelm
parents: 69463
diff changeset
  3284
          when (line == Just password) $ handle connection)
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3285
        (\finally -> do
69472
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  3286
          Socket.close connection
69473
f71598c11fae more Haskell operations;
wenzelm
parents: 69472
diff changeset
  3287
          case finally of
69472
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  3288
            Left exn -> IO.hPutStrLn IO.stderr $ Exception.displayException exn
d016ef70c069 tuned messages;
wenzelm
parents: 69467
diff changeset
  3289
            Right () -> return ())
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3290
      return ()
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3291
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3292
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3293
{- client connection -}
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3294
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  3295
connection :: String -> Bytes -> (Socket -> IO a) -> IO a
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3296
connection port password client =
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3297
  Socket.withSocketsDo $ do
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3298
    addr <- resolve
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3299
    Exception.bracket (open addr) Socket.close body
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3300
  where
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3301
    resolve = do
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3302
      let hints =
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3303
            Socket.defaultHints {
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3304
              Socket.addrFlags = [Socket.AI_NUMERICHOST, Socket.AI_NUMERICSERV],
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3305
              Socket.addrSocketType = Socket.Stream }
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3306
      head <$> Socket.getAddrInfo (Just hints) (Just $ make_string localhost_name) (Just port)
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3307
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3308
    open addr = do
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3309
      socket <- Socket.socket (Socket.addrFamily addr) (Socket.addrSocketType addr)
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3310
                  (Socket.addrProtocol addr)
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3311
      Socket.connect socket $ Socket.addrAddress addr
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3312
      return socket
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3313
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3314
    body socket = do
74095
cc23b4e66dce prefer compact Isabelle.Bytes;
wenzelm
parents: 74093
diff changeset
  3315
      Byte_Message.write_line socket password
73178
7e70d7dd1baa more operations for client connection;
wenzelm
parents: 73177
diff changeset
  3316
      client socket
69455
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3317
\<close>
6a901078a294 more Haskell operations;
wenzelm
parents: 69454
diff changeset
  3318
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3319
generate_file "Isabelle/Time.hs" = \<open>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3320
{-  Title:      Isabelle/Time.hs
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3321
    Author:     Makarius
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3322
    LICENSE:    BSD 3-clause (Isabelle)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3323
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3324
Time based on milliseconds.
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3325
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3326
See \<^file>\<open>~~/src/Pure/General/time.scala\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3327
-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3328
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3329
{-# LANGUAGE OverloadedStrings #-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3330
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3331
module Isabelle.Time (
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3332
  Time, seconds, minutes, ms, zero, is_zero, is_relevant,
74209
24a2a6ced0ab more Isabelle/Haskell;
wenzelm
parents: 74205
diff changeset
  3333
  get_seconds, get_minutes, get_ms, message, now
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3334
)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3335
where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3336
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3337
import Text.Printf (printf)
74209
24a2a6ced0ab more Isabelle/Haskell;
wenzelm
parents: 74205
diff changeset
  3338
import Data.Time.Clock.POSIX (getPOSIXTime)
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3339
import Isabelle.Bytes (Bytes)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3340
import Isabelle.Library
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3341
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3342
74218
wenzelm
parents: 74217
diff changeset
  3343
newtype Time = Time Int
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3344
75066
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3345
instance Eq Time where Time a == Time b = a == b
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3346
instance Ord Time where compare (Time a) (Time b) = compare a b
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3347
instance Num Time where
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3348
  fromInteger = Time . fromInteger
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3349
  Time a + Time b = Time (a + b)
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3350
  Time a - Time b = Time (a - b)
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3351
  Time a * Time b = Time (a * b)
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3352
  abs (Time a) = Time (abs a)
fe81645c0b40 more operations;
wenzelm
parents: 75015
diff changeset
  3353
  signum (Time a) = Time (signum a)
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3354
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3355
seconds :: Double -> Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3356
seconds s = Time (round (s * 1000.0))
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3357
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3358
minutes :: Double -> Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3359
minutes m = Time (round (m * 60000.0))
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3360
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3361
ms :: Int -> Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3362
ms = Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3363
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3364
zero :: Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3365
zero = ms 0
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3366
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3367
is_zero :: Time -> Bool
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3368
is_zero (Time ms) = ms == 0
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3369
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3370
is_relevant :: Time -> Bool
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3371
is_relevant (Time ms) = ms >= 1
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3372
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3373
get_seconds :: Time -> Double
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3374
get_seconds (Time ms) = fromIntegral ms / 1000.0
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3375
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3376
get_minutes :: Time -> Double
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3377
get_minutes (Time ms) = fromIntegral ms / 60000.0
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3378
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3379
get_ms :: Time -> Int
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3380
get_ms (Time ms) = ms
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3381
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3382
instance Show Time where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3383
  show t = printf "%.3f" (get_seconds t)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3384
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3385
message :: Time -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3386
message t = make_bytes (show t) <> "s"
74209
24a2a6ced0ab more Isabelle/Haskell;
wenzelm
parents: 74205
diff changeset
  3387
24a2a6ced0ab more Isabelle/Haskell;
wenzelm
parents: 74205
diff changeset
  3388
now :: IO Time
24a2a6ced0ab more Isabelle/Haskell;
wenzelm
parents: 74205
diff changeset
  3389
now = do
24a2a6ced0ab more Isabelle/Haskell;
wenzelm
parents: 74205
diff changeset
  3390
  t <- getPOSIXTime
24a2a6ced0ab more Isabelle/Haskell;
wenzelm
parents: 74205
diff changeset
  3391
  return $ Time (round (realToFrac t * 1000.0 :: Double))
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3392
\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3393
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3394
generate_file "Isabelle/Timing.hs" = \<open>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3395
{-  Title:      Isabelle/Timing.hs
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3396
    Author:     Makarius
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3397
    LICENSE:    BSD 3-clause (Isabelle)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3398
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3399
Support for time measurement.
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3400
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3401
See \<^file>\<open>~~/src/Pure/General/timing.ML\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3402
and \<^file>\<open>~~/src/Pure/General/timing.scala\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3403
-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3404
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3405
module Isabelle.Timing (
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3406
  Timing (..), zero, is_zero, is_relevant
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3407
)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3408
where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3409
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3410
import qualified Isabelle.Time as Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3411
import Isabelle.Time (Time)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3412
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3413
data Timing = Timing {elapsed :: Time, cpu :: Time, gc :: Time}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3414
  deriving (Show, Eq)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3415
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3416
zero :: Timing
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3417
zero = Timing Time.zero Time.zero Time.zero
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3418
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3419
is_zero :: Timing -> Bool
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3420
is_zero t = Time.is_zero (elapsed t) && Time.is_zero (cpu t) && Time.is_zero (gc t)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3421
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3422
is_relevant :: Timing -> Bool
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3423
is_relevant t = Time.is_relevant (elapsed t) || Time.is_relevant (cpu t) || Time.is_relevant (gc t)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3424
\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3425
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3426
generate_file "Isabelle/Bash.hs" = \<open>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3427
{-  Title:      Isabelle/Bash.hs
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3428
    Author:     Makarius
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3429
    LICENSE:    BSD 3-clause (Isabelle)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3430
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3431
Support for GNU bash.
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3432
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3433
See \<^file>\<open>$ISABELLE_HOME/src/Pure/System/bash.ML\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3434
-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3435
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3436
{-# LANGUAGE OverloadedStrings #-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3437
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3438
module Isabelle.Bash (
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3439
  string, strings,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3440
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3441
  Params,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3442
  get_script, get_input, get_cwd, get_putenv, get_redirect,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3443
  get_timeout, get_description,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3444
  script, input, cwd, putenv, redirect, timeout, description,
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3445
  server_run, server_kill,
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3446
  server_uuid, server_interrupt, server_failure, server_result
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3447
)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3448
where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3449
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3450
import Text.Printf (printf)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3451
import qualified Isabelle.Symbol as Symbol
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3452
import qualified Isabelle.Bytes as Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3453
import Isabelle.Bytes (Bytes)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3454
import qualified Isabelle.Time as Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3455
import Isabelle.Time (Time)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3456
import Isabelle.Library
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3457
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3458
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3459
{- concrete syntax -}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3460
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3461
string :: Bytes -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3462
string str =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3463
  if Bytes.null str then "\"\""
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3464
  else str |> Bytes.unpack |> map trans |> Bytes.concat
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3465
    where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3466
      trans b =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3467
        case Bytes.char b of
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3468
          '\t' -> "$'\\t'"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3469
          '\n' -> "$'\\n'"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3470
          '\f' -> "$'\\f'"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3471
          '\r' -> "$'\\r'"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3472
          c ->
74169
wenzelm
parents: 74168
diff changeset
  3473
            if Symbol.is_ascii_letter c || Symbol.is_ascii_digit c || c `elem` ("+,-./:_" :: String)
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3474
            then Bytes.singleton b
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3475
            else if b < 32 || b >= 127 then make_bytes (printf "$'\\x%02x'" b :: String)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3476
            else "\\" <> Bytes.singleton b
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3477
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3478
strings :: [Bytes] -> Bytes
80910
406a85a25189 clarified signature: more explicit operations;
wenzelm
parents: 80601
diff changeset
  3479
strings = implode_space . map string
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3480
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3481
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3482
{- server parameters -}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3483
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3484
data Params = Params {
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3485
    _script :: Bytes,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3486
    _input :: Bytes,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3487
    _cwd :: Maybe Bytes,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3488
    _putenv :: [(Bytes, Bytes)],
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3489
    _redirect :: Bool,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3490
    _timeout :: Time,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3491
    _description :: Bytes}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3492
  deriving (Show, Eq)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3493
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3494
get_script :: Params -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3495
get_script = _script
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3496
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3497
get_input :: Params -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3498
get_input = _input
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3499
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3500
get_cwd :: Params -> Maybe Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3501
get_cwd = _cwd
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3502
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3503
get_putenv :: Params -> [(Bytes, Bytes)]
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3504
get_putenv = _putenv
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3505
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3506
get_redirect :: Params -> Bool
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3507
get_redirect = _redirect
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3508
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3509
get_timeout :: Params -> Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3510
get_timeout = _timeout
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3511
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3512
get_description :: Params -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3513
get_description = _description
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3514
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3515
script :: Bytes -> Params
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3516
script script = Params script "" Nothing [] False Time.zero ""
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3517
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3518
input :: Bytes -> Params -> Params
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3519
input input params = params { _input = input }
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3520
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3521
cwd :: Bytes -> Params -> Params
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3522
cwd cwd params = params { _cwd = Just cwd }
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3523
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3524
putenv :: [(Bytes, Bytes)] -> Params -> Params
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3525
putenv putenv params = params { _putenv = putenv }
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3526
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3527
redirect :: Params -> Params
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3528
redirect params = params { _redirect = True }
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3529
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3530
timeout :: Time -> Params -> Params
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3531
timeout timeout params = params { _timeout = timeout }
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3532
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3533
description :: Bytes -> Params -> Params
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3534
description description params = params { _description = description }
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3535
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3536
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3537
{- server messages -}
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3538
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3539
server_run, server_kill :: Bytes
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3540
server_run = \<open>Bash.server_run\<close>;
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3541
server_kill = \<open>Bash.server_kill\<close>;
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3542
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3543
server_uuid, server_interrupt, server_failure, server_result :: Bytes
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3544
server_uuid = \<open>Bash.server_uuid\<close>;
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3545
server_interrupt = \<open>Bash.server_interrupt\<close>;
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3546
server_failure = \<open>Bash.server_failure\<close>;
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3547
server_result = \<open>Bash.server_result\<close>;
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3548
\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3549
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3550
generate_file "Isabelle/Process_Result.hs" = \<open>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3551
{-  Title:      Isabelle/Process_Result.hs
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3552
    Author:     Makarius
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3553
    LICENSE:    BSD 3-clause (Isabelle)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3554
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3555
Result of system process.
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3556
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3557
See \<^file>\<open>~~/src/Pure/System/process_result.ML\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3558
and \<^file>\<open>~~/src/Pure/System/process_result.scala\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3559
-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3560
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3561
{-# LANGUAGE OverloadedStrings #-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3562
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3563
module Isabelle.Process_Result (
74310
d7a62db70a07 clarified signature;
wenzelm
parents: 74231
diff changeset
  3564
  ok_rc, error_rc, failure_rc, interrupt_rc , timeout_rc,
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3565
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3566
  T, make, rc, out_lines, err_lines, timing, timing_elapsed, out, err, ok, check
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3567
)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3568
where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3569
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3570
import Isabelle.Time (Time)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3571
import qualified Isabelle.Timing as Timing
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3572
import Isabelle.Timing (Timing)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3573
import Isabelle.Bytes (Bytes)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3574
import Isabelle.Library
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3575
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3576
74310
d7a62db70a07 clarified signature;
wenzelm
parents: 74231
diff changeset
  3577
ok_rc, error_rc, failure_rc, interrupt_rc , timeout_rc :: Int
d7a62db70a07 clarified signature;
wenzelm
parents: 74231
diff changeset
  3578
ok_rc = 0
d7a62db70a07 clarified signature;
wenzelm
parents: 74231
diff changeset
  3579
error_rc = 1
d7a62db70a07 clarified signature;
wenzelm
parents: 74231
diff changeset
  3580
failure_rc = 2
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3581
interrupt_rc = 130
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3582
timeout_rc = 142
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3583
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3584
data T =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3585
  Process_Result {
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3586
    _rc :: Int,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3587
    _out_lines :: [Bytes],
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3588
    _err_lines :: [Bytes],
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3589
    _timing :: Timing}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3590
  deriving (Show, Eq)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3591
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3592
make :: Int -> [Bytes] -> [Bytes] -> Timing -> T
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3593
make = Process_Result
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3594
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3595
rc :: T -> Int
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3596
rc = _rc
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3597
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3598
out_lines :: T -> [Bytes]
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3599
out_lines = _out_lines
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3600
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3601
err_lines :: T -> [Bytes]
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3602
err_lines = _err_lines
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3603
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3604
timing :: T -> Timing
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3605
timing = _timing
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3606
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3607
timing_elapsed :: T -> Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3608
timing_elapsed = Timing.elapsed . timing
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3609
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3610
out :: T -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3611
out = trim_line . cat_lines . out_lines
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3612
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3613
err :: T -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3614
err = trim_line . cat_lines . err_lines
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3615
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3616
ok :: T -> Bool
74310
d7a62db70a07 clarified signature;
wenzelm
parents: 74231
diff changeset
  3617
ok result = rc result == ok_rc
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3618
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3619
check :: T -> T
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3620
check result = if ok result then result else error (make_string $ err result)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3621
\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3622
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3623
generate_file "Isabelle/Options.hs" = \<open>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3624
{-  Title:      Isabelle/Options.hs
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3625
    Author:     Makarius
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3626
    LICENSE:    BSD 3-clause (Isabelle)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3627
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3628
System options with external string representation.
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3629
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3630
See \<^file>\<open>~~/src/Pure/System/options.ML\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3631
and \<^file>\<open>~~/src/Pure/System/options.scala\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3632
-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3633
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3634
{-# LANGUAGE OverloadedStrings #-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3635
{-# LANGUAGE InstanceSigs #-}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3636
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3637
module Isabelle.Options (
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3638
  boolT, intT, realT, stringT, unknownT,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3639
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3640
  T, typ, bool, int, real, seconds, string,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3641
  decode
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3642
)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3643
where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3644
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3645
import qualified Data.Map.Strict as Map
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3646
import Data.Map.Strict (Map)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3647
import qualified Isabelle.Properties as Properties
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3648
import Isabelle.Bytes (Bytes)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3649
import qualified Isabelle.Value as Value
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3650
import qualified Isabelle.Time as Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3651
import Isabelle.Time (Time)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3652
import Isabelle.Library
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3653
import qualified Isabelle.XML.Decode as Decode
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3654
import Isabelle.XML.Classes (Decode (..))
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3655
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3656
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3657
{- representation -}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3658
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3659
boolT :: Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3660
boolT = "bool"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3661
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3662
intT :: Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3663
intT = "int"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3664
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3665
realT :: Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3666
realT = "real"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3667
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3668
stringT :: Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3669
stringT = "string"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3670
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3671
unknownT :: Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3672
unknownT = "unknown"
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3673
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3674
data Opt = Opt {
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3675
  _pos :: Properties.T,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3676
  _name :: Bytes,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3677
  _typ :: Bytes,
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3678
  _value :: Bytes }
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3679
75015
eaf22c0e9ddf tuned -- fewer warnings;
wenzelm
parents: 74871
diff changeset
  3680
newtype T = Options (Map Bytes Opt)
74161
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3681
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3682
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3683
{- check -}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3684
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3685
check_name :: T -> Bytes -> Opt
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3686
check_name (Options map) name =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3687
  case Map.lookup name map of
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3688
    Just opt | _typ opt /= unknownT -> opt
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3689
    _ -> error (make_string ("Unknown system option " <> quote name))
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3690
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3691
check_type :: T -> Bytes -> Bytes -> Opt
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3692
check_type options name typ =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3693
  let
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3694
    opt = check_name options name
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3695
    t = _typ opt
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3696
  in
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3697
    if t == typ then opt
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3698
    else error (make_string ("Ill-typed system option " <> quote name <> " : " <> t <> " vs. " <> typ))
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3699
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3700
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3701
{- get typ -}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3702
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3703
typ :: T -> Bytes -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3704
typ options name = _typ (check_name options name)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3705
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3706
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3707
{- get value -}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3708
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3709
get :: Bytes -> (Bytes -> Maybe a) -> T -> Bytes -> a
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3710
get typ parse options name =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3711
  let opt = check_type options name typ in
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3712
    case parse (_value opt) of
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3713
      Just x -> x
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3714
      Nothing ->
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3715
        error (make_string ("Malformed value for system option " <> quote name <>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3716
          " : " <> typ <> " =\n" <> quote (_value opt)))
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3717
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3718
bool :: T -> Bytes -> Bool
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3719
bool = get boolT Value.parse_bool
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3720
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3721
int :: T -> Bytes -> Int
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3722
int = get intT Value.parse_int
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3723
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3724
real :: T -> Bytes -> Double
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3725
real = get realT Value.parse_real
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3726
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3727
seconds :: T -> Bytes -> Time
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3728
seconds options = Time.seconds . real options
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3729
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3730
string :: T -> Bytes -> Bytes
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3731
string = get stringT Just
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3732
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3733
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3734
{- decode -}
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3735
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3736
instance Decode T where
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3737
  decode :: Decode.T T
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3738
  decode =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3739
    let
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3740
      decode_entry :: Decode.T (Bytes, Opt)
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3741
      decode_entry body =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3742
        let
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3743
          (pos, (name, (typ, value))) =
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3744
            Decode.pair Decode.properties (Decode.pair Decode.string (Decode.pair Decode.string Decode.string)) body
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3745
        in (name, Opt { _pos = pos, _name = name, _typ = typ, _value = value })
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3746
    in Options . Map.fromList . Decode.list decode_entry
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3747
\<close>
3f371ba2b4fc more Haskell operations;
wenzelm
parents: 74137
diff changeset
  3748
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3749
generate_file "Isabelle/Isabelle_System.hs" = \<open>
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3750
{-  Title:      Isabelle/Isabelle_System.hs
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3751
    Author:     Makarius
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3752
    LICENSE:    BSD 3-clause (Isabelle)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3753
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3754
Isabelle system support.
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3755
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3756
See \<^file>\<open>~~/src/Pure/System/isabelle_system.ML\<close>
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3757
and \<^file>\<open>~~/src/Pure/System/isabelle_system.scala\<close>
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3758
-}
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3759
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3760
{-# LANGUAGE OverloadedStrings #-}
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3761
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3762
module Isabelle.Isabelle_System (
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3763
  bash_process, bash_process0
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3764
)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3765
where
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3766
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3767
import Data.Maybe (fromMaybe)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3768
import Control.Exception (throw, AsyncException (UserInterrupt))
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3769
import Network.Socket (Socket)
74216
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
  3770
import qualified Isabelle.Bytes as Bytes
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3771
import Isabelle.Bytes (Bytes)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3772
import qualified Isabelle.Byte_Message as Byte_Message
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3773
import qualified Isabelle.Time as Time
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3774
import Isabelle.Timing (Timing (..))
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3775
import qualified Isabelle.Options as Options
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3776
import qualified Isabelle.Bash as Bash
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3777
import qualified Isabelle.Process_Result as Process_Result
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3778
import qualified Isabelle.XML.Encode as Encode
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3779
import qualified Isabelle.YXML as YXML
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3780
import qualified Isabelle.Value as Value
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3781
import qualified Isabelle.Server as Server
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3782
import qualified Isabelle.Isabelle_Thread as Isabelle_Thread
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3783
import Isabelle.Library
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3784
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3785
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3786
{- bash_process -}
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3787
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3788
absolute_path :: Bytes -> Bytes  -- FIXME dummy
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3789
absolute_path = id
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3790
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3791
bash_process :: Options.T -> Bash.Params -> IO Process_Result.T
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3792
bash_process options = bash_process0 address password
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3793
  where
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3794
    address = Options.string options "bash_process_address"
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3795
    password = Options.string options "bash_process_password"
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3796
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3797
bash_process0 :: Bytes -> Bytes -> Bash.Params -> IO Process_Result.T
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3798
bash_process0 address password params = do
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3799
  Server.connection port password
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3800
    (\socket -> do
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3801
        isabelle_tmp <- getenv "ISABELLE_TMP"
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3802
        Byte_Message.write_message socket (run isabelle_tmp)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3803
        loop Nothing socket)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3804
  where
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3805
    port =
74216
a308ed696b58 more Isabelle/Haskell operations;
wenzelm
parents: 74214
diff changeset
  3806
      case Bytes.try_unprefix Server.localhost_prefix address of
74211
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3807
        Just port -> make_string port
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3808
        Nothing -> errorWithoutStackTrace "Bad bash_process server address"
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3809
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3810
    script = Bash.get_script params
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3811
    input = Bash.get_input params
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3812
    cwd = Bash.get_cwd params
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3813
    putenv = Bash.get_putenv params
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3814
    redirect = Bash.get_redirect params
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3815
    timeout = Bash.get_timeout params
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3816
    description = Bash.get_description params
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3817
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3818
    run :: Bytes -> [Bytes]
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3819
    run isabelle_tmp =
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3820
     [Bash.server_run, script, input,
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3821
      YXML.string_of_body (Encode.option (Encode.string . absolute_path) cwd),
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3822
      YXML.string_of_body
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3823
      (Encode.list (Encode.pair Encode.string Encode.string)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3824
        (("ISABELLE_TMP", isabelle_tmp) : putenv)),
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3825
      Value.print_bool redirect,
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3826
      Value.print_real (Time.get_seconds timeout),
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3827
      description]
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3828
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3829
    kill :: Maybe Bytes -> IO ()
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3830
    kill maybe_uuid = do
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3831
      case maybe_uuid of
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3832
        Just uuid ->
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3833
          Server.connection port password (\socket ->
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3834
            Byte_Message.write_message socket [Bash.server_kill, uuid])
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3835
        Nothing -> return ()
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3836
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3837
    err = errorWithoutStackTrace "Malformed result from bash_process server"
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3838
    the = fromMaybe err
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3839
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3840
    loop :: Maybe Bytes -> Socket -> IO Process_Result.T
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3841
    loop maybe_uuid socket = do
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3842
      result <- Isabelle_Thread.bracket_resource (kill maybe_uuid) (Byte_Message.read_message socket)
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3843
      case result of
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3844
        Just [head, uuid] | head == Bash.server_uuid -> loop (Just uuid) socket
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3845
        Just [head] | head == Bash.server_interrupt -> throw UserInterrupt
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3846
        Just [head, msg] | head == Bash.server_failure -> errorWithoutStackTrace $ make_string msg
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3847
        Just (head : a : b : c : d : lines) | head == Bash.server_result ->
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3848
          let
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3849
            rc = the $ Value.parse_int a
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3850
            elapsed = Time.ms $ the $ Value.parse_int b
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3851
            cpu = Time.ms $ the $ Value.parse_int c
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3852
            timing = Timing elapsed cpu Time.zero
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3853
            n = the $ Value.parse_int d
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3854
            out_lines = take n lines
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3855
            err_lines = drop n lines
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3856
          in return $ Process_Result.make rc out_lines err_lines timing
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3857
        _ -> err
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3858
\<close>
2ee03f7abd8d more Isabelle/Haskell operations;
wenzelm
parents: 74209
diff changeset
  3859
75068
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3860
generate_file "Isabelle/Cache.hs" = \<open>
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3861
{-  Title:      Isabelle/Cache.hs
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3862
    Author:     Makarius
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3863
    LICENSE:    BSD 3-clause (Isabelle)
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3864
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3865
Cache for slow computations.
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3866
-}
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3867
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3868
module Isabelle.Cache (
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3869
  T, init, apply, prune
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3870
)
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3871
where
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3872
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3873
import Prelude hiding (init)
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3874
import Data.IORef
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3875
import Data.Map.Strict (Map)
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3876
import qualified Data.Map.Strict as Map
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3877
import qualified Data.List as List
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3878
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3879
import Isabelle.Time (Time)
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3880
import qualified Isabelle.Time as Time
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3881
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3882
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3883
data Entry v = Entry {_value :: v, _access :: Time, _timing :: Time}
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3884
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3885
newtype T k v = Cache (IORef (Map k (Entry v)))
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3886
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3887
init :: IO (T k v)
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3888
init = Cache <$> newIORef Map.empty
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3889
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3890
commit :: Ord k => T k v -> k -> Entry v -> IO v
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3891
commit (Cache ref) x e = do
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3892
  atomicModifyIORef' ref (\entries ->
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3893
    let
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3894
      entry =
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3895
        case Map.lookup x entries of
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3896
          Just e' | _access e' > _access e -> e'
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3897
          _ -> e
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3898
    in (Map.insert x entry entries, _value entry))
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3899
75072
5299272be4c3 clarified signature;
wenzelm
parents: 75068
diff changeset
  3900
apply :: Ord k => T k v -> k -> IO v -> IO v
5299272be4c3 clarified signature;
wenzelm
parents: 75068
diff changeset
  3901
apply cache@(Cache ref) x body = do
75068
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3902
  start <- Time.now
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3903
  entries <- readIORef ref
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3904
  case Map.lookup x entries of
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3905
    Just entry -> do
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3906
      commit cache x (entry {_access = start})
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3907
    Nothing -> do
75072
5299272be4c3 clarified signature;
wenzelm
parents: 75068
diff changeset
  3908
      y <- body
75068
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3909
      stop <- Time.now
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3910
      commit cache x (Entry y start (stop - start))
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3911
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3912
prune :: Ord k => T k v -> Int -> Time -> IO ()
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3913
prune (Cache ref) max_size min_timing = do
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3914
  atomicModifyIORef' ref (\entries ->
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3915
    let
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3916
      sort = List.sortBy (\(_, e1) (_, e2) -> compare (_access e2) (_access e1))
79741
513829904beb more scalable: avoid potentially expensive ordering of underlying key data type, e.g. in MESON.Cache of Naproche;
wenzelm
parents: 78307
diff changeset
  3917
      entries1 = Map.filter (\e -> _timing e >= min_timing) entries
75068
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3918
      entries2 =
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3919
        if Map.size entries1 <= max_size then entries1
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3920
        else Map.fromList $ List.take max_size $ sort $ Map.toList entries1
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3921
    in (entries2, ()))
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3922
\<close>
99fcf3fda2fc provide cache for slow computations;
wenzelm
parents: 75066
diff changeset
  3923
70047
96fe857a7a6f clarified signature: more explicit operations for corresponding Isar commands;
wenzelm
parents: 69968
diff changeset
  3924
export_generated_files _
69628
a2fbfdc5e62d export generated files;
wenzelm
parents: 69499
diff changeset
  3925
69222
8365124a86ae support for Isabelle tool development in Haskell;
wenzelm
parents:
diff changeset
  3926
end