n9e/ddlmZmZddlmZmZddlmZddlm Z m Z ddl m Z e ddZ Gd d e e Zejeejedd Zd Zy ))SequenceHashable)islicechain)Integral)TypeVarGeneric)plistT_coT) covariantc*eZdZdZdZdfd ZedZedZe dZ dZ dZ e Z ed Zd d Zd d Ze d Zd ZdZdZdZdZdZdZdZe dZdZdZdZdZdZdZ e Z!dZ"dZ#dZ$e%jLZ&xZ'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__ctt| |}||_||_||_|+t |ts td|dkr td||_ |S)Nz An integer is required as maxlenrzmaxlen must be non-negative) superr__new__rrr isinstancer TypeError ValueErrorr)cls left_list right_listlengthmaxleninstance __class__s 4/usr/lib/python3/dist-packages/pyrsistent/_pdeque.pyrzPDeque.__new__5sh-c2')!  fh/ BCCz !>??!cVtj|j|jS)z. Rightmost element in dqueue. )r_tip_from_listsrrselfs r!rightz PDeque.rightEs! %%d&6&6HHr"cVtj|j|jS)z- Leftmost element in dqueue. )rr$rrr%s r!leftz PDeque.leftLs! %%doot7G7GHHr"cB|r |jS|r|dStd)NzNo elements in empty deque)first IndexError) primary_listsecondary_lists r!r$zPDeque._tip_from_listsSs+ %% % !"% %566r"c^t|j|jjSN)rrrreverser%s r!__iter__zPDeque.__iter__]s"T__d&6&6&>&>&@AAr"cdjt||jdj|jSdS)Nzpdeque({0}{1})z , maxlen={0})formatlistrr%s r!__repr__zPDeque.__repr__`sG&&tDzNRllNf~'<'>> pdeque([1, 2]).pop() pdeque([1]) >>> pdeque([1, 2]).pop(2) pdeque([]) >>> pdeque([1, 2]).pop(-1) pdeque([2]) r)popleftr _pop_listsrrmaxrr)r&countnew_right_list new_left_lists r!popz PDeque.poplsh 19<<' '(.(9(9$:J:JDOO]b(c% m^S9Mq5QSWS_S_``r"c|dkr|j| Stj|j|j|\}}t||t |j |z d|jS)z Return new deque with leftmost element removed. Otherwise functionally equivalent to pop(). >>> pdeque([1, 2]).popleft() pdeque([2]) r)rArr<rrr=rr)r&r>r@r?s r!r;zPDeque.popleftsh 1988UF# #(.(9(9$//4K[K[]b(c% ~m^S9Mq5QSWS_S_``r"c|}|}|dkDrn|s|rj|dz}|jr |j}nA|r|j}t}n$|jj}t}|dkDr|rg|rj||fSNr)restr2r )r.r/r>new_primary_listnew_secondary_lists r!r<zPDeque._pop_listss'+ai-1C QJE$$#3#8#8 !#5#=#=#? %*W"#5#=#=#?#D#D %*W"ai-1C !333r"c:|j xr |j Sr1)rrr%s r! _is_emptyzPDeque._is_emptys??";4+;+;';;r"c\t|tstSt|t|kSr1)rrNotImplementedtupler&others r!__lt__z PDeque.__lt__s%%(! !T{U5\))r"ct|tstSt|t|k(rt |t |k(sJyy)NTF)rrrLrMlenrNs r!__eq__z PDeque.__eq__s>%(! ! ;%, &t9E * **r"c*tt|Sr1)hashrMr%s r!__hash__zPDeque.__hash__sE$K  r"c|jSr1)rr%s r!__len__zPDeque.__len__s ||r"c|j|j|j|\}}}t||||jS)z Return new deque with elem as the rightmost element. >>> pdeque([1, 2]).append(3) pdeque([1, 2, 3]) )_appendrrrr)r&elemr@r? new_lengths r!appendz PDeque.appends>59LLRVRbRbdh4i1 ~zm^ZNNr"c|j|j|j|\}}}t||||jS)z Return new deque with elem as the leftmost element. >>> pdeque([1, 2]).appendleft(3) pdeque([3, 1, 2]) )rZrrrr)r&r[r?r@r\s r! appendleftzPDeque.appendlefts@59LLAQAQSWSbSbdh4i1 zm^ZNNr"c&|je|j|jk(rL|jdk(r||dfStj||d\}}||j ||jfS||j ||jdzfSrD)rrrr<cons)r&r.r/r[rGrHs r!rZzPDeque._appends << #  (D||q #^Q66393D3D\Sacd3e 0 0#%7%<%r[s r! _extend_listzPDeque._extend_lists9 D}}T*H QJE r"ctj||\}}|}|j|z}|j=||jkDr.||jz }tj |||\}}||z}|||fSr1)rrerrr<) r&r.r/rdrG extend_countrH current_lenpop_lens r!_extendzPDeque._extends)/)<)<\8)T&,+ll\1 << # dll(B!DLL0G393D3DEWYikr3s 0  0 G #L!3\AAr"c|j|j|j|\}}}t|||j|z|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]) )rjrrrrr)r&rdr?r@rgs r!extendz PDeque.extendsL7;ll4CSCSUYUdUdfn6o3 |m^T\\L5PRVR^R^__r"c|j|j|j|\}}}t|||j|z|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]) )rjrrrrr)r&rdr@r?rgs r! extendleftzPDeque.extendleftsJ7;ll4??TXTdTdfn6o3 ~|m^T\\L5PRVR^R^__r"cp|jj||jj|zS)z Return the number of elements equal to elem present in the queue >>> pdeque([1, 2, 1]).count(1) 2 )rr>r)r&r[s r!r>z PDeque.counts/$$T*T-=-=-C-CD-IIIr"c t|jj||j|jdz S#t $r t|j|jj j|j |jdz cYS#t $r }t dj||d}~wwxYwwxYw)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]) rEz{0} not found in PDequeN)rrremoverrrr2r6)r&r[es r!rqz PDeque.remove s P$//0068H8H$,,YZJZ[ [ P Pdoo"..668??EMMOQUQ]Q]`aQacc P !:!A!A$!GHaO P  Ps.>> 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]) )rrrrr%s r!r2zPDeque.reverses!d&&FFr"c|j|}|dk\r)|jt|j|S|j 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)rArnrr2rl)r&steps popped_deques r!rotatez PDeque.rotate,sPxx A:**6$,,.%+HI I""6$#788r"c<tt||jffSr1)pdequer7rr%s r! __reduce__zPDeque.__reduce__<sT DLL111r"ct|tr|j2|jdk7r#tt |||j S|}|j (|j|j |jz}|j5|j|j|j|jzz }|St|ts!tdt|jz|dk\r|j|jSt!||z}|dkr$t#dj%|t!||j|jS)NrE)rz-'%s' object cannot be interpreted as an indexrz!pdeque index {0} out of range {1})rslicestepryrMrstartr;rstoprArrtype__name__r)rRr-r6)r&indexresultshifteds r! __getitem__zPDeque.__getitem__@s& eU #zz%%**/eDk%0FFF{{& dll(BCzz%DLLEJJ4M$NOM%*KdSXkNbNbbc c A:<<&++ +d)e# Q;3::5#d)L ||G$)))r"r1)rE)(r __module__ __qualname____doc__ __slots__rpropertyr'r) staticmethodr$r3r8__str__rrAr;r<rJrPrSrVrXr]r_rZrerjrlrnr>rqr2 __reversed__rwrzrrr __classcell__)r s@r!rr s'PSI II II 77BpG  a( a44"<* !OOI B` `JP& GL9 2*6 NNEr"rNct|}||| d}t|}t|dz }t|d|}t||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) NT)r2)rMrRintr r)rdrtrpivotr)r's r!ryryasi hA  vghK VF  OE 6E D !EF)T *E $vv ..r"ct|S)z[ Return deque containing all arguments. >>> dq(1, 2, 3) pdeque([1, 2, 3]) )ry)elementss r!dqrts ( r")N)collections.abcrr itertoolsrrnumbersrtypingrr pyrsistent._plistr r rregisterryrrr"r!rs_.###v&QWT]Qf &&/&r"