B
    `’»dà  ã               @   s   G d d„ de ƒZdS )c               @   sp   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚDirectedGraphz+A graph structure with directed edges.
    c             C   s   t ƒ | _i | _i | _d S )N)ÚsetÚ	_verticesÚ	_forwardsÚ
_backwards)Úself© r   úB/tmp/pip-unpacked-wheel-hu9qqap1/pip/_vendor/resolvelib/structs.pyÚ__init__   s    zDirectedGraph.__init__c             C   s
   t | jƒS )N)Úiterr   )r   r   r   r   Ú__iter__
   s    zDirectedGraph.__iter__c             C   s
   t | jƒS )N)Úlenr   )r   r   r   r   Ú__len__   s    zDirectedGraph.__len__c             C   s
   || j kS )N)r   )r   Úkeyr   r   r   Ú__contains__   s    zDirectedGraph.__contains__c             C   sB   t ƒ }t| jƒ|_dd„ | j ¡ D ƒ|_dd„ | j ¡ D ƒ|_|S )z-Return a shallow copy of this graph.
        c             S   s   i | ]\}}t |ƒ|“qS r   )r   )Ú.0ÚkÚvr   r   r   ú
<dictcomp>   s    z&DirectedGraph.copy.<locals>.<dictcomp>c             S   s   i | ]\}}t |ƒ|“qS r   )r   )r   r   r   r   r   r   r      s    )r   r   r   r   Úitemsr   )r   Úotherr   r   r   Úcopy   s
    zDirectedGraph.copyc             C   s:   || j krtdƒ‚| j  |¡ tƒ | j|< tƒ | j|< dS )z'Add a new vertex to the graph.
        zvertex existsN)r   Ú
ValueErrorÚaddr   r   r   )r   r   r   r   r   r      s
    
zDirectedGraph.addc             C   s\   | j  |¡ x$| j |¡D ]}| j|  |¡ qW x$| j |¡D ]}| j|  |¡ q@W dS )zLRemove a vertex from the graph, disconnecting all edges from/to it.
        N)r   Úremover   Úpopr   )r   r   ÚfÚtr   r   r   r   %   s
    zDirectedGraph.removec             C   s   || j | ko|| j| kS )N)r   r   )r   r   r   r   r   r   Ú	connected.   s    zDirectedGraph.connectedc             C   s6   || j krt|ƒ‚| j|  |¡ | j|  |¡ dS )zgConnect two existing vertices.

        Nothing happens if the vertices are already connected.
        N)r   ÚKeyErrorr   r   r   )r   r   r   r   r   r   Úconnect1   s    
zDirectedGraph.connectc             c   s4   x.| j  ¡ D ] \}}x|D ]}||fV  qW qW d S )N)r   r   )r   r   Úchildrenr   r   r   r   Ú
iter_edges;   s    
zDirectedGraph.iter_edgesc             C   s   t | j| ƒS )N)r
   r   )r   r   r   r   r   Úiter_children@   s    zDirectedGraph.iter_childrenc             C   s   t | j| ƒS )N)r
   r   )r   r   r   r   r   Úiter_parentsC   s    zDirectedGraph.iter_parentsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r   r   r   r!   r"   r#   r   r   r   r   r      s   			
r   N)Úobjectr   r   r   r   r   Ú<module>   ó    