author  wenzelm 
Wed, 04 Apr 2012 14:00:47 +0200  
changeset 47335  693276dcc512 
parent 47051  b32e6de4a39b 
child 47336  bed4b2738d8a 
permissions  rwrr 
38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

1 
(* Title: Pure/PIDE/document.ML 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

2 
Author: Makarius 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

3 

67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

4 
Document as collection of named nodes, each consisting of an editable 
44478
4fdb1009a370
tuned signature  emphasize traditional read/eval/print terminology, which is still relevant here;
wenzelm
parents:
44476
diff
changeset

5 
list of commands, with asynchronous read/eval/print processes. 
38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

6 
*) 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

7 

67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

8 
signature DOCUMENT = 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

9 
sig 
38363
af7f41a8a0a8
clarified "state" (accumulated data) vs. "exec" (execution that produces data);
wenzelm
parents:
38355
diff
changeset

10 
type id = int 
38373  11 
type version_id = id 
38363
af7f41a8a0a8
clarified "state" (accumulated data) vs. "exec" (execution that produces data);
wenzelm
parents:
38355
diff
changeset

12 
type command_id = id 
38373  13 
type exec_id = id 
38363
af7f41a8a0a8
clarified "state" (accumulated data) vs. "exec" (execution that produces data);
wenzelm
parents:
38355
diff
changeset

14 
val no_id: id 
38419  15 
val new_id: unit > id 
38363
af7f41a8a0a8
clarified "state" (accumulated data) vs. "exec" (execution that produces data);
wenzelm
parents:
38355
diff
changeset

16 
val parse_id: string > id 
af7f41a8a0a8
clarified "state" (accumulated data) vs. "exec" (execution that produces data);
wenzelm
parents:
38355
diff
changeset

17 
val print_id: id > string 
46938
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46910
diff
changeset

18 
type node_header = (string * Thy_Header.header) Exn.result 
44157
a21d3e1e64fd
uniform treatment of header edits as document edits;
wenzelm
parents:
44156
diff
changeset

19 
datatype node_edit = 
44185  20 
Clear  
44157
a21d3e1e64fd
uniform treatment of header edits as document edits;
wenzelm
parents:
44156
diff
changeset

21 
Edits of (command_id option * command_id option) list  
44384  22 
Header of node_header  
44385
e7fdb008aa7d
propagate editor perspective through document model;
wenzelm
parents:
44384
diff
changeset

23 
Perspective of command_id list 
44156  24 
type edit = string * node_edit 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

25 
type state 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

26 
val init_state: state 
44644
317e4962dd0f
clarified define_command: store name as structural information;
wenzelm
parents:
44643
diff
changeset

27 
val define_command: command_id > string > string > state > state 
44301  28 
val cancel_execution: state > Future.task list 
44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

29 
val update_perspective: version_id > version_id > string > command_id list > state > state 
44481  30 
val update: version_id > version_id > edit list > state > 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

31 
((command_id * exec_id option) list * (string * command_id option) list) * state 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

32 
val execute: version_id > state > state 
44673  33 
val remove_versions: version_id list > state > state 
43713
1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

34 
val state: unit > state 
1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

35 
val change_state: (state > state) > unit 
38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

36 
end; 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

37 

67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

38 
structure Document: DOCUMENT = 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

39 
struct 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

40 

67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

41 
(* unique identifiers *) 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

42 

38363
af7f41a8a0a8
clarified "state" (accumulated data) vs. "exec" (execution that produces data);
wenzelm
parents:
38355
diff
changeset

43 
type id = int; 
38373  44 
type version_id = id; 
38363
af7f41a8a0a8
clarified "state" (accumulated data) vs. "exec" (execution that produces data);
wenzelm
parents:
38355
diff
changeset

45 
type command_id = id; 
38373  46 
type exec_id = id; 
38355
8cb265fb12fe
represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents:
38150
diff
changeset

47 

8cb265fb12fe
represent document ids by (long) int, to benefit from the somewhat faster Inttab in ML (LinearSet in Scala is invariably indexed by native object ids);
wenzelm
parents:
38150
diff
changeset

48 
val no_id = 0; 
40449  49 
val new_id = Synchronized.counter (); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

50 

38414
49f1f657adc2
more basic Markup.parse_int/print_int (using signed_string_of_int) (ML);
wenzelm
parents:
38373
diff
changeset

51 
val parse_id = Markup.parse_int; 
49f1f657adc2
more basic Markup.parse_int/print_int (using signed_string_of_int) (ML);
wenzelm
parents:
38373
diff
changeset

52 
val print_id = Markup.print_int; 
38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

53 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

54 
fun err_dup kind id = error ("Duplicate " ^ kind ^ ": " ^ print_id id); 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

55 
fun err_undef kind id = error ("Undefined " ^ kind ^ ": " ^ print_id id); 
38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

56 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

57 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

58 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

59 
(** document structure **) 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

60 

46938
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46910
diff
changeset

