a `Å]_«/ã@srddlmZmZddlmZmZddlmZddlm Z Gdd„de ƒZ e  e ¡e  e ¡d d d „Z d d „ZdS)é)ÚSequenceÚHashable)ÚisliceÚchain)ÚIntegral)Úplistcs(eZdZdZdZd=‡fdd„ Zedd„ƒZedd „ƒZe d d „ƒZ d d „Z dd„Z e Z edd„ƒZd>dd„Zd?dd„Ze dd„ƒZdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Ze d)d*„ƒZd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Z e Z!d7d8„Z"d9d:„Z#d;d<„Z$e%j&Z&‡Z'S)@ÚPDequeaæ Persistent double ended queue (deque). Allows quick appends and pops in both ends. Implemented using two persistent lists. A maximum length can be specified to create a bounded queue. Fully supports the Sequence and Hashable protocols including indexing and slicing but if you need fast random access go for the PVector instead. Do not instantiate directly, instead use the factory functions :py:func:`dq` or :py:func:`pdeque` to create an instance. Some examples: >>> x = pdeque([1, 2, 3]) >>> x.left 1 >>> x.right 3 >>> x[0] == x.left True >>> x[-1] == x.right True >>> x.pop() pdeque([1, 2]) >>> x.pop() == x[:-1] True >>> x.popleft() pdeque([2, 3]) >>> x.append(4) pdeque([1, 2, 3, 4]) >>> x.appendleft(4) pdeque([4, 1, 2, 3]) >>> y = pdeque([1, 2, 3], maxlen=3) >>> y.append(4) pdeque([2, 3, 4], maxlen=3) >>> y.appendleft(4) pdeque([4, 1, 2], maxlen=3) )Ú _left_listÚ _right_listÚ_lengthÚ_maxlenÚ __weakref__NcsVtt|ƒ |¡}||_||_||_|durLt|tƒs>> pdeque([1, 2]).pop() pdeque([1]) >>> pdeque([1, 2]).pop(2) pdeque([]) >>> pdeque([1, 2]).pop(-1) pdeque([2]) r)ÚpopleftrÚ _pop_listsr r Úmaxr r )rÚcountÚnew_right_listÚ new_left_listrrrÚpopis z PDeque.popcCsF|dkr| | ¡St |j|j|¡\}}t||t|j|dƒ|jƒS)z¯ Return new deque with leftmost element removed. Otherwise functionally equivalent to pop(). >>> pdeque([1, 2]).popleft() pdeque([2]) r)r5rr0r r r1r r )rr2r4r3rrrr/}s zPDeque.popleftcCs\|}|}|dkrT|s|rT|d8}|jr.|j}q|rB| ¡}tƒ}q| ¡j}tƒ}q||fS©Nrr.)Úrestr(r)r%r&r2Únew_primary_listÚnew_secondary_listrrrr0‹s zPDeque._pop_listscCs|j o|j Sr')r r rrrrÚ _is_empty�szPDeque._is_emptycCst|tƒstSt|ƒt|ƒkSr'©rrÚNotImplementedÚtuple©rÚotherrrrÚ__lt__ s z PDeque.__lt__cCs&t|tƒstSt|ƒt|ƒkr"dSdS)NTFr;r>rrrÚ__eq__¦s  z PDeque.__eq__cCs tt|ƒƒSr')Úhashr=rrrrÚ__hash__±szPDeque.__hash__cCs|jSr')r rrrrÚ__len__´szPDeque.__len__cCs(| |j|j|¡\}}}t||||jƒS)z† Return new deque with elem as the rightmost element. >>> pdeque([1, 2]).append(3) pdeque([1, 2, 3]) )Ú_appendr r rr )rÚelemr4r3Ú new_lengthrrrÚappend·sz PDeque.appendcCs(| |j|j|¡\}}}t||||jƒS)z‰ Return new deque with elem as the leftmost element. >>> pdeque([1, 2]).appendleft(3) pdeque([3, 1, 2]) )rEr r rr )rrFr3r4rGrrrÚ appendleftÁszPDeque.appendleftcCsd|jdurN|j|jkrN|jdkr*||dfSt ||d¡\}}|| |¡|jfS|| |¡|jdfSr6)r r rr0Úcons)rr%r&rFr8r9rrrrEËs   zPDeque._appendcCs(d}|D]}| |¡}|d7}q||fSr6)rJ)Zthe_listÚiterabler2rFrrrÚ _extend_listÔs   zPDeque._extend_listc Cs`t ||¡\}}|}|j|}|jdurV||jkrV||j}t |||¡\}}||8}|||fSr')rrLr r r0) rr%r&rKr8Ú extend_countr9Z current_lenZpop_lenrrrÚ_extendÝs  zPDeque._extendcCs.| |j|j|¡\}}}t|||j||jƒS)zŸ Return new deque with all elements of iterable appended to the right. >>> pdeque([1, 2]).extend([3, 4]) pdeque([1, 2, 3, 4]) )rNr r rr r )rrKr3r4rMrrrÚextendèsz PDeque.extendcCs.| |j|j|¡\}}}t|||j||jƒS)a Return new deque with all elements of iterable appended to the left. NB! The elements will be inserted in reverse order compared to the order in the iterable. >>> pdeque([1, 2]).extendleft([3, 4]) pdeque([4, 3, 1, 2]) )rNr r rr r )rrKr4r3rMrrrÚ extendleftòs zPDeque.extendleftcCs|j |¡|j |¡S)z„ Return the number of elements equal to elem present in the queue >>> pdeque([1, 2, 1]).count(1) 2 )r r2r )rrFrrrr2þsz PDeque.countc Cs–zt|j |¡|j|jdƒWSty�z*t|j|j ¡ |¡ ¡|jdƒWYStyŠ}ztd |¡ƒ|‚WYd}~n d}~00Yn0dS)zÒ Return new deque with first element from left equal to elem removed. If no such element is found a ValueError is raised. >>> pdeque([2, 1, 2]).remove(2) pdeque([1, 2]) r.z{0} not found in PDequeN)rr Úremover r rr(r+)rrFÚerrrrQs ÿ z PDeque.removecCst|j|j|jƒS)zë Return reversed deque. >>> pdeque([1, 2, 3]).reverse() pdeque([3, 2, 1]) Also supports the standard python reverse function. >>> reversed(pdeque([1, 2, 3])) pdeque([3, 2, 1]) )rr r r rrrrr(s zPDeque.reversecCs8| |¡}|dkr&| t| ¡|ƒ¡S| t|| ƒ¡S)zÉ Return deque with elements rotated steps steps. >>> x = pdeque([1, 2, 3]) >>> x.rotate(1) pdeque([3, 1, 2]) >>> x.rotate(-2) pdeque([3, 1, 2]) r)r5rPrr(rO)rZstepsZ popped_dequerrrÚrotate)s z PDeque.rotatecCstt|ƒ|jffSr')Úpdequer,r rrrrÚ __reduce__9szPDeque.__reduce__cCsÞt|tƒrz|jdur4|jdkr4tt|ƒ||jd�S|}|jdurT| |j|j¡}|j durv|  |j|j |j¡}|St|t ƒs–t dt |ƒjƒ‚|dkrª| |¡jSt|ƒ|}|dkrÒtd |t|ƒ¡ƒ‚| |¡jS)Nr.)rz-'%s' object cannot be interpreted as an indexrz!pdeque index {0} out of range {1})rÚsliceÚsteprTr=r Ústartr/r Ústopr5rrÚtypeÚ__name__r!Úlenr$r+)rÚindexÚresultZshiftedrrrÚ __getitem__=s&      ÿzPDeque.__getitem__)N)r.)r.)(r[Ú __module__Ú __qualname__Ú__doc__Ú __slots__rÚpropertyr r!Ú staticmethodrr)r-Ú__str__rr5r/r0r:r@rArCrDrHrIrErLrNrOrPr2rQr(Ú __reversed__rSrUr_rr]Ú __classcell__rrrrrsN(                 rrNcCsdt|ƒ}|dur|| d…}t|ƒ}t|dƒ}t|d|…ƒ}t||d…dd�}t||||ƒS)a* Return deque containing the elements of iterable. If maxlen is specified then len(iterable) - maxlen elements are discarded from the left to if len(iterable) > maxlen. >>> pdeque([1, 2, 3]) pdeque([1, 2, 3]) >>> pdeque([1, 2, 3, 4], maxlen=2) pdeque([3, 4], maxlen=2) NéT)r()r=r\Úintrr)rKrÚtrZpivotr!r rrrrT^s  rTcGst|ƒS)z[ Return deque containing all arguments. >>> dq(1, 2, 3) pdeque([1, 2, 3]) )rT)ÚelementsrrrÚdqqsrm)rN)Úcollections.abcrrÚ itertoolsrrZnumbersrZpyrsistent._plistrÚobjectrÚregisterrTrmrrrrÚs  U