src/Pure/PIDE/document.ML
changeset 44223 cac52579f2c2
parent 44222 9d5ef6cd4ee1
child 44226 1ea760da0f2d
equal deleted inserted replaced
44222:9d5ef6cd4ee1 44223:cac52579f2c2
    84 val empty_exec = Lazy.value Toplevel.toplevel;
    84 val empty_exec = Lazy.value Toplevel.toplevel;
    85 val empty_node = make_node (Exn.Exn (ERROR "Bad theory header"), Entries.empty, empty_exec);
    85 val empty_node = make_node (Exn.Exn (ERROR "Bad theory header"), Entries.empty, empty_exec);
    86 val clear_node = map_node (fn (header, _, _) => (header, Entries.empty, empty_exec));
    86 val clear_node = map_node (fn (header, _, _) => (header, Entries.empty, empty_exec));
    87 
    87 
    88 fun get_node nodes name = Graph.get_node nodes name handle Graph.UNDEF _ => empty_node;
    88 fun get_node nodes name = Graph.get_node nodes name handle Graph.UNDEF _ => empty_node;
    89 fun remove_node name nodes = Graph.del_node name nodes handle Graph.UNDEF _ => nodes;
       
    90 fun default_node name = Graph.default_node (name, empty_node);
    89 fun default_node name = Graph.default_node (name, empty_node);
    91 fun update_node name f = default_node name #> Graph.map_node name f;
    90 fun update_node name f = default_node name #> Graph.map_node name f;
    92 
    91 
    93 
    92 
    94 (* node edits and associated executions *)
    93 (* node edits and associated executions *)
   139       | Edits edits =>
   138       | Edits edits =>
   140           nodes
   139           nodes
   141           |> update_node name (edit_node edits)
   140           |> update_node name (edit_node edits)
   142       | Header header =>
   141       | Header header =>
   143           let
   142           let
   144             val node = get_node nodes name;
       
   145             val nodes1 = Graph.new_node (name, node) (remove_node name nodes);
       
   146             val parents = (case header of Exn.Res (_, parents, _) => parents | _ => []);
   143             val parents = (case header of Exn.Res (_, parents, _) => parents | _ => []);
   147             val nodes2 = fold default_node parents nodes1;
   144             val nodes1 = nodes
       
   145               |> default_node name
       
   146               |> fold default_node parents;
       
   147             val nodes2 = nodes1
       
   148               |> fold (fn dep => Graph.del_edge (dep, name)) (Graph.imm_preds nodes1 name);
   148             val (header', nodes3) =
   149             val (header', nodes3) =
   149               (header, Graph.add_deps_acyclic (name, parents) nodes2)
   150               (header, Graph.add_deps_acyclic (name, parents) nodes2)
   150                 handle Graph.CYCLES cs => (Exn.Exn (ERROR (cat_lines (map cycle_msg cs))), nodes2);
   151                 handle Graph.CYCLES cs => (Exn.Exn (ERROR (cat_lines (map cycle_msg cs))), nodes2);
   151           in Graph.map_node name (set_header header') nodes3 end));
   152           in Graph.map_node name (set_header header') nodes3 end));
   152 
   153