61 
type node_header = (string * Thy_Header.header) Exn.result; 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

62 
type perspective = (command_id > bool) * command_id option; (*visible commands, last*) 
38448
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

63 
structure Entries = Linear_Set(type key = command_id val ord = int_ord); 
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

64 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

65 
type exec = exec_id * (Toplevel.state * unit lazy) lazy; (*eval/print process*) 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

66 
val no_print = Lazy.value (); 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

67 
val no_exec = (no_id, Lazy.value (Toplevel.toplevel, no_print)); 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

68 

43668  69 
abstype node = Node of 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

70 
{touched: bool, 
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

71 
header: node_header, 
44386
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

72 
perspective: perspective, 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

73 
entries: exec option Entries.T, (*command entries with excecutions*) 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

74 
last_exec: command_id option, (*last command with exec state assignment*) 
44197
458573968568
refined Document.edit: less stateful update via Graph.schedule;
wenzelm
parents:
44196
diff
changeset

75 
result: Toplevel.state lazy} 
43668  76 
and version = Version of node Graph.T (*development graph wrt. static imports*) 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

77 
with 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

78 

44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

79 
fun make_node (touched, header, perspective, entries, last_exec, result) = 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

80 
Node {touched = touched, header = header, perspective = perspective, 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

81 
entries = entries, last_exec = last_exec, result = result}; 
43668  82 

44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

83 
fun map_node f (Node {touched, header, perspective, entries, last_exec, result}) = 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

84 
make_node (f (touched, header, perspective, entries, last_exec, result)); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

85 

44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

86 
fun make_perspective command_ids : perspective = 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

87 
(Inttab.defined (Inttab.make (map (rpair ()) command_ids)), try List.last command_ids); 
44441  88 

44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

89 
val no_header = Exn.Exn (ERROR "Bad theory header"); 
44441  90 
val no_perspective = make_perspective []; 
44386
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

91 
val no_result = Lazy.value Toplevel.toplevel; 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

92 

44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

93 
val empty_node = make_node (false, no_header, no_perspective, Entries.empty, NONE, no_result); 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

94 
val clear_node = map_node (fn (_, header, _, _, _, _) => 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

95 
(false, header, no_perspective, Entries.empty, NONE, no_result)); 
44386
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

96 

4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

97 

4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

98 
(* basic components *) 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

99 

44446  100 
fun is_touched (Node {touched, ...}) = touched; 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

101 
fun set_touched touched = 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

102 
map_node (fn (_, header, perspective, entries, last_exec, result) => 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

103 
(touched, header, perspective, entries, last_exec, result)); 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

104 

44180  105 
fun get_header (Node {header, ...}) = header; 
44385
e7fdb008aa7d
propagate editor perspective through document model;
wenzelm
parents:
44384
diff
changeset

106 
fun set_header header = 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

107 
map_node (fn (touched, _, perspective, entries, last_exec, result) => 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

108 
(touched, header, perspective, entries, last_exec, result)); 
44180  109 

44385
e7fdb008aa7d
propagate editor perspective through document model;
wenzelm
parents:
44384
diff
changeset

110 
fun get_perspective (Node {perspective, ...}) = perspective; 
44441  111 
fun set_perspective ids = 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

112 
map_node (fn (touched, header, _, entries, last_exec, result) => 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

113 
(touched, header, make_perspective ids, entries, last_exec, result)); 
44385
e7fdb008aa7d
propagate editor perspective through document model;
wenzelm
parents:
44384
diff
changeset

114 

44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

115 
fun map_entries f = 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

116 
map_node (fn (touched, header, perspective, entries, last_exec, result) => 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

117 
(touched, header, perspective, f entries, last_exec, result)); 
44643
9987ae55e17b
amended last_common, if that happens to the very last entry (important to load HOL/Auth, for example);
wenzelm
parents:
44614
diff
changeset

118 
fun get_entries (Node {entries, ...}) = entries; 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

119 

5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

120 
fun iterate_entries f = Entries.iterate NONE f o get_entries; 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

121 
fun iterate_entries_after start f (Node {entries, ...}) = 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

122 
(case Entries.get_after entries start of 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

123 
NONE => I 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

124 
 SOME id => Entries.iterate (SOME id) f entries); 
43668  125 

44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

126 
fun get_last_exec (Node {last_exec, ...}) = last_exec; 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

127 
fun set_last_exec last_exec = 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

128 
map_node (fn (touched, header, perspective, entries, _, result) => 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

129 
(touched, header, perspective, entries, last_exec, result)); 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

130 

44386
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

131 
fun get_theory pos (Node {result, ...}) = Toplevel.end_theory pos (Lazy.force result); 
44385
e7fdb008aa7d
propagate editor perspective through document model;
wenzelm
parents:
44384
diff
changeset

132 
fun set_result result = 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

133 
map_node (fn (touched, header, perspective, entries, last_exec, _) => 
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

134 
(touched, header, perspective, entries, last_exec, result)); 
44180  135 

