Class: Nanoc::Core::DirectedGraph
- Inherits:
-
Object
- Object
- Nanoc::Core::DirectedGraph
- Defined in:
- lib/nanoc/core/directed_graph.rb
Overview
Represents a directed graph. It is used by the dependency tracker for storing and querying dependencies between items.
Creating a graph collapse
-
#initialize(vertices) ⇒ DirectedGraph
constructor
Creates a new directed graph with the given vertices.
- #inspect ⇒ Object
Modifying the graph collapse
-
#add_edge(from, to, props: nil) ⇒ void
Adds an edge from the first vertex to the second vertex.
-
#add_vertex(vertex) ⇒ void
Adds the given vertex to the graph.
-
#delete_edges_to(to) ⇒ void
Deletes all edges going to the given vertex.
Querying the graph collapse
-
#direct_predecessors_of(to) ⇒ Array
Returns the direct predecessors of the given vertex, i.e.
-
#edges ⇒ Array
Returns an array of tuples representing the edges.
-
#predecessors_of(to) ⇒ Array
Returns the predecessors of the given vertex, i.e.
- #props_for(from, to) ⇒ Object
-
#vertices ⇒ Array
The list of all vertices in this graph.
Constructor Details
#initialize(vertices) ⇒ DirectedGraph
Creates a new directed graph with the given vertices.
39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/nanoc/core/directed_graph.rb', line 39 def initialize(vertices) @vertices = {} @next_vertex_idx = 0 vertices.each do |v| @vertices[v] = @next_vertex_idx.tap { @next_vertex_idx += 1 } end @to_graph = {} @edge_props = {} invalidate_caches end |
Instance Method Details
#add_edge(from, to, props: nil) ⇒ void
This method returns an undefined value.
Adds an edge from the first vertex to the second vertex.
74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/nanoc/core/directed_graph.rb', line 74 def add_edge(from, to, props: nil) add_vertex(from) add_vertex(to) @to_graph[to] ||= Set.new @to_graph[to] << from if props @edge_props[[from, to]] = props end invalidate_caches end |
#add_vertex(vertex) ⇒ void
This method returns an undefined value.
Adds the given vertex to the graph.
93 94 95 96 97 |
# File 'lib/nanoc/core/directed_graph.rb', line 93 def add_vertex(vertex) return if @vertices.key?(vertex) @vertices[vertex] = @next_vertex_idx.tap { @next_vertex_idx += 1 } end |
#delete_edges_to(to) ⇒ void
This method returns an undefined value.
Deletes all edges going to the given vertex.
104 105 106 107 108 109 110 111 112 113 |
# File 'lib/nanoc/core/directed_graph.rb', line 104 def delete_edges_to(to) return if @to_graph[to].nil? @to_graph[to].each do |from| @edge_props.delete([from, to]) end @to_graph.delete(to) invalidate_caches end |
#direct_predecessors_of(to) ⇒ Array
Returns the direct predecessors of the given vertex, i.e. the vertices x where there is an edge from x to the given vertex y.
123 124 125 |
# File 'lib/nanoc/core/directed_graph.rb', line 123 def direct_predecessors_of(to) @to_graph.fetch(to, Set.new) end |
#edges ⇒ Array
Returns an array of tuples representing the edges. The result of this method may take a while to compute and should be cached if possible.
150 151 152 153 154 155 156 157 158 |
# File 'lib/nanoc/core/directed_graph.rb', line 150 def edges result = [] @vertices.each_pair do |v2, i2| direct_predecessors_of(v2).map { |v1| [@vertices[v1], v1] }.each do |i1, v1| result << [i1, i2, @edge_props[[v1, v2]]] end end result end |
#inspect ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/nanoc/core/directed_graph.rb', line 53 def inspect s = [] @vertices.each_pair do |v2, _| direct_predecessors_of(v2).each do |v1| s << [v1.inspect + ' -> ' + v2.inspect + ' props=' + @edge_props[[v1, v2]].inspect] end end self.class.to_s + '(' + s.join(', ') + ')' end |
#predecessors_of(to) ⇒ Array
Returns the predecessors of the given vertex, i.e. the vertices x for which there is a path from x to the given vertex y.
133 134 135 |
# File 'lib/nanoc/core/directed_graph.rb', line 133 def predecessors_of(to) @predecessors[to] ||= recursively_find_vertices(to, :direct_predecessors_of) end |
#props_for(from, to) ⇒ Object
137 138 139 |
# File 'lib/nanoc/core/directed_graph.rb', line 137 def props_for(from, to) @edge_props[[from, to]] end |
#vertices ⇒ Array
Returns The list of all vertices in this graph.
142 143 144 |
# File 'lib/nanoc/core/directed_graph.rb', line 142 def vertices @vertices.keys.sort_by { |v| @vertices[v] } end |