a lj@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 B/usr/lib/python3.9/site-packages/pip/_vendor/resolvelib/structs.py__init__ szDirectedGraph.__init__cCs t|jSr)iterrr r r r __iter__szDirectedGraph.__iter__cCs t|jSr)lenrr r r r __len__szDirectedGraph.__len__cCs ||jvSr)rr keyr r r __contains__szDirectedGraph.__contains__cCsBt}t|j|_dd|jD|_dd|jD|_|S)z$Return a shallow copy of this graph.cSsi|]\}}|t|qSr r.0kvr r r z&DirectedGraph.copy..cSsi|]\}}|t|qSr rrr r r rr)rrrritemsr )r otherr r r copys  zDirectedGraph.copycCs:||jvrtd|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||q:dS)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||jvrt||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]}||fVqq dSr)rr)r r$Zchildrenr%r r r iter_edges<szDirectedGraph.iter_edgescCst|j|Sr)rrrr r r iter_childrenAszDirectedGraph.iter_childrencCst|j|Sr)rr rr r r iter_parentsDszDirectedGraph.iter_parentsN)__name__ __module__ __qualname____doc__rrrrrr!r"r'r)r*r+r,r r r r rs rc@sJeZdZdddZddZddZeZdd Zd d Zd d Z ddZ dS)IteratorMappingNcCs||_||_|pi|_dSr)_mapping _accessor_appends)r mappingZaccessorZappendsr r r rIszIteratorMapping.__init__cCsd|j|j|jS)Nz!IteratorMapping({!r}, {!r}, {!r}))formatr2r3r4r r r r __repr__Ns zIteratorMapping.__repr__cCst|jp |jSr)boolr2r4r r r r __bool__UszIteratorMapping.__bool__cCs||jvp||jvSr)r2r4rr r r rZszIteratorMapping.__contains__cCsLz|j|}Wn ty.t|j|YS0t|||j|dS)Nr )r2r(rr4 itertoolschainr3get)r rrr r r __getitem__]s  zIteratorMapping.__getitem__cs"fddjD}tj|S)Nc3s|]}|jvr|VqdSrr2rrr r r erz+IteratorMapping.__iter__..)r4r:r;r2r Zmorer r r rdszIteratorMapping.__iter__cs&tfddjD}tj|S)Nc3s|]}|jvrdVqdS)rNr>r?r r r r@irz*IteratorMapping.__len__..)sumr4rr2rAr r r rhszIteratorMapping.__len__)N) r-r.r/rr7r9 __nonzero__rr=rrr r r r r1Hs r1c@s4eZdZdZddZddZddZeZdd 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. cCs ||_dSr_factory)r factoryr r r rvsz_FactoryIterableView.__init__cCsdt|jt|SNz{}({}))r6typer-listrFr r r r r7ysz_FactoryIterableView.__repr__cCs*zt|Wnty$YdS0dS)NFT)nextrF StopIterationr r r r r9|s  z_FactoryIterableView.__bool__cCs|SrrEr r r r rsz_FactoryIterableView.__iter__N r-r.r/r0rr7r9rCrr r r r rDms rDc@s4eZdZdZddZddZddZeZdd Zd 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`. cCs ||_dSr) _sequence)r Zsequencer r r rsz_SequenceIterableView.__init__cCsdt|j|jSrH)r6rIr-rOr r r r r7sz_SequenceIterableView.__repr__cCs t|jSr)r8rOr r r r r9sz_SequenceIterableView.__bool__cCs t|jSr)rrOr r r r rsz_SequenceIterableView.__iter__NrMr r r r rNs rNcCs,t|rt|St|tjs$t|}t|S)zCBuild an iterable view from the value returned by `find_matches()`.)callablerD isinstancerSequencerJrN)matchesr r r build_iter_views  rT) r:compatrobjectrMappingr1rDrNrTr r r r s  B%