equal
deleted
inserted
replaced
46 val add_deps_acyclic: key * key list -> 'a T -> 'a T (*exception CYCLES*) |
46 val add_deps_acyclic: key * key list -> 'a T -> 'a T (*exception CYCLES*) |
47 val merge_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T (*exception CYCLES*) |
47 val merge_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T (*exception CYCLES*) |
48 val topological_order: 'a T -> key list |
48 val topological_order: 'a T -> key list |
49 val add_edge_trans_acyclic: key * key -> 'a T -> 'a T (*exception CYCLES*) |
49 val add_edge_trans_acyclic: key * key -> 'a T -> 'a T (*exception CYCLES*) |
50 val merge_trans_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T (*exception CYCLES*) |
50 val merge_trans_acyclic: ('a * 'a -> bool) -> 'a T * 'a T -> 'a T (*exception CYCLES*) |
|
51 val extend: (key -> 'a * key list) -> key list -> 'a T -> 'a T |
|
52 val make: (key -> 'a * key list) -> key list -> 'a T |
51 end; |
53 end; |
52 |
54 |
53 functor GraphFun(Key: KEY): GRAPH = |
55 functor GraphFun(Key: KEY): GRAPH = |
54 struct |
56 struct |
55 |
57 |
273 fun merge_trans_acyclic eq (G1, G2) = |
275 fun merge_trans_acyclic eq (G1, G2) = |
274 merge_acyclic eq (G1, G2) |
276 merge_acyclic eq (G1, G2) |
275 |> fold add_edge_trans_acyclic (diff_edges G1 G2) |
277 |> fold add_edge_trans_acyclic (diff_edges G1 G2) |
276 |> fold add_edge_trans_acyclic (diff_edges G2 G1); |
278 |> fold add_edge_trans_acyclic (diff_edges G2 G1); |
277 |
279 |
|
280 |
|
281 (* constructing graphs *) |
|
282 |
|
283 fun extend explore = |
|
284 let |
|
285 fun contains_node gr key = member eq_key (keys gr) key |
|
286 fun extend' key gr = |
|
287 let |
|
288 val (node, preds) = explore key |
|
289 in |
|
290 gr |> (not (contains_node gr key)) ? |
|
291 (new_node (key, node) |
|
292 #> fold extend' preds |
|
293 #> fold (add_edge o (pair key)) preds) |
|
294 end |
|
295 in fold extend' end |
|
296 |
|
297 fun make explore keys = extend explore keys empty |
|
298 |
278 |
299 |
279 (*final declarations of this structure!*) |
300 (*final declarations of this structure!*) |
280 val fold = fold_graph; |
301 val fold = fold_graph; |
281 |
302 |
282 end; |
303 end; |