equal
deleted
inserted
replaced
369 |
369 |
370 /* development graph */ |
370 /* development graph */ |
371 |
371 |
372 object Nodes { |
372 object Nodes { |
373 val empty: Nodes = new Nodes(Graph.empty(Node.Name.Ordering)) |
373 val empty: Nodes = new Nodes(Graph.empty(Node.Name.Ordering)) |
|
374 |
|
375 private def init(graph: Graph[Node.Name, Node], name: Node.Name): Graph[Node.Name, Node] = |
|
376 graph.default_node(name, Node.empty) |
374 } |
377 } |
375 |
378 |
376 final class Nodes private(graph: Graph[Node.Name, Node]) { |
379 final class Nodes private(graph: Graph[Node.Name, Node]) { |
377 def apply(name: Node.Name): Node = |
380 def apply(name: Node.Name): Node = Nodes.init(graph, name).get_node(name) |
378 graph.default_node(name, Node.empty).get_node(name) |
|
379 |
381 |
380 def is_suppressed(name: Node.Name): Boolean = { |
382 def is_suppressed(name: Node.Name): Boolean = { |
381 val graph1 = graph.default_node(name, Node.empty) |
383 val graph1 = Nodes.init(graph, name) |
382 graph1.is_maximal(name) && graph1.get_node(name).is_empty |
384 graph1.is_maximal(name) && graph1.get_node(name).is_empty |
383 } |
385 } |
384 |
386 |
385 def purge_suppressed: Option[Nodes] = |
387 def purge_suppressed: Option[Nodes] = |
386 graph.keys_iterator.filter(is_suppressed).toList match { |
388 graph.keys_iterator.filter(is_suppressed).toList match { |
389 } |
391 } |
390 |
392 |
391 def + (entry: (Node.Name, Node)): Nodes = { |
393 def + (entry: (Node.Name, Node)): Nodes = { |
392 val (name, node) = entry |
394 val (name, node) = entry |
393 val imports = node.header.imports |
395 val imports = node.header.imports |
394 val graph1 = |
396 val graph1 = (name :: imports).foldLeft(graph)(Nodes.init) |
395 imports.foldLeft(graph.default_node(name, Node.empty)) { |
|
396 case (g, p) => g.default_node(p, Node.empty) |
|
397 } |
|
398 val graph2 = |
397 val graph2 = |
399 graph1.imm_preds(name).foldLeft(graph1) { case (g, dep) => g.del_edge(dep, name) } |
398 graph1.imm_preds(name).foldLeft(graph1) { case (g, dep) => g.del_edge(dep, name) } |
400 val graph3 = imports.foldLeft(graph2) { case (g, dep) => g.add_edge(dep, name) } |
399 val graph3 = imports.foldLeft(graph2) { case (g, dep) => g.add_edge(dep, name) } |
401 new Nodes(graph3.map_node(name, _ => node)) |
400 new Nodes(graph3.map_node(name, _ => node)) |
402 } |
401 } |