src/Pure/PIDE/document.ML
changeset 43668 aad4f1956098
parent 43666 7be2e51928cb
child 43713 1ba5331b4623
equal deleted inserted replaced
43667:6d73cceb1503 43668:aad4f1956098
    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') =