59 type node_header = (string * string list * (string * bool) list) Exn.result; |
59 type node_header = (string * string list * (string * bool) list) Exn.result; |
60 structure Entries = Linear_Set(type key = command_id val ord = int_ord); |
60 structure Entries = Linear_Set(type key = command_id val ord = int_ord); |
61 |
61 |
62 abstype node = Node of |
62 abstype node = Node of |
63 {header: node_header, |
63 {header: node_header, |
|
64 perspective: command_id list, |
64 entries: exec_id option Entries.T, (*command entries with excecutions*) |
65 entries: exec_id option Entries.T, (*command entries with excecutions*) |
65 result: Toplevel.state lazy} |
66 result: Toplevel.state lazy} |
66 and version = Version of node Graph.T (*development graph wrt. static imports*) |
67 and version = Version of node Graph.T (*development graph wrt. static imports*) |
67 with |
68 with |
68 |
69 |
69 fun make_node (header, entries, result) = |
70 fun make_node (header, perspective, entries, result) = |
70 Node {header = header, entries = entries, result = result}; |
71 Node {header = header, perspective = perspective, entries = entries, result = result}; |
71 |
72 |
72 fun map_node f (Node {header, entries, result}) = |
73 fun map_node f (Node {header, perspective, entries, result}) = |
73 make_node (f (header, entries, result)); |
74 make_node (f (header, perspective, entries, result)); |
74 |
75 |
75 fun get_header (Node {header, ...}) = header; |
76 fun get_header (Node {header, ...}) = header; |
76 fun set_header header = map_node (fn (_, entries, result) => (header, entries, result)); |
77 fun set_header header = |
77 |
78 map_node (fn (_, perspective, entries, result) => (header, perspective, entries, result)); |
78 fun map_entries f (Node {header, entries, result}) = make_node (header, f entries, result); |
79 |
|
80 fun get_perspective (Node {perspective, ...}) = perspective; |
|
81 fun set_perspective perspective = |
|
82 map_node (fn (header, _, entries, result) => (header, perspective, entries, result)); |
|
83 |
|
84 fun map_entries f (Node {header, perspective, entries, result}) = |
|
85 make_node (header, perspective, f entries, result); |
79 fun fold_entries start f (Node {entries, ...}) = Entries.fold start f entries; |
86 fun fold_entries start f (Node {entries, ...}) = Entries.fold start f entries; |
80 fun first_entry start P (Node {entries, ...}) = Entries.get_first start P entries; |
87 fun first_entry start P (Node {entries, ...}) = Entries.get_first start P entries; |
81 |
88 |
82 fun get_theory pos (Node {result, ...}) = Toplevel.end_theory pos (Lazy.get_finished result); |
89 fun get_theory pos (Node {result, ...}) = Toplevel.end_theory pos (Lazy.get_finished result); |
83 fun set_result result = map_node (fn (header, entries, _) => (header, entries, result)); |
90 fun set_result result = |
|
91 map_node (fn (header, perspective, entries, _) => (header, perspective, entries, result)); |
84 |
92 |
85 val empty_exec = Lazy.value Toplevel.toplevel; |
93 val empty_exec = Lazy.value Toplevel.toplevel; |
86 val empty_node = make_node (Exn.Exn (ERROR "Bad theory header"), Entries.empty, empty_exec); |
94 val empty_node = make_node (Exn.Exn (ERROR "Bad theory header"), [], Entries.empty, empty_exec); |
87 val clear_node = map_node (fn (header, _, _) => (header, Entries.empty, empty_exec)); |
95 val clear_node = map_node (fn (header, _, _, _) => (header, [], Entries.empty, empty_exec)); |
88 |
96 |
89 fun get_node nodes name = Graph.get_node nodes name handle Graph.UNDEF _ => empty_node; |
97 fun get_node nodes name = Graph.get_node nodes name handle Graph.UNDEF _ => empty_node; |
90 fun default_node name = Graph.default_node (name, empty_node); |
98 fun default_node name = Graph.default_node (name, empty_node); |
91 fun update_node name f = default_node name #> Graph.map_node name f; |
99 fun update_node name f = default_node name #> Graph.map_node name f; |
92 |
100 |
151 (fn dep => Graph.del_edge (dep, name)) (Graph.imm_preds nodes1 name); |
159 (fn dep => Graph.del_edge (dep, name)) (Graph.imm_preds nodes1 name); |
152 val (header', nodes3) = |
160 val (header', nodes3) = |
153 (header, Graph.add_deps_acyclic (name, parents) nodes2) |
161 (header, Graph.add_deps_acyclic (name, parents) nodes2) |
154 handle Graph.CYCLES cs => (Exn.Exn (ERROR (cat_lines (map cycle_msg cs))), nodes2); |
162 handle Graph.CYCLES cs => (Exn.Exn (ERROR (cat_lines (map cycle_msg cs))), nodes2); |
155 in Graph.map_node name (set_header header') nodes3 end |
163 in Graph.map_node name (set_header header') nodes3 end |
156 | Perspective _ => nodes)); (* FIXME *) |
164 | Perspective perspective => |
|
165 update_node name (set_perspective perspective) nodes)); |
157 |
166 |
158 fun put_node (name, node) (Version nodes) = |
167 fun put_node (name, node) (Version nodes) = |
159 Version (update_node name (K node) nodes); |
168 Version (update_node name (K node) nodes); |
160 |
169 |
161 end; |
170 end; |
352 (case Thy_Info.lookup_theory import of |
361 (case Thy_Info.lookup_theory import of |
353 SOME thy => thy |
362 SOME thy => thy |
354 | NONE => |
363 | NONE => |
355 get_theory (Position.file_only import) |
364 get_theory (Position.file_only import) |
356 (#2 (Future.join (the (AList.lookup (op =) deps import)))))); |
365 (#2 (Future.join (the (AList.lookup (op =) deps import)))))); |
357 in Thy_Load.begin_theory dir thy_name imports files parents end |
366 in Thy_Load.begin_theory dir thy_name imports files parents end; |
358 fun get_command id = |
367 fun get_command id = |
359 (id, the_command state id |> Future.map (Toplevel.modify_init init)); |
368 (id, the_command state id |> Future.map (Toplevel.modify_init init)); |
|
369 val perspective = get_perspective node; (* FIXME *) |
360 in |
370 in |
361 (singleton o Future.forks) |
371 (singleton o Future.forks) |
362 {name = "Document.edit", group = NONE, |
372 {name = "Document.edit", group = NONE, |
363 deps = map (Future.task_of o #2) deps, pri = 2, interrupts = false} |
373 deps = map (Future.task_of o #2) deps, pri = 2, interrupts = false} |
364 (fn () => |
374 (fn () => |