U
    
Ha                     @   sb   d dl Z ddlmZ G dd deZG dd dejZG dd	 d	eZG d
d deZdd Z	dS )    N   )collections_abcc                   @   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-tx790h60/pip/_vendor/resolvelib/structs.py__init__	   s    zDirectedGraph.__init__c                 C   s
   t | jS r   )iterr   r
   r   r   r   __iter__   s    zDirectedGraph.__iter__c                 C   s
   t | jS r   )lenr   r
   r   r   r   __len__   s    zDirectedGraph.__len__c                 C   s
   || j kS r   )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      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       s
    
zDirectedGraph.addc                 C   sT   | j | | j|D ]}| j| | q| j|D ]}| j| | q:dS )zCRemove 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 r   )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   connect2   s    
zDirectedGraph.connectc                 c   s,   | j  D ]\}}|D ]}||fV  qq
d S r   )r   r   )r   r#   childrenr$   r   r   r   
iter_edges<   s    zDirectedGraph.iter_edgesc                 C   s   t | j| S r   )r   r   r   r   r   r   iter_childrenA   s    zDirectedGraph.iter_childrenc                 C   s   t | j| S r   )r   r	   r   r   r   r   iter_parentsD   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   c                   @   sJ   e Zd ZdddZdd Zdd ZeZdd	 Zd
d Zdd Z	dd Z
dS )IteratorMappingNc                 C   s   || _ || _|pi | _d S r   )_mapping	_accessor_appends)r   mappingaccessorZappendsr   r   r   r   I   s    zIteratorMapping.__init__c                 C   s   d | j| j| jS )Nz!IteratorMapping({!r}, {!r}, {!r}))formatr2   r3   r4   r
   r   r   r   __repr__N   s
    zIteratorMapping.__repr__c                 C   s   t | jp| jS r   )boolr2   r4   r
   r   r   r   __bool__U   s    zIteratorMapping.__bool__c                 C   s   || j kp|| jkS r   )r2   r4   r   r   r   r   r   Z   s    zIteratorMapping.__contains__c                 C   sN   z| j | }W n" tk
r0   t| j|  Y S X t| || j|dS )Nr   )r2   r'   r   r4   	itertoolschainr3   get)r   r   r   r   r   r   __getitem__]   s
    zIteratorMapping.__getitem__c                    s"    fdd j D }t j|S )Nc                 3   s   | ]}| j kr|V  qd S r   r2   r   r   r
   r   r   	<genexpr>e   s     
 z+IteratorMapping.__iter__.<locals>.<genexpr>)r4   r;   r<   r2   r   Zmorer   r
   r   r   d   s    zIteratorMapping.__iter__c                    s&   t  fdd jD }t j| S )Nc                 3   s   | ]}| j krd V  qdS )r   Nr?   r@   r
   r   r   rA   i   s     
 z*IteratorMapping.__len__.<locals>.<genexpr>)sumr4   r   r2   rB   r   r
   r   r   h   s    zIteratorMapping.__len__)N)r-   r.   r/   r   r8   r:   __nonzero__r   r>   r   r   r   r   r   r   r1   H   s   
r1   c                   @   s4   e Zd ZdZdd Zdd Zdd ZeZdd	 Zd
S )_FactoryIterableViewa:  Wrap an iterator factory returned by `find_matches()`.

    Calling `iter()` on this class would invoke the underlying iterator
    factory, making it a "collection with ordering" that can be iterated
    through multiple times, but lacks random access methods presented in
    built-in Python sequence types.
    c                 C   s
   || _ d S r   _factory)r   factoryr   r   r   r   v   s    z_FactoryIterableView.__init__c                 C   s   d t| jt|  S Nz{}({}))r7   typer-   listrG   r
   r   r   r   r8   y   s    z_FactoryIterableView.__repr__c                 C   s,   zt |   W n tk
r&   Y dS X dS )NFT)nextrG   StopIterationr
   r   r   r   r:   |   s
    z_FactoryIterableView.__bool__c                 C   s   |   S r   rF   r
   r   r   r   r      s    z_FactoryIterableView.__iter__N	r-   r.   r/   r0   r   r8   r:   rD   r   r   r   r   r   rE   m   s   rE   c                   @   s4   e Zd ZdZdd Zdd Zdd ZeZdd	 Zd
S )_SequenceIterableViewzWrap an iterable returned by find_matches().

    This is essentially just a proxy to the underlying sequence that provides
    the same interface as `_FactoryIterableView`.
    c                 C   s
   || _ d S r   )	_sequence)r   sequencer   r   r   r      s    z_SequenceIterableView.__init__c                 C   s   d t| j| jS rI   )r7   rJ   r-   rP   r
   r   r   r   r8      s    z_SequenceIterableView.__repr__c                 C   s
   t | jS r   )r9   rP   r
   r   r   r   r:      s    z_SequenceIterableView.__bool__c                 C   s
   t | jS r   )r   rP   r
   r   r   r   r      s    z_SequenceIterableView.__iter__NrN   r   r   r   r   rO      s   rO   c                 C   s,   t | rt| S t| tjs$t| } t| S )zCBuild an iterable view from the value returned by `find_matches()`.)callablerE   
isinstancer   SequencerK   rO   )matchesr   r   r   build_iter_view   s
    rV   )
r;   compatr   objectr   Mappingr1   rE   rO   rV   r   r   r   r   <module>   s   B%