src/Pure/General/graph.ML
changeset 55154 2733a57d100f
parent 49560 11430dd89e35
child 55658 d696adf157e6
equal deleted inserted replaced
55153:eedd549de3ef 55154:2733a57d100f
    25   val get_first: (key * ('a * (Keys.T * Keys.T)) -> 'b option) -> 'a T -> 'b option
    25   val get_first: (key * ('a * (Keys.T * Keys.T)) -> 'b option) -> 'a T -> 'b option
    26   val fold: (key * ('a * (Keys.T * Keys.T)) -> 'b -> 'b) -> 'a T -> 'b -> 'b
    26   val fold: (key * ('a * (Keys.T * Keys.T)) -> 'b -> 'b) -> 'a T -> 'b -> 'b
    27   val get_entry: 'a T -> key -> key * ('a * (Keys.T * Keys.T))        (*exception UNDEF*)
    27   val get_entry: 'a T -> key -> key * ('a * (Keys.T * Keys.T))        (*exception UNDEF*)
    28   val get_node: 'a T -> key -> 'a                                     (*exception UNDEF*)
    28   val get_node: 'a T -> key -> 'a                                     (*exception UNDEF*)
    29   val map_node: key -> ('a -> 'a) -> 'a T -> 'a T
    29   val map_node: key -> ('a -> 'a) -> 'a T -> 'a T
    30   val map_node_yield: key -> ('a -> 'b * 'a) -> 'a T -> 'b * 'a T
       
    31   val map: (key -> 'a -> 'b) -> 'a T -> 'b T
    30   val map: (key -> 'a -> 'b) -> 'a T -> 'b T
    32   val imm_preds: 'a T -> key -> Keys.T
    31   val imm_preds: 'a T -> key -> Keys.T
    33   val imm_succs: 'a T -> key -> Keys.T
    32   val imm_succs: 'a T -> key -> Keys.T
    34   val immediate_preds: 'a T -> key -> key list
    33   val immediate_preds: 'a T -> key -> key list
    35   val immediate_succs: 'a T -> key -> key list
    34   val immediate_succs: 'a T -> key -> key list
   120     SOME entry => entry
   119     SOME entry => entry
   121   | NONE => raise UNDEF x);
   120   | NONE => raise UNDEF x);
   122 
   121 
   123 fun map_entry x f (G as Graph tab) = Graph (Table.update (x, f (#2 (get_entry G x))) tab);
   122 fun map_entry x f (G as Graph tab) = Graph (Table.update (x, f (#2 (get_entry G x))) tab);
   124 
   123 
   125 fun map_entry_yield x f (G as Graph tab) =
       
   126   let val (a, node') = f (#2 (get_entry G x))
       
   127   in (a, Graph (Table.update (x, node') tab)) end;
       
   128 
       
   129 
   124 
   130 (* nodes *)
   125 (* nodes *)
   131 
   126 
   132 fun get_node G = #1 o #2 o get_entry G;
   127 fun get_node G = #1 o #2 o get_entry G;
   133 
   128 
   134 fun map_node x f = map_entry x (fn (i, ps) => (f i, ps));
   129 fun map_node x f = map_entry x (fn (i, ps) => (f i, ps));
   135 
       
   136 fun map_node_yield x f = map_entry_yield x (fn (i, ps) =>
       
   137   let val (a, i') = f i in (a, (i', ps)) end);
       
   138 
   130 
   139 fun map_nodes f (Graph tab) = Graph (Table.map (apfst o f) tab);
   131 fun map_nodes f (Graph tab) = Graph (Table.map (apfst o f) tab);
   140 
   132 
   141 
   133 
   142 (* reachability *)
   134 (* reachability *)