# code from Miller and Ranum, "Problem Solving With Algorithms and Data 
# Structures using Python", Chapter 6; modified to improve clarity

from vertex import *

class Graph:
    def __init__(self):
        self.vertList = {}
        self.numVertices = 0
    
    def addVertex(self, key):
        self.numVertices = self.numVertices + 1
        newVertex = Vertex(key)
        self.vertList[key] = newVertex
        return newVertex
    
    def getVertex(self, key):
        if self.vertList.has_key(key):
            return self.vertList[key]
        else:
            return None
    
    def has_key(self, key):
        return self.vertList.has_key(key)
    
    def addEdge(self, fromKey, toKey, cost=0):
        if not self.vertList.has_key(fromKey):
            nv = self.addVertex(fromKey)
        if not self.vertList.has_key(toKey):
            nv = self.addVertex(toKey)
        self.vertList[fromKey].addNeighbor(self.vertList[toKey], cost)
    
    def getVertices(self):
        return self.vertList.values()
    
    def getNumVertices(self):
        return self.numVertices
    
    def __iter__(self):
        return self.vertList.itervalues()
