src/Pure/PIDE/document.ML
changeset 44385 e7fdb008aa7d
parent 44384 8f6054a63f96
child 44386 4048ca2658b7
equal deleted inserted replaced
44384:8f6054a63f96 44385:e7fdb008aa7d
    18   type node_header = (string * string list * (string * bool) list) Exn.result
    18   type node_header = (string * string list * (string * bool) list) Exn.result
    19   datatype node_edit =
    19   datatype node_edit =
    20     Clear |
    20     Clear |
    21     Edits of (command_id option * command_id option) list |
    21     Edits of (command_id option * command_id option) list |
    22     Header of node_header |
    22     Header of node_header |
    23     Perspective of id list
    23     Perspective of command_id list
    24   type edit = string * node_edit
    24   type edit = string * node_edit
    25   type state
    25   type state
    26   val init_state: state
    26   val init_state: state
    27   val join_commands: state -> unit
    27   val join_commands: state -> unit
    28   val cancel_execution: state -> Future.task list
    28   val cancel_execution: state -> Future.task list
    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 
    95 
   103 
    96 datatype node_edit =
   104 datatype node_edit =
    97   Clear |
   105   Clear |
    98   Edits of (command_id option * command_id option) list |
   106   Edits of (command_id option * command_id option) list |
    99   Header of node_header |
   107   Header of node_header |
   100   Perspective of id list;
   108   Perspective of command_id list;
   101 
   109 
   102 type edit = string * node_edit;
   110 type edit = string * node_edit;
   103 
   111 
   104 fun the_entry (Node {entries, ...}) id =
   112 fun the_entry (Node {entries, ...}) id =
   105   (case Entries.lookup entries id of
   113   (case Entries.lookup entries id of
   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 () =>