a
    ǏPfc                     @   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   _/var/www/html/python-backend/venv/lib/python3.9/site-packages/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 v 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>       z&DirectedGraph.copy.<locals>.<dictcomp>c                 S   s   i | ]\}}|t |qS r   r   r   r   r   r   r      r   )r   r   r   r   itemsr	   )r   otherr   r   r   copy   s
    zDirectedGraph.copyc                 C   s:   || j v 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 | v o|| j| v S r   )r	   r   r   r$   r%   r   r   r   	connected/   s    zDirectedGraph.connectedc                 C   s6   || j v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accessorappendsr   r   r   r   I   s    zIteratorMapping.__init__c                 C   s   d | j| j| jS )Nz!IteratorMapping({!r}, {!r}, {!r}))formatr3   r4   r5   r
   r   r   r   __repr__N   s
    zIteratorMapping.__repr__c                 C   s   t | jp| jS r   )boolr3   r5   r
   r   r   r   __bool__U   s    zIteratorMapping.__bool__c                 C   s   || j v p|| jv S r   )r3   r5   r   r   r   r   r   Z   s    zIteratorMapping.__contains__c                 C   sL   z| j | }W n  ty.   t| j|  Y S 0 t| || j|dS )Nr   )r3   r(   r   r5   	itertoolschainr4   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 vr|V  qd S r   r3   r   r   r
   r   r   	<genexpr>e   r   z+IteratorMapping.__iter__.<locals>.<genexpr>)r5   r=   r>   r3   r   morer   r
   r   r   d   s    zIteratorMapping.__iter__c                    s&   t  fdd jD }t j| S )Nc                 3   s   | ]}| j vrd V  qdS )r   NrA   rB   r
   r   r   rC   i   r   z*IteratorMapping.__len__.<locals>.<genexpr>)sumr5   r   r3   rD   r   r
   r   r   h   s    zIteratorMapping.__len__)N)r.   r/   r0   r   r:   r<   __nonzero__r   r@   r   r   r   r   r   r   r2   H   s   
r2   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 | _d S r   )_factory	_iterable)r   factoryr   r   r   r   v   s    z_FactoryIterableView.__init__c                 C   s   d t| jt| S Nz{}({}))r9   typer.   listr
   r   r   r   r:   z   s    z_FactoryIterableView.__repr__c                 C   s*   zt t|  W n ty$   Y dS 0 dS )NFT)nextr   StopIterationr
   r   r   r   r<   }   s
    z_FactoryIterableView.__bool__c                 C   s,   | j d u r|  n| j }t|\| _ }|S r   )rJ   rI   r=   tee)r   iterablecurrentr   r   r   r      s    z_FactoryIterableView.__iter__N	r.   r/   r0   r1   r   r:   r<   rG   r   r   r   r   r   rH   m   s   rH   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 rL   )r9   rM   r.   rV   r
   r   r   r   r:      s    z_SequenceIterableView.__repr__c                 C   s
   t | jS r   )r;   rV   r
   r   r   r   r<      s    z_SequenceIterableView.__bool__c                 C   s
   t | jS r   )r   rV   r
   r   r   r   r      s    z_SequenceIterableView.__iter__NrT   r   r   r   r   rU      s   rU   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()`.)callablerH   
isinstancer   SequencerN   rU   )matchesr   r   r   build_iter_view   s
    r\   )
r=   compatr   objectr   Mappingr2   rH   rU   r\   r   r   r   r   <module>   s   B%!