o
    Ëý°jº  ã                   @   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   ú‘/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.pyÚ__init__	   s   
zDirectedGraph.__init__c                 C   ó
   t | jƒS r   )Úiterr   r
   r   r   r   Ú__iter__   ó   
zDirectedGraph.__iter__c                 C   r   r   )Úlenr   r
   r   r   r   Ú__len__   r   zDirectedGraph.__len__c                 C   s
   || j v S r   )r   ©r   Úkeyr   r   r   Ú__contains__   r   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   ó   i | ]	\}}|t |ƒ“qS r   ©r   ©Ú.0ÚkÚvr   r   r   Ú
<dictcomp>   ó    z&DirectedGraph.copy.<locals>.<dictcomp>c                 S   r   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   ó   t | j| ƒS r   )r   r   r   r   r   r   Úiter_childrenA   ó   zDirectedGraph.iter_childrenc                 C   r/   r   )r   r	   r   r   r   r   Úiter_parentsD   r1   zDirectedGraph.iter_parentsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r"   r$   r%   r*   r,   r.   r0   r2   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}))Úformatr8   r9   r:   r
   r   r   r   Ú__repr__N   s
   ýzIteratorMapping.__repr__c                 C   s   t | jp| jƒS r   )Úboolr8   r:   r
   r   r   r   Ú__bool__U   s   zIteratorMapping.__bool__c                 C   s   || j v p	|| jv S r   )r8   r:   r   r   r   r   r   Z   ó   zIteratorMapping.__contains__c                 C   sL   z| j | }W n ty   t| j| ƒ Y S w t |  |¡| j |d¡¡S )Nr   )r8   r+   r   r:   Ú	itertoolsÚchainr9   Ú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   ©r8   ©r   r   r
   r   r   Ú	<genexpr>e   ó   € z+IteratorMapping.__iter__.<locals>.<genexpr>)r:   rC   rD   r8   ©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   NrG   rH   r
   r   r   rI   i   rJ   z*IteratorMapping.__len__.<locals>.<genexpr>)Úsumr:   r   r8   rK   r   r
   r   r   h   s   zIteratorMapping.__len__r   )r3   r4   r5   r   r?   rA   Ú__nonzero__r   rF   r   r   r   r   r   r   r7   H   s    
r7   c                   @   ó4   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   ó
   || _ d S r   ©Ú_factory)r   Úfactoryr   r   r   r   v   r   z_FactoryIterableView.__init__c                 C   s   d  t| ƒjt|  ¡ ƒ¡S ©Nz{}({}))r>   Útyper3   ÚlistrS   r
   r   r   r   r?   y   s   z_FactoryIterableView.__repr__c                 C   s(   z	t |  ¡ ƒ W dS  ty   Y dS w )NFT)ÚnextrS   ÚStopIterationr
   r   r   r   rA   |   s   þÿz_FactoryIterableView.__bool__c                 C   s   |   ¡ S r   rR   r
   r   r   r   r   …   s   z_FactoryIterableView.__iter__N©	r3   r4   r5   r6   r   r?   rA   rN   r   r   r   r   r   rP   m   s    rP   c                   @   rO   )Ú_SequenceIterableViewz²Wrap 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   rQ   r   )Ú	_sequence)r   Úsequencer   r   r   r   �   r   z_SequenceIterableView.__init__c                 C   s   d  t| ƒj| j¡S rU   )r>   rV   r3   r\   r
   r   r   r   r?   “   rB   z_SequenceIterableView.__repr__c                 C   r   r   )r@   r\   r
   r   r   r   rA   –   r   z_SequenceIterableView.__bool__c                 C   r   r   )r   r\   r
   r   r   r   r   ›   r   z_SequenceIterableView.__iter__NrZ   r   r   r   r   r[   ‰   s    r[   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()`.)ÚcallablerP   Ú
isinstancer   ÚSequencerW   r[   )Úmatchesr   r   r   Úbuild_iter_viewŸ   s
   rb   )
rC   Úcompatr   Úobjectr   ÚMappingr7   rP   r[   rb   r   r   r   r   Ú<module>   s    B%