a  ze@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 `/opt/bitninja-python-dojo/embedded/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$childrenr%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 mappingaccessorappendsr r r rIszIteratorMapping.__init__cCsd|j|j|jS)Nz!IteratorMapping({!r}, {!r}, {!r}))formatr3r4r5r r r r __repr__Ns zIteratorMapping.__repr__cCst|jp |jSr)boolr3r5r r r r __bool__UszIteratorMapping.__bool__cCs||jvp||jvSr)r3r5rr r r rZszIteratorMapping.__contains__cCsLz|j|}Wn ty.t|j|YS0t|||j|dS)Nr )r3r(rr5 itertoolschainr4get)r rrr r r __getitem__]s  zIteratorMapping.__getitem__cs"fddjD}tj|S)Nc3s|]}|jvr|VqdSrr3rrr r r erz+IteratorMapping.__iter__..)r5r=r>r3r morer r r rdszIteratorMapping.__iter__cs&tfddjD}tj|S)Nc3s|]}|jvrdVqdS)rNrArBr r r rCirz*IteratorMapping.__len__..)sumr5rr3rDr r r rhszIteratorMapping.__len__)N) r.r/r0rr:r< __nonzero__rr@rrr r r r r2Hs r2c@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{}({}))r9typer.listrJr r r r r:ysz_FactoryIterableView.__repr__cCs*zt|Wnty$YdS0dS)NFT)nextrJ StopIterationr r r r r<|s  z_FactoryIterableView.__bool__cCs|SrrIr r r r rsz_FactoryIterableView.__iter__N r.r/r0r1rr:r<rGrr r r r rHms rHc@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 sequencer r r rsz_SequenceIterableView.__init__cCsdt|j|jSrL)r9rMr.rSr r r r r:sz_SequenceIterableView.__repr__cCs t|jSr)r;rSr r r r r<sz_SequenceIterableView.__bool__cCs t|jSr)rrSr r r r rsz_SequenceIterableView.__iter__NrQr r r r rRs rRcCs,t|rt|St|tjs$t|}t|S)zCBuild an iterable view from the value returned by `find_matches()`.)callablerH isinstancerSequencerNrR)matchesr r r build_iter_views  rY) r=compatrobjectrMappingr2rHrRrYr r r r s  B%