require_relative 'vertex.rb' require_relative 'edge.rb' module Zadt class Graph # Made up of attr_reader :vertices # Which are connected by attr_reader :edges # Contains attr_accessor :value #init_v allows for initial vertices (not generally used) def initialize #@vertices is ALL vertices on the graph @vertices = [] #@edges is ALL edges on the graph @edges = [] @value = Hash.new end def self.methods self.help end # Add a vertex def add_vertex vertex = Vertex.new @vertices << vertex vertex end # Remove a vertex def remove_vertex(vertex) # The vertex must exist if !vertex raise "Vertex does not exist" # The vertex must not be connected to anything elsif !vertex.connections.empty? raise "Vertex has edges. Break them first." # If it exists and isn't connected, delete it else @vertices.delete(vertex) end end # Make an edge between two vertices def make_connection(v1, v2) raise "already connected" if is_connected?(v1, v2) # Connect the two using the vertex method "connect" edge = v1.connect(v2) # Add to edge catalog @edges << edge edge end # Find the edge connecting two vertices def find_connection(v1, v2) connection = v1.edges.select {|edge| edge.connection.include?(v2)} connection.first end # Returns whether two vertices are connected def is_connected?(v1, v2) v1.connections.include?(v2) end def break_connection(v1, v2) raise "First vertex does not exist" if !v1 raise "Second vertex does not exist" if !v2 if is_connected?(v1, v2) # Find edge edge = find_connection(v1, v2) # Remove edge from edges catalog @edges.delete(edge) #Remove edge from vertices v1.edges.delete(edge) v2.edges.delete(edge) v1.connections.delete(v2) v2.connections.delete(v1) else raise "Vertices are not connected" end end def help Graph.help end def methods help end def self.help puts "Here are the functions for Graph:" puts "#add_vertex" puts "#remove_vertex(vertex)" puts "#make_connection(v1,v2), adds an edge between two vertices" puts "#break_connection(v1,v2)" puts "#find_connection(v1,v2), returns edge connecting two given vertices" puts "#is_connected?(v1,v2)" end end end