o Ec@sbddlZddlmZGdddeZGdddejZGdd d eZGd d d eZd d Z dS)N)collections_abcc@speZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZdS) DirectedGraphz&A graph structure with directed edges.cCst|_i|_i|_dSN)set _vertices _forwards _backwardsselfr Q/opt/alt/python310/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py__init__ s zDirectedGraph.__init__cC t|jSr)iterrr r r r __iter__ zDirectedGraph.__iter__cCrr)lenrr r r r __len__rzDirectedGraph.__len__cCs ||jvSr)rr keyr r r __contains__rzDirectedGraph.__contains__cCsBt}t|j|_dd|jD|_dd|jD|_|S)z$Return a shallow copy of this graph.cSi|] \}}|t|qSr r.0kvr r r z&DirectedGraph.copy..cSrr rrr r r rr)rrrritemsr )r otherr r r copys  zDirectedGraph.copycCs:||jvr td|j|t|j|<t|j|<dS)zAdd a new vertex to the graph.z vertex existsN)r ValueErroraddrrr rr r r r$s   zDirectedGraph.addcCsT|j||j|D] }|j||q |j|D] }|j||qdS)zCRemove a vertex from the graph, disconnecting all edges from/to it.N)rremoverpopr )r rftr r r r%'s zDirectedGraph.removecCs||j|vo ||j|vSr)r rr r'r(r r r connected/szDirectedGraph.connectedcCs6||jvr t||j|||j||dS)zgConnect two existing vertices. Nothing happens if the vertices are already connected. N)rKeyErrorrr$r r)r r r connect2s zDirectedGraph.connectccs.|jD]\}}|D]}||fVq qdSr)rr )r r'childrenr(r r r iter_edges<s  zDirectedGraph.iter_edgescCt|j|Sr)rrrr r r iter_childrenAzDirectedGraph.iter_childrencCr/r)rr rr r r iter_parentsDr1zDirectedGraph.iter_parentsN)__name__ __module__ __qualname____doc__rrrrr"r$r%r*r,r.r0r2r r r r rs  rc@sJeZdZdddZddZddZeZdd Zd d Zd d Z ddZ dS)IteratorMappingNcCs||_||_|p i|_dSr)_mapping _accessor_appends)r mappingZaccessorZappendsr r r rIszIteratorMapping.__init__cCsd|j|j|jS)Nz!IteratorMapping({!r}, {!r}, {!r}))formatr8r9r:r r r r __repr__Ns zIteratorMapping.__repr__cCst|jp|jSr)boolr8r:r r r r __bool__UszIteratorMapping.__bool__cCs||jvp ||jvSr)r8r:rr r r rZzIteratorMapping.__contains__cCsLz|j|}Wntyt|j|YSwt|||j|dS)Nr )r8r+rr: itertoolschainr9get)r rrr r r __getitem__]s  zIteratorMapping.__getitem__cs"fddjD}tj|S)Nc3s|] }|jvr|VqdSrr8rrr r r ez+IteratorMapping.__iter__..)r:rArBr8r Zmorer r r rdszIteratorMapping.__iter__cs&tfddjD}tj|S)Nc3s|] }|jvrdVqdS)rNrErFr r r rGirHz*IteratorMapping.__len__..)sumr:rr8rIr r r rhszIteratorMapping.__len__r) r3r4r5rr=r? __nonzero__rrDrrr r r r r7Hs  r7c@4eZdZdZddZddZddZeZdd Zd 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. cC ||_dSr_factory)r factoryr r r rvrz_FactoryIterableView.__init__cCsdt|jt|SNz{}({}))r<typer3listrPr r r r r=ysz_FactoryIterableView.__repr__cCs(z t|WdStyYdSw)NFT)nextrP StopIterationr r r r r?|s  z_FactoryIterableView.__bool__cCs|SrrOr r r r rsz_FactoryIterableView.__iter__N r3r4r5r6rr=r?rKrr r r r rMms rMc@rL) _SequenceIterableViewzWrap an iterable returned by find_matches(). This is essentially just a proxy to the underlying sequence that provides the same interface as `_FactoryIterableView`. cCrNr) _sequence)r Zsequencer r r rrz_SequenceIterableView.__init__cCsdt|j|jSrR)r<rSr3rYr r r r r=r@z_SequenceIterableView.__repr__cCrr)r>rYr r r r r?rz_SequenceIterableView.__bool__cCrr)rrYr r r r rrz_SequenceIterableView.__iter__NrWr r r r rXs rXcCs,t|rt|St|tjst|}t|S)zCBuild an iterable view from the value returned by `find_matches()`.)callablerM isinstancerSequencerTrX)Zmatchesr r r build_iter_views  r]) rAcompatrobjectrMappingr7rMrXr]r r r r s B%