44185  136 
fun get_node nodes name = Graph.get_node nodes name handle Graph.UNDEF _ => empty_node; 
44202  137 
fun default_node name = Graph.default_node (name, empty_node); 
138 
fun update_node name f = default_node name #> Graph.map_node name f; 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

139 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

140 

38448
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

141 
(* node edits and associated executions *) 
38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

142 

44157
a21d3e1e64fd
uniform treatment of header edits as document edits;
wenzelm
parents:
44156
diff
changeset

143 
datatype node_edit = 
44185  144 
Clear  
44157
a21d3e1e64fd
uniform treatment of header edits as document edits;
wenzelm
parents:
44156
diff
changeset

145 
Edits of (command_id option * command_id option) list  
44384  146 
Header of node_header  
44385
e7fdb008aa7d
propagate editor perspective through document model;
wenzelm
parents:
44384
diff
changeset

147 
Perspective of command_id list; 
44157
a21d3e1e64fd
uniform treatment of header edits as document edits;
wenzelm
parents:
44156
diff
changeset

148 

44156  149 
type edit = string * node_edit; 
38448
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

150 

44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

151 
fun after_entry (Node {entries, ...}) = Entries.get_after entries; 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

152 

44480
38c5b085fb1c
improved Document.edit: more accurate update_start and no_execs;
wenzelm
parents:
44479
diff
changeset

153 
fun lookup_entry (Node {entries, ...}) id = 
38c5b085fb1c
improved Document.edit: more accurate update_start and no_execs;
wenzelm
parents:
44479
diff
changeset

154 
(case Entries.lookup entries id of 
38c5b085fb1c
improved Document.edit: more accurate update_start and no_execs;
wenzelm
parents:
44479
diff
changeset

155 
NONE => NONE 
38c5b085fb1c
improved Document.edit: more accurate update_start and no_execs;
wenzelm
parents:
44479
diff
changeset

156 
 SOME (exec, _) => exec); 
38c5b085fb1c
improved Document.edit: more accurate update_start and no_execs;
wenzelm
parents:
44479
diff
changeset

157 

43668  158 
fun the_entry (Node {entries, ...}) id = 
38448
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

159 
(case Entries.lookup entries id of 
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

160 
NONE => err_undef "command entry" id 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

161 
 SOME (exec, _) => exec); 
38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

162 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

163 
fun the_default_entry node (SOME id) = (id, (the_default no_exec (the_entry node id))) 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

164 
 the_default_entry _ NONE = (no_id, no_exec); 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

165 

44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

166 
fun update_entry id exec = 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

167 
map_entries (Entries.update (id, exec)); 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

168 

c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

169 
fun reset_entry id node = 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

170 
if is_some (lookup_entry node id) then update_entry id NONE node else node; 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

171 

38448
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

172 
fun reset_after id entries = 
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

173 
(case Entries.get_after entries id of 
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

174 
NONE => entries 
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

175 
 SOME next => Entries.update (next, NONE) entries); 
62d16c415019
added functor Linear_Set, based on former adhoc structures in document.ML;
wenzelm
parents:
38421
diff
changeset

176 

