Gem::Specification.new do |s|
s.name = %q{graph.njae}
- s.version = "0.1.0"
+ s.version = "0.2.0"
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Neil Smith"]
"VERSION",
"graph.njae.gemspec",
"lib/graph.njae.rb",
- "lib/graph/edge.rb",
- "lib/graph/graph.rb",
- "lib/graph/vertex.rb",
+ "lib/graph.njae/edge.rb",
+ "lib/graph.njae/graph.rb",
+ "lib/graph.njae/vertex.rb",
"spec/graph/edge_spec.rb",
"spec/graph/graph_spec.rb",
"spec/graph/vertex_spec.rb",
--- /dev/null
+require 'ostruct'
+
+# A simple graph library
+
+module GraphNjae
+
+ # An edge (or multiedge) in a graph. The edge can have arbitrary attributes,
+ # treated as method names.
+ #
+ # Each connection is handled by a Graph::Connection object, so that each end
+ # of the Edge can have it's own attributes.
+ class Edge < OpenStruct
+ def initialize
+ super
+ self.connections = []
+ self
+ end
+
+ # Connect this edge to a vertex
+ def <<(other)
+ c = Connection.new
+ c.end = other
+ self.connections << c
+ self
+ end
+
+ # Return the set of vertices this edge connects.
+ def vertices
+ self.connections.map {|c| c.end}
+ end
+
+ # Return the connection object that joins this Edge to the specified Vertex
+ def connection_at(vertex)
+ self.connections.select {|c| c.end.equal? vertex}.first
+ end
+ end
+
+ # A connection between an Edge and a Vertex.The connection can have arbitrary attributes,
+ # treated as method names.
+ class Connection < OpenStruct
+ def initialize
+ super
+ self
+ end
+ end
+end
--- /dev/null
+require 'ostruct'
+
+# A simple graph library
+
+module GraphNjae
+
+ # A container for all the parts of a graph. The graph can have arbitrary attributes,
+ # treated as method names.
+ class Graph < OpenStruct
+ def initialize
+ super
+ self.edges = Array.new
+ self.vertices = Array.new
+ self
+ end
+
+ # Add a Vertex or Edge to the graph.
+ def <<(other)
+ if other.class == Vertex
+ self.vertices << other
+ elsif
+ self.edges << other
+ end
+ self
+ end
+ end
+end
--- /dev/null
+require 'ostruct'
+
+# A simple graph library
+
+module GraphNjae
+ # A vertex in a graph. The edge can have arbitrary attributes,treated as
+ # method names.
+ class Vertex < OpenStruct
+ def initialize
+ super
+ self.edges = []
+ self
+ end
+
+ # Connect this vertex to another, creating an Edge to do so, and returning
+ # the Edge
+ def connect(other)
+ e = Edge.new
+ e << self << other
+ self.edges << e
+ other.edges << e unless self === other
+ e
+ end
+
+ # Connect this vertex to another, creating an Edge to do so, and returning
+ # this Vertex
+ def <<(other)
+ connect(other)
+ self
+ end
+
+ # Return the set of neighbouring vertices
+ def neighbours
+ vertices = self.edges.map {|e| e.vertices}.flatten
+ vertices_to_me = vertices.select {|v| v == self}
+ other_vertices = vertices.select {|v| v != self}
+ (vertices_to_me[1..-1] || []) + other_vertices
+ end
+
+ end
+end