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.
Constant Summary collapse
- EMPTY_SET =
Set.new.freeze
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.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/nanoc/core/directed_graph.rb', line 41 def initialize(vertices) @vertices = {} @next_vertex_idx = 0 vertices.each do |v| @vertices[v] = @next_vertex_idx @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.
77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/nanoc/core/directed_graph.rb', line 77 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.
96 97 98 99 100 101 |
# File 'lib/nanoc/core/directed_graph.rb', line 96 def add_vertex(vertex) return if @vertices.key?(vertex) @vertices[vertex] = @next_vertex_idx @next_vertex_idx += 1 end |
#delete_edges_to(to) ⇒ void
This method returns an undefined value.
Deletes all edges going to the given vertex.
108 109 110 111 112 113 114 115 116 117 |
# File 'lib/nanoc/core/directed_graph.rb', line 108 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.
127 128 129 |
# File 'lib/nanoc/core/directed_graph.rb', line 127 def direct_predecessors_of(to) @to_graph.fetch(to, EMPTY_SET) 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.
154 155 156 157 158 159 160 161 162 |
# File 'lib/nanoc/core/directed_graph.rb', line 154 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
56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/nanoc/core/directed_graph.rb', line 56 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.
137 138 139 |
# File 'lib/nanoc/core/directed_graph.rb', line 137 def predecessors_of(to) @predecessors[to] ||= recursively_find_vertices(to, :direct_predecessors_of) end |
#props_for(from, to) ⇒ Object
141 142 143 |
# File 'lib/nanoc/core/directed_graph.rb', line 141 def props_for(from, to) @edge_props[[from, to]] end |
#vertices ⇒ Array
Returns The list of all vertices in this graph.
146 147 148 |
# File 'lib/nanoc/core/directed_graph.rb', line 146 def vertices @vertices.keys.sort_by { |v| @vertices[v] } end |