43668  177 
val edit_node = map_entries o fold 
178 
(fn (id, SOME id2) => Entries.insert_after id (id2, NONE) 

179 
 (id, NONE) => Entries.delete_after id #> reset_after id); 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

180 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

181 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

182 
(* version operations *) 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

183 

44185  184 
val empty_version = Version Graph.empty; 
185 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

186 
fun nodes_of (Version nodes) = nodes; 
44185  187 
val node_of = get_node o nodes_of; 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

188 

44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

189 
local 
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

190 

44185  191 
fun cycle_msg names = "Cyclic dependency of " ^ space_implode " via " (map quote names); 
44180  192 

44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

193 
fun touch_node name nodes = 
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

194 
fold (fn desc => 
44643
9987ae55e17b
amended last_common, if that happens to the very last entry (important to load HOL/Auth, for example);
wenzelm
parents:
44614
diff
changeset

195 
update_node desc 
9987ae55e17b
amended last_common, if that happens to the very last entry (important to load HOL/Auth, for example);
wenzelm
parents:
44614
diff
changeset

196 
(set_touched true #> 
9987ae55e17b
amended last_common, if that happens to the very last entry (important to load HOL/Auth, for example);
wenzelm
parents:
44614
diff
changeset

197 
desc <> name ? (map_entries (reset_after NONE) #> set_result no_result))) 
44202  198 
(Graph.all_succs nodes [name]) nodes; 
199 

44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

200 
in 
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

201 

44157
a21d3e1e64fd
uniform treatment of header edits as document edits;
wenzelm
parents:
44156
diff
changeset

202 
fun edit_nodes (name, node_edit) (Version nodes) = 
a21d3e1e64fd
uniform treatment of header edits as document edits;
wenzelm
parents:
44156
diff
changeset

203 
Version 
44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

204 
(case node_edit of 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

205 
Clear => 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

206 
nodes 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

207 
> update_node name clear_node 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

208 
> touch_node name 
44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

209 
 Edits edits => 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

210 
nodes 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

211 
> update_node name (edit_node edits) 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

212 
> touch_node name 
44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

213 
 Header header => 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

214 
let 
46938
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46910
diff
changeset

215 
val imports = (case header of Exn.Res (_, {imports, ...}) => imports  _ => []); 
46945  216 
val header' = 
46958
0ec8f04e753a
define keywords early when processing the theory header, before running the body commands;
wenzelm
parents:
46950
diff
changeset

217 
((case header of Exn.Res (_, h) => Thy_Header.define_keywords h  _ => ()); header) 
46945  218 
handle exn as ERROR _ => Exn.Exn exn; 
44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

219 
val nodes1 = nodes 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

220 
> default_node name 
46739
6024353549ca
clarified document nodes (full import graph) vs. node_status (nonpreloaded theories);
wenzelm
parents:
45674
diff
changeset

221 
> fold default_node imports; 
44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

222 
val nodes2 = nodes1 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

223 
> Graph.Keys.fold 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

224 
(fn dep => Graph.del_edge (dep, name)) (Graph.imm_preds nodes1 name); 
46945  225 
val (header'', nodes3) = 
226 
(header', Graph.add_deps_acyclic (name, imports) nodes2) 

44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

227 
handle Graph.CYCLES cs => (Exn.Exn (ERROR (cat_lines (map cycle_msg cs))), nodes2); 
46945  228 
in Graph.map_node name (set_header header'') nodes3 end 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

229 
> touch_node name 
44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

230 
 Perspective perspective => 
44544
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

231 
update_node name (set_perspective perspective) nodes); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

232 

44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

233 
end; 
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

234 

44222
9d5ef6cd4ee1
use full .thy file name as node name, which makes MiscUtilities.resolveSymlinks/File.getCanonicalPath more predictable;
wenzelm
parents:
44202
diff
changeset

235 
fun put_node (name, node) (Version nodes) = 
9d5ef6cd4ee1
use full .thy file name as node name, which makes MiscUtilities.resolveSymlinks/File.getCanonicalPath more predictable;
wenzelm
parents:
44202
diff
changeset

236 
Version (update_node name (K node) nodes); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

237 

38150
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

238 
end; 
67fc24df3721
simplified/refined document model: collection of named nodes, without proper dependencies yet;
wenzelm
parents:
diff
changeset

239 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

240 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

241 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

242 
(** global state  document structure and execution process **) 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

243 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

244 
abstype state = State of 
40398  245 
{versions: version Inttab.table, (*version_id > document content*) 
47335  246 
commands: (string * Token.T list lazy) Inttab.table, (*command_id > named span*) 
44673  247 
execution: version_id * Future.group} (*current execution process*) 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

248 
with 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

249 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

250 
fun make_state (versions, commands, execution) = 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

251 
State {versions = versions, commands = commands, execution = execution}; 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

252 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

253 
fun map_state f (State {versions, commands, execution}) = 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

254 
make_state (f (versions, commands, execution)); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

255 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

256 
val init_state = 
44675
f665a5d35a3d
discontinued predefined empty command (obsolete!?);
wenzelm
parents:
44674
diff
changeset

257 
make_state (Inttab.make [(no_id, empty_version)], Inttab.empty, (no_id, Future.new_group NONE)); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

258 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

259 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

260 
(* document versions *) 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

261 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

262 
fun define_version (id: version_id) version = 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

263 
map_state (fn (versions, commands, execution) => 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

264 
let val versions' = Inttab.update_new (id, version) versions 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

265 
handle Inttab.DUP dup => err_dup "document version" dup 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

266 
in (versions', commands, execution) end); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

267 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

268 
fun the_version (State {versions, ...}) (id: version_id) = 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

269 
(case Inttab.lookup versions id of 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

270 
NONE => err_undef "document version" id 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

271 
 SOME version => version); 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

272 

44673  273 
fun delete_version (id: version_id) versions = Inttab.delete id versions 
274 
handle Inttab.UNDEF _ => err_undef "document version" id; 

275 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

276 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

277 
(* commands *) 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

278 

46910
3e068ef04b42
clarified command state  markup within proper_range, excluding trailing whitespace;
wenzelm
parents:
46876
diff
changeset

279 
fun parse_command id text = 
46876
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

280 
Position.setmp_thread_data (Position.id_only id) 
46910
3e068ef04b42
clarified command state  markup within proper_range, excluding trailing whitespace;
wenzelm
parents:
46876
diff
changeset

281 
(fn () => 
3e068ef04b42
clarified command state  markup within proper_range, excluding trailing whitespace;
wenzelm
parents:
46876
diff
changeset

282 
let 
3e068ef04b42
clarified command state  markup within proper_range, excluding trailing whitespace;
wenzelm
parents:
46876
diff
changeset

283 
val toks = Thy_Syntax.parse_tokens (#1 (Outer_Syntax.get_syntax ())) (Position.id id) text; 
3e068ef04b42
clarified command state  markup within proper_range, excluding trailing whitespace;
wenzelm
parents:
46876
diff
changeset

284 
val _ = Output.status (Markup.markup_only Isabelle_Markup.parsed); 
3e068ef04b42
clarified command state  markup within proper_range, excluding trailing whitespace;
wenzelm
parents:
46876
diff
changeset

285 
in toks end) (); 
46876
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

286 

44644
317e4962dd0f
clarified define_command: store name as structural information;
wenzelm
parents:
44643
diff
changeset

287 
fun define_command (id: command_id) name text = 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

288 
map_state (fn (versions, commands, execution) => 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

289 
let 
46945  290 
val span = Lazy.lazy (fn () => parse_command (print_id id) text); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

291 
val commands' = 
46945  292 
Inttab.update_new (id, (name, span)) commands 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

293 
handle Inttab.DUP dup => err_dup "command" dup; 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

294 
in (versions, commands', execution) end); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

295 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

296 
fun the_command (State {commands, ...}) (id: command_id) = 
44660
90bab3febb6c
less agressive parsing of commands (priority ~1);
wenzelm
parents:
44645
diff
changeset

297 
(case Inttab.lookup commands id of 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

298 
NONE => err_undef "command" id 
44644
317e4962dd0f
clarified define_command: store name as structural information;
wenzelm
parents:
44643
diff
changeset

299 
 SOME command => command); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

300 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

301 

41634
28d94383249c
cancel document execution before editing, to improve reactivity on systems with few cores;
wenzelm
parents:
41630
diff
changeset

302 
(* document execution *) 
28d94383249c
cancel document execution before editing, to improve reactivity on systems with few cores;
wenzelm
parents:
41630
diff
changeset

303 

44673  304 
fun cancel_execution (State {execution, ...}) = Future.cancel_group (#2 execution); 
41634
28d94383249c
cancel document execution before editing, to improve reactivity on systems with few cores;
wenzelm
parents:
41630
diff
changeset

305 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

306 
end; 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

307 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

308 

38888
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

309 
(* toplevel transactions *) 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

310 

8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

311 
local 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

312 

47335  313 
fun run int tr st = 
314 
(case Toplevel.transition int tr st of 

315 
SOME (st', NONE) => ([], SOME st') 

316 
 SOME (_, SOME (exn, _)) => (ML_Compiler.exn_messages exn, NONE) 

317 
 NONE => ([(serial (), ML_Compiler.exn_message Runtime.TERMINATE)], NONE)); 

318 

44440  319 
fun timing tr t = 
45674  320 
if Timing.is_relevant t then Toplevel.status tr (Isabelle_Markup.timing t) else (); 
40391
b0dafbfc05b7
explicit "timing" status for toplevel transactions;
wenzelm
parents:
40390
diff
changeset

321 

38888
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

322 
fun proof_status tr st = 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

323 
(case try Toplevel.proof_of st of 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

324 
SOME prf => Toplevel.status tr (Proof.status_markup prf) 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

325 
 NONE => ()); 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

326 

44386
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

327 
fun print_state tr st = 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

328 
(Lazy.lazy o Toplevel.setmp_thread_position tr) 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

329 
(fn () => Toplevel.print_state false st); 
38888
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

330 

8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

331 
in 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

332 

44199
e38885e3ea60
retrieve imports from document state, with fallback on theory loader for preloaded theories;
wenzelm
parents:
44198
diff
changeset

333 
fun run_command tr st = 
44185  334 
let 
44199
e38885e3ea60
retrieve imports from document state, with fallback on theory loader for preloaded theories;
wenzelm
parents:
44198
diff
changeset

335 
val is_init = Toplevel.is_init tr; 
44185  336 
val is_proof = Keyword.is_proof (Toplevel.name_of tr); 
337 

44614
466ea227e00d
more careful treatment of interrupts, to retain them within forked/joined boundary of command transactions;
wenzelm
parents:
44611
diff
changeset

338 
val _ = Multithreading.interrupted (); 
45666  339 
val _ = Toplevel.status tr Isabelle_Markup.forked; 
44185  340 
val start = Timing.start (); 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

341 
val (errs, result) = run (is_init orelse is_proof) (Toplevel.set_print false tr) st; 
44185  342 
val _ = timing tr (Timing.result start); 
45666  343 
val _ = Toplevel.status tr Isabelle_Markup.joined; 
44185  344 
val _ = List.app (Toplevel.error_msg tr) errs; 
345 
in 

346 
(case result of 

44614
466ea227e00d
more careful treatment of interrupts, to retain them within forked/joined boundary of command transactions;
wenzelm
parents:
44611
diff
changeset

347 
NONE => 
44804
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

348 
let 
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

349 
val _ = if null errs then Exn.interrupt () else (); 
45666  350 
val _ = Toplevel.status tr Isabelle_Markup.failed; 
44804
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

351 
in (st, no_print) end 
44185  352 
 SOME st' => 
44804
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

353 
let 
45666  354 
val _ = Toplevel.status tr Isabelle_Markup.finished; 
44804
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

355 
val _ = proof_status tr st'; 
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

356 
val do_print = 
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

357 
not is_init andalso 
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

358 
(Toplevel.print_of tr orelse (is_proof andalso Toplevel.is_proof st')); 
3d9ee91394ce
no print_state for final proof commands, which return to theory state;
wenzelm
parents:
44675
diff
changeset

359 
in (st', if do_print then print_state tr st' else no_print) end) 
44185  360 
end; 
38888
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

361 

8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

362 
end; 
8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

363 

8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

364 

8248cda328de
moved Toplevel.run_command to Pure/PIDE/document.ML;
wenzelm
parents:
38873
diff
changeset

365 

44481  366 
(** update **) 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

367 

44436
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

368 
(* perspective *) 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

369 

546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

370 
fun update_perspective (old_id: version_id) (new_id: version_id) name perspective state = 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

371 
let 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

372 
val old_version = the_version state old_id; 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

373 
val _ = Time.now (); (* FIXME odd workaround for polyml5.4.0/x86_64  needed? *) 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

374 
val new_version = edit_nodes (name, Perspective perspective) old_version; 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

375 
in define_version new_id new_version state end; 
546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

376 

546adfa8a6fc
update_perspective without actual edits, bypassing the full state assignment protocol;
wenzelm
parents:
44435
diff
changeset

377 

44481  378 
(* edits *) 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

379 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

380 
local 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

381 

47335  382 
fun make_required nodes = 
383 
let 

384 
val all_visible = 

385 
Graph.fold (fn (a, (node, _)) => is_some (#2 (get_perspective node)) ? cons a) nodes [] 

386 
> Graph.all_preds nodes; 

387 
val required = 

388 
fold (fn a => exists (fn b => Graph.is_edge nodes (a, b)) all_visible ? Symtab.update (a, ())) 

389 
all_visible Symtab.empty; 

390 
in Symtab.defined required end; 

391 

392 
fun init_theory deps node = 

393 
let 

394 
(* FIXME provide files via Scala layer, not master_dir *) 

395 
val (dir, header) = Exn.release (get_header node); 

396 
val master_dir = 

397 
(case Url.explode dir of 

398 
Url.File path => path 

399 
 _ => Path.current); 

400 
val parents = 

401 
#imports header > map (fn import => 

402 
(case Thy_Info.lookup_theory import of (* FIXME more robust!? *) 

403 
SOME thy => thy 

404 
 NONE => 

405 
get_theory (Position.file_only import) 

406 
(snd (Future.join (the (AList.lookup (op =) deps import)))))); 

407 
in Thy_Load.begin_theory master_dir header parents end; 

408 

409 
fun check_theory nodes name = 

410 
is_some (Thy_Info.lookup_theory name) orelse (* FIXME more robust!? *) 

411 
is_some (Exn.get_res (get_header (get_node nodes name))); 

412 

44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

413 
fun last_common state last_visible node0 node = 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

414 
let 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

415 
fun update_flags prev (visible, initial) = 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

416 
let 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

417 
val visible' = visible andalso prev <> last_visible; 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

418 
val initial' = initial andalso 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

419 
(case prev of 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

420 
NONE => true 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

421 
 SOME id => not (Keyword.is_theory_begin (#1 (the_command state id)))); 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

422 
in (visible', initial') end; 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

423 
fun get_common ((prev, id), exec) (found, (_, flags)) = 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

424 
if found then NONE 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

425 
else 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

426 
let val found' = 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

427 
is_none exec orelse op <> (pairself (Option.map #1) (exec, lookup_entry node0 id)); 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

428 
in SOME (found', (prev, update_flags prev flags)) end; 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

429 
val (found, (common, flags)) = 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

430 
iterate_entries get_common node (false, (NONE, (true, true))); 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

431 
in 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

432 
if found then (common, flags) 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

433 
else 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

434 
let val last = Entries.get_after (get_entries node) common 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

435 
in (last, update_flags last flags) end 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

436 
end; 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

437 

5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

438 
fun illegal_init () = error "Illegal theory header after end of theory"; 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

439 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

440 
fun new_exec state bad_init command_id' (execs, command_exec, init) = 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

441 
if bad_init andalso is_none init then NONE 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

442 
else 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

443 
let 
46945  444 
val (name, span) = the_command state command_id' > Lazy.force; 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

445 
val (modify_init, init') = 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

446 
if Keyword.is_theory_begin name then 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

447 
(Toplevel.modify_init (the_default illegal_init init), NONE) 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

448 
else (I, init); 
44660
90bab3febb6c
less agressive parsing of commands (priority ~1);
wenzelm
parents:
44645
diff
changeset

449 
val exec_id' = new_id (); 
46876
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

450 
val exec_id'_string = print_id exec_id'; 
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

451 
val tr = 
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

452 
Position.setmp_thread_data (Position.id_only exec_id'_string) 
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

453 
(fn () => 
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

454 
#1 (Outer_Syntax.read_span (#2 (Outer_Syntax.get_syntax ())) span) 
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

455 
> modify_init 
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

456 
> Toplevel.put_id exec_id'_string); 
8f3bb485f628
refined define_command vs. run_command: static tokenization vs. dynamic parsing, to increase the chance that the proper transaction is run after redefining commands (NB: requires slightly more space and time for document state);
wenzelm
parents:
46739
diff
changeset

457 
val exec' = snd (snd command_exec) > Lazy.map (fn (st, _) => run_command (tr ()) st); 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

458 
val command_exec' = (command_id', (exec_id', exec')); 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

459 
in SOME (command_exec' :: execs, command_exec', init') end; 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

460 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

461 
in 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

462 

44481  463 
fun update (old_id: version_id) (new_id: version_id) edits state = 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

464 
let 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

465 
val old_version = the_version state old_id; 
44180  466 
val _ = Time.now (); (* FIXME odd workaround for polyml5.4.0/x86_64 *) 
44222
9d5ef6cd4ee1
use full .thy file name as node name, which makes MiscUtilities.resolveSymlinks/File.getCanonicalPath more predictable;
wenzelm
parents:
44202
diff
changeset

467 
val new_version = fold edit_nodes edits old_version; 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

468 

44544
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

469 
val nodes = nodes_of new_version; 
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

470 
val is_required = make_required nodes; 
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

471 

44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

472 
val updated = 
44544
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

473 
nodes > Graph.schedule 
44199
e38885e3ea60
retrieve imports from document state, with fallback on theory loader for preloaded theories;
wenzelm
parents:
44198
diff
changeset

474 
(fn deps => fn (name, node) => 
44544
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

475 
if not (is_touched node orelse is_required name) 
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

476 
then Future.value (([], [], []), node) 
44444
33a5616a7571
tuned Document.node: maintain "touched" flag to indicate changes in entries etc.;
wenzelm
parents:
44441
diff
changeset

477 
else 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

478 
let 
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

479 
val node0 = node_of old_version name; 
44979
68b990e950b1
explicit master_dir as part of header  still required (for Cygwin) since Scala layer does not pass file content yet;
wenzelm
parents:
44804
diff
changeset

480 
fun init () = init_theory deps node; 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

481 
val bad_init = 
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

482 
not (check_theory nodes name andalso forall (check_theory nodes o #1) deps); 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

483 
in 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

484 
(singleton o Future.forks) 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

485 
{name = "Document.update", group = NONE, 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

486 
deps = map (Future.task_of o #2) deps, pri = 0, interrupts = false} 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

487 
(fn () => 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

488 
let 
44544
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

489 
val required = is_required name; 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

490 
val last_visible = #2 (get_perspective node); 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

491 
val (common, (visible, initial)) = last_common state last_visible node0 node; 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

492 
val common_command_exec = the_default_entry node common; 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

493 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

494 
val (execs, (command_id, (_, exec)), _) = 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

495 
([], common_command_exec, if initial then SOME init else NONE) > 
44544
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

496 
(visible orelse required) ? 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

497 
iterate_entries_after common 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

498 
(fn ((prev, id), _) => fn res => 
44544
da5f0af32c1b
more precise treatment of nodes that are fully required for partially visible ones;
wenzelm
parents:
44483
diff
changeset

499 
if not required andalso prev = last_visible then NONE 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

500 
else new_exec state bad_init id res) node; 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

501 

44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

502 
val no_execs = 
44645
5938beb84adc
more precise iterate_entries_after if start refers to last entry;
wenzelm
parents:
44644
diff
changeset

503 
iterate_entries_after common 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

504 
(fn ((_, id0), exec0) => fn res => 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

505 
if is_none exec0 then NONE 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

506 
else if exists (fn (_, (id, _)) => id0 = id) execs then SOME res 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

507 
else SOME (id0 :: res)) node0 []; 
44480
38c5b085fb1c
improved Document.edit: more accurate update_start and no_execs;
wenzelm
parents:
44479
diff
changeset

508 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

509 
val last_exec = if command_id = no_id then NONE else SOME command_id; 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

510 
val result = 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

511 
if is_some (after_entry node last_exec) then no_result 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

512 
else Lazy.map #1 exec; 
44480
38c5b085fb1c
improved Document.edit: more accurate update_start and no_execs;
wenzelm
parents:
44479
diff
changeset

513 

44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

514 
val node' = node 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

515 
> fold reset_entry no_execs 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

516 
> fold (fn (id, exec) => update_entry id (SOME exec)) execs 
44482
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

517 
> set_last_exec last_exec 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

518 
> set_result result 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

519 
> set_touched false; 
c7225307acf2
further clarification of Document.updated, based on last_common and after_entry;
wenzelm
parents:
44481
diff
changeset

520 
in ((no_execs, execs, [(name, node')]), node') end) 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

521 
end) 
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

522 
> Future.joins > map #1; 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

523 

44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

524 
val command_execs = 
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

525 
map (rpair NONE) (maps #1 updated) @ 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

526 
map (fn (command_id, (exec_id, _)) => (command_id, SOME exec_id)) (maps #2 updated); 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

527 
val updated_nodes = maps #3 updated; 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

528 
val last_execs = map (fn (name, node) => (name, get_last_exec node)) updated_nodes; 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

529 

44197
458573968568
refined Document.edit: less stateful update via Graph.schedule;
wenzelm
parents:
44196
diff
changeset

530 
val state' = state 
44476
e8a87398f35d
propagate information about last command with exec state assignment through document model;
wenzelm
parents:
44446
diff
changeset

531 
> define_version new_id (fold put_node updated_nodes new_version); 
44479
9a04e7502e22
refined document state assignment: observe perspective, more explicit assignment message;
wenzelm
parents:
44478
diff
changeset

532 
in ((command_execs, last_execs), state') end; 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

533 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

534 
end; 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

535 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

536 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

537 
(* execute *) 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

538 

9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

539 
fun execute version_id state = 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

540 
state > map_state (fn (versions, commands, _) => 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

541 
let 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

542 
val version = the_version state version_id; 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

543 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

544 
fun force_exec _ _ NONE = () 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

545 
 force_exec node command_id (SOME (_, exec)) = 
44386
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

546 
let 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

547 
val (_, print) = Lazy.force exec; 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

548 
val _ = 
44439
2bcd2aefaf7f
print state only for visible command, to avoid wasting resources for the larger part of the text;
wenzelm
parents:
44436
diff
changeset

549 
if #1 (get_perspective node) command_id 
44386
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

550 
then ignore (Lazy.future Future.default_params print) 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

551 
else (); 
4048ca2658b7
some support for toplevel printing wrt. editor perspective (still inactive);
wenzelm
parents:
44385
diff
changeset

552 
in () end; 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

553 

44673  554 
val group = Future.new_group NONE; 
44299
061599cb6eb0
refined Future.cancel: explicit future allows to join actual cancellation;
wenzelm
parents:
44271
diff
changeset

555 
val _ = 
44201  556 
nodes_of version > Graph.schedule 
557 
(fn deps => fn (name, node) => 

44302  558 
(singleton o Future.forks) 
44673  559 
{name = "theory:" ^ name, group = SOME (Future.new_group (SOME group)), 
44614
466ea227e00d
more careful treatment of interrupts, to retain them within forked/joined boundary of command transactions;
wenzelm
parents:
44611
diff
changeset

560 
deps = map (Future.task_of o #2) deps, pri = 1, interrupts = false} 
44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

561 
(iterate_entries (fn ((_, id), exec) => fn () => 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

562 
SOME (force_exec node id exec)) node)); 
40520
77a7b0a7d4b1
await_cancellation in the main thread, independently of the execution futures, which might get interrupted or be absent after node deletetion;
wenzelm
parents:
40481
diff
changeset

563 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

564 
in (versions, commands, (version_id, group)) end); 
44673  565 

566 

567 
(* remove versions *) 

568 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

569 
fun remove_versions ids state = state > map_state (fn (versions, _, execution) => 
44673  570 
let 
571 
val _ = member (op =) ids (#1 execution) andalso 

572 
error ("Attempt to remove execution version " ^ print_id (#1 execution)); 

573 

574 
val versions' = fold delete_version ids versions; 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

575 
val commands' = 
44675
f665a5d35a3d
discontinued predefined empty command (obsolete!?);
wenzelm
parents:
44674
diff
changeset

576 
(versions', Inttab.empty) > 
44673  577 
Inttab.fold (fn (_, version) => nodes_of version > 
578 
Graph.fold (fn (_, (node, _)) => node > 

44674
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

579 
iterate_entries (fn ((_, id), _) => 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

580 
SOME o Inttab.insert (K true) (id, the_command state id)))); 
bad4f9158c80
discontinued global execs: store exec value directly within entries;
wenzelm
parents:
44673
diff
changeset

581 
in (versions', commands', execution) end); 
38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

582 

43713
1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

583 

1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

584 

1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

585 
(** global state **) 
1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

586 

1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

587 
val global_state = Synchronized.var "Document" init_state; 
1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

588 

1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

589 
fun state () = Synchronized.value global_state; 
1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

590 
val change_state = Synchronized.change global_state; 
1ba5331b4623
moved global state to structure Document (again);
wenzelm
parents:
43668
diff
changeset

591 

38418
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

592 
end; 
9a7af64d71bb
more explicit / functional ML version of document model;
wenzelm
parents:
38414
diff
changeset

593 