16 val parse_id: string -> id |
16 val parse_id: string -> id |
17 val print_id: id -> string |
17 val print_id: id -> string |
18 type edit = string * ((command_id option * command_id option) list) option |
18 type edit = string * ((command_id option * command_id option) list) option |
19 type state |
19 type state |
20 val init_state: state |
20 val init_state: state |
|
21 val get_theory: state -> version_id -> Position.T -> string -> theory |
21 val cancel_execution: state -> unit -> unit |
22 val cancel_execution: state -> unit -> unit |
22 val define_command: command_id -> string -> state -> state |
23 val define_command: command_id -> string -> state -> state |
23 val edit: version_id -> version_id -> edit list -> state -> (command_id * exec_id) list * state |
24 val edit: version_id -> version_id -> edit list -> state -> (command_id * exec_id) list * state |
24 val execute: version_id -> state -> state |
25 val execute: version_id -> state -> state |
25 end; |
26 end; |
47 |
48 |
48 (** document structure **) |
49 (** document structure **) |
49 |
50 |
50 structure Entries = Linear_Set(type key = command_id val ord = int_ord); |
51 structure Entries = Linear_Set(type key = command_id val ord = int_ord); |
51 |
52 |
52 abstype node = Node of exec_id option Entries.T (*command entries with excecutions*) |
53 abstype node = Node of |
53 and version = Version of node Graph.T (*development graph wrt. static imports*) |
54 {last: exec_id, entries: exec_id option Entries.T} (*command entries with excecutions*) |
|
55 and version = Version of node Graph.T (*development graph wrt. static imports*) |
54 with |
56 with |
55 |
57 |
56 val empty_node = Node Entries.empty; |
58 fun make_node (last, entries) = |
|
59 Node {last = last, entries = entries}; |
|
60 |
|
61 fun get_last (Node {last, ...}) = last; |
|
62 fun set_last last (Node {entries, ...}) = make_node (last, entries); |
|
63 |
|
64 fun map_entries f (Node {last, entries}) = make_node (last, f entries); |
|
65 fun fold_entries start f (Node {entries, ...}) = Entries.fold start f entries; |
|
66 fun first_entry start P (Node {entries, ...}) = Entries.get_first start P entries; |
|
67 |
|
68 val empty_node = make_node (no_id, Entries.empty); |
57 val empty_version = Version Graph.empty; |
69 val empty_version = Version Graph.empty; |
58 |
|
59 fun fold_entries start f (Node entries) = Entries.fold start f entries; |
|
60 fun first_entry start P (Node entries) = Entries.get_first start P entries; |
|
61 |
70 |
62 |
71 |
63 (* node edits and associated executions *) |
72 (* node edits and associated executions *) |
64 |
73 |
65 type edit = |
74 type edit = |
66 string * |
75 string * |
67 (*NONE: remove node, SOME: insert/remove commands*) |
76 (*NONE: remove node, SOME: insert/remove commands*) |
68 ((command_id option * command_id option) list) option; |
77 ((command_id option * command_id option) list) option; |
69 |
78 |
70 fun the_entry (Node entries) id = |
79 fun the_entry (Node {entries, ...}) id = |
71 (case Entries.lookup entries id of |
80 (case Entries.lookup entries id of |
72 NONE => err_undef "command entry" id |
81 NONE => err_undef "command entry" id |
73 | SOME entry => entry); |
82 | SOME entry => entry); |
74 |
83 |
75 fun update_entry (id, exec_id) (Node entries) = |
84 fun update_entry (id, exec_id) = |
76 Node (Entries.update (id, SOME exec_id) entries); |
85 map_entries (Entries.update (id, SOME exec_id)); |
77 |
86 |
78 fun reset_after id entries = |
87 fun reset_after id entries = |
79 (case Entries.get_after entries id of |
88 (case Entries.get_after entries id of |
80 NONE => entries |
89 NONE => entries |
81 | SOME next => Entries.update (next, NONE) entries); |
90 | SOME next => Entries.update (next, NONE) entries); |
82 |
91 |
83 fun edit_node (id, SOME id2) (Node entries) = |
92 val edit_node = map_entries o fold |
84 Node (Entries.insert_after id (id2, NONE) entries) |
93 (fn (id, SOME id2) => Entries.insert_after id (id2, NONE) |
85 | edit_node (id, NONE) (Node entries) = |
94 | (id, NONE) => Entries.delete_after id #> reset_after id); |
86 Node (entries |> Entries.delete_after id |> reset_after id); |
|
87 |
95 |
88 |
96 |
89 (* version operations *) |
97 (* version operations *) |
90 |
98 |
91 fun nodes_of (Version nodes) = nodes; |
99 fun nodes_of (Version nodes) = nodes; |
95 handle Graph.UNDEF _ => empty_node; |
103 handle Graph.UNDEF _ => empty_node; |
96 |
104 |
97 fun edit_nodes (name, SOME edits) (Version nodes) = |
105 fun edit_nodes (name, SOME edits) (Version nodes) = |
98 Version (nodes |
106 Version (nodes |
99 |> Graph.default_node (name, empty_node) |
107 |> Graph.default_node (name, empty_node) |
100 |> Graph.map_node name (fold edit_node edits)) |
108 |> Graph.map_node name (edit_node edits)) |
101 | edit_nodes (name, NONE) (Version nodes) = |
109 | edit_nodes (name, NONE) (Version nodes) = |
102 Version (perhaps (try (Graph.del_node name)) nodes); |
110 Version (perhaps (try (Graph.del_node name)) nodes); |
103 |
111 |
104 fun put_node name node (Version nodes) = |
112 fun put_node name node (Version nodes) = |
105 Version (nodes |
113 Version (nodes |
179 |
187 |
180 fun the_exec (State {execs, ...}) (id: exec_id) = |
188 fun the_exec (State {execs, ...}) (id: exec_id) = |
181 (case Inttab.lookup execs id of |
189 (case Inttab.lookup execs id of |
182 NONE => err_undef "command execution" id |
190 NONE => err_undef "command execution" id |
183 | SOME exec => exec); |
191 | SOME exec => exec); |
|
192 |
|
193 fun get_theory state version_id pos name = |
|
194 let |
|
195 val last = get_last (get_node (the_version state version_id) name); |
|
196 val st = #2 (Lazy.force (the_exec state last)); |
|
197 in Toplevel.end_theory pos st end; |
184 |
198 |
185 |
199 |
186 (* document execution *) |
200 (* document execution *) |
187 |
201 |
188 fun cancel_execution (State {execution, ...}) = |
202 fun cancel_execution (State {execution, ...}) = |
307 let |
321 let |
308 val prev_exec = |
322 val prev_exec = |
309 (case prev of |
323 (case prev of |
310 NONE => no_id |
324 NONE => no_id |
311 | SOME prev_id => the_default no_id (the_entry node prev_id)); |
325 | SOME prev_id => the_default no_id (the_entry node prev_id)); |
312 val (_, rev_upds, st') = |
326 val (last, rev_upds, st') = |
313 fold_entries (SOME id) (new_exec name o #2 o #1) node (prev_exec, [], st); |
327 fold_entries (SOME id) (new_exec name o #2 o #1) node (prev_exec, [], st); |
314 val node' = fold update_entry rev_upds node; |
328 val node' = node |> fold update_entry rev_upds |> set_last last; |
315 in (rev_upds @ rev_updates, put_node name node' version, st') end) |
329 in (rev_upds @ rev_updates, put_node name node' version, st') end) |
316 end; |
330 end; |
317 |
331 |
318 (* FIXME proper node deps *) |
332 (* FIXME proper node deps *) |
319 val (rev_updates, new_version', state') = |
333 val (rev_updates, new_version', state') = |