-require 'ostruct'
-
# A simple graph library
module GraphNjae
# 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
+ def initialize(values = {})
+ super(values)
self.connections = []
self
end
def <<(other)
c = Connection.new
c.end = other
+ other.edges << self unless other.edges.include? self
self.connections << c
self
end
def connection_at(vertex)
self.connections.find {|c| c.end.equal? vertex}
end
+
+ # Return the vertex at the other end of the one given.
+ # Self-loops should still return the vertex
+ def other_end(vertex)
+ if self.vertices[0] == vertex
+ self.vertices[1]
+ else
+ self.vertices[0]
+ end
+ end
+
+ def to_s
+ '<E: ' + self.type.to_s + ' [' + self.vertices.map {|n| n.to_s}.join(', ') + '] >'
+ end
+
+ def to_dot(opts = {})
+ if block_given?
+ yield self
+ else
+ dot = self.connections[0].end.object_id.to_s + " -- " + self.connections[1].end.object_id.to_s
+ if opts.size > 0
+ dot << ' {'
+ dot << opts.keys.map { |k|
+ (k.to_s + ' = "' + self.instance_eval(opts[k].to_s).to_s) + '"'
+ }.join(', ')
+ dot << '}'
+ end
+ dot << ';'
+ end
+ 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
+ def initialize(values = {})
+ super(values)
self
end
end