
    .Ph8/                         d Z ddlZddlmZ ddlmZmZ 	 ddlm	Z	  e	d          Z
n# e$ r  e            Z
Y nw xY wd	d
gZ G d d
e          ZeZ G d de          ZdS )a  Python's builtin :class:`list` is a very fast and efficient
sequence type, but it could be better for certain access patterns,
such as non-sequential insertion into a large lists. ``listutils``
provides a pure-Python solution to this problem.

For utilities for working with iterables and lists, check out
:mod:`iterutils`. For the a :class:`list`-based version of
:class:`collections.namedtuple`, check out :mod:`namedutils`.
    N)log)chainislice   )make_sentinel_MISSING)var_nameBList
BarrelListc                       e Zd ZdZdZ	 ddZed             Zd Zd Z	d Z
d	 Zd
 Zd ZddZddZeZed             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z dS )r   a  The ``BarrelList`` is a :class:`list` subtype backed by many
    dynamically-scaled sublists, to provide better scaling and random
    insertion/deletion characteristics. It is a subtype of the builtin
    :class:`list` and has an identical API, supporting indexing,
    slicing, sorting, etc. If application requirements call for
    something more performant, consider the `blist module available on
    PyPI`_.

    The name comes by way of Kurt Rose, who said it reminded him of
    barrel shifters. Not sure how, but it's BList-like, so the name
    stuck. BList is of course a reference to `B-trees`_.

    Args:
        iterable: An optional iterable of initial values for the list.

    >>> blist = BList(range(100000))
    >>> blist.pop(50000)
    50000
    >>> len(blist)
    99999
    >>> len(blist.lists)  # how many underlying lists
    8
    >>> slice_idx = blist.lists[0][-1]
    >>> blist[slice_idx:slice_idx + 2]
    BarrelList([11637, 11638])

    Slicing is supported and works just fine across list borders,
    returning another instance of the BarrelList.

    .. _blist module available on PyPI: https://pypi.python.org/pypi/blist
    .. _B-trees: https://en.wikipedia.org/wiki/B-tree

    i  Nc                 H    g g| _         |r|                     |           d S d S Nlistsextendselfiterables     Q/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/boltons/listutils.py__init__zBarrelList.__init__b   s5    T
 	"KK!!!!!	" 	"    c           	          t          |           | j        }}t          t          |t	          |dz   d          z                      S )N   )len_size_factorintroundmath_log)r   len_selfsize_factors      r   _cur_size_limitzBarrelList._cur_size_limitg   s=     #D		4+<+5x1a'@'@@AABBBr   c                     |dk     r|t          |           z  }|| j        }}t          t          |                    D ]$}t          ||                   }||k     r n||z  }%|dk     rdS ||fS )Nr   )NN)r   r   range)r   indexrel_idxr   list_idxlen_lists         r   _translate_indexzBarrelList._translate_indexl   s    199SYYE
c%jj)) 	  	 H5?++H!!xGGQ;;:  r   c                 d   |dk     r|t          | j                  z  }| j        |         t          |           }}| j        }t          |          |k    r\|dz  }t          |          |k    rB|dz   }| j                            ||| d                     || d = t          |          |k    BdS dS )Nr   r   r   TF)r   r   r!   insert)r   r&   cur_listr   
size_limit
half_limitnext_list_idxs          r   _balance_listzBarrelList._balance_listy   s    a<<DJ'H!Z13t99()
x==:%%#qJh--*,, (1
!!-:+,,1GHHHj[\\* h--*,, 4ur   c                 `   t          | j                  dk    r7| j        d                             ||           |                     d           n^|                     |          \  }}|t                      | j        |                             ||           |                     |           d S Nr   r   )r   r   r*   r/   r(   
IndexError)r   r$   itemr&   r%   s        r   r*   zBarrelList.insert   s    tz??aJqM  ---q!!!! $ 5 5e < <Hg ll"Jx ''666x(((r   c                 F    | j         d                             |           d S N)r   appendr   r3   s     r   r7   zBarrelList.append   s"    
2d#####r   c                 F    | j         d                             |           d S r5   r   r   s     r   r   zBarrelList.extend   s"    
2h'''''r   c                    | j         }t          |          dk    r!|s| j         d                                         S |o|d         }|dk    s||dk    rJ|d                                         }t          |          dk    r|d         s|                                 nX|                     |          \  }}|t	                      ||                             |          }|                     |           |S )Nr   r    r6   )r   r   popr(   r2   r/   )r   ar   r$   retr&   r%   s          r   r<   zBarrelList.pop   s    
u::??1?:a=$$&&&
adB;;%-5B;;)--//C5zzA~~eBi~		 $ 5 5e < <Hg ll"/%%g..Cx(((
r   c                     | }|d}|t          |           }|!|dk     r| }| | dz
  }}t          |           }|dk     r|t          |           z  }|dk     r|t          |           z  }t          ||||          S )Nr   r   )r   reversedr   )r   startstopstepr   s        r   
iter_slicezBarrelList.iter_slice   s    =E<t99Dq5D &4%!)4E~~H199SYYE!88CIIDhtT222r   c                 j   |vt          |          dk    rct          |                     d||          |                     |d |                    }|| j        d         d d <   |                     d           d S |d}|t          |           }|                     |          \  }}|                     |          \  }}|t                      |t                      ||k    r| j        |         ||= d S ||k     r/| j        |dz   |= | j        |         |d = | j        |         d |= d S J d            )Nr   r   FzGstart list index should never translate to greater than stop list index)absr   rD   r   r/   r   r(   r2   )	r   rA   rB   rC   new_liststart_list_idxstart_rel_idxstop_list_idxstop_rel_idxs	            r   	del_slicezBarrelList.del_slice   sl   D		AT__Qt<<!__T4>>@ @H'DJqM!!!q!!!F=E<t99D(,(=(=e(D(D%&*&;&;D&A&A#|!,, ,,]**
>*=+EFFFm++
>A-m;<
>*=>>:
=)-<-888< ; < < <r   c                      | |          S r   r;   )clsits     r   from_iterablezBarrelList.from_iterable   s    s2wwr   c                 4    t          j        | j                  S r   )r   rP   r   r   s    r   __iter__zBarrelList.__iter__   s    "4:...r   c                 b    t          j        d t          | j                  D                       S )Nc              3   4   K   | ]}t          |          V  d S r   )r@   .0ls     r   	<genexpr>z*BarrelList.__reversed__.<locals>.<genexpr>   s(      "M"M18A;;"M"M"M"M"M"Mr   )r   rP   r@   r   rR   s    r   __reversed__zBarrelList.__reversed__   s,    ""M"M8L8L"M"M"MMMMr   c                 >    t          d | j        D                       S )Nc                 ,    g | ]}t          |          S r;   )r   rV   s     r   
<listcomp>z&BarrelList.__len__.<locals>.<listcomp>   s    ///qCFF///r   sumr   rR   s    r   __len__zBarrelList.__len__   s!    //DJ///000r   c                 (    | j         D ]	}||v r dS 
dS )NTF)r   )r   r3   curs      r   __contains__zBarrelList.__contains__   s-    : 	 	Cs{{tt ur   c                 H   	 |j         |j        |j        }}}|                     |||          }|                     |          }|S # t
          $ r t          j        |          }Y nw xY w|                     |          \  }}|t                      | j
        |         |         S r   )rA   rB   rC   rD   rP   AttributeErroroperatorr$   r(   r2   r   )	r   r$   rA   rB   rC   rD   r>   r&   r%   s	            r   __getitem__zBarrelList.__getitem__   s    	 %UZ4E d;;J$$Z00CJ  	* 	* 	*N5))EEE	* !11%88',,z(#G,,s   A A&%A&c                    	 |j         |j        |j        }}}|                     |||           d S # t          $ r t          j        |          }Y nw xY w|                     |          \  }}|t                      | j	        |         |= d S r   )
rA   rB   rC   rL   re   rf   r$   r(   r2   r   )r   r$   rA   rB   rC   r&   r%   s          r   __delitem__zBarrelList.__delitem__   s    	 %UZ4E NN5$---F	  	* 	* 	*N5))EEE	*
 !11%88',,Jx )))s   0 AAc                    	 |j         |j        |j        }}}t          | j                  dk    r|| j        d         |<   n!t          |           }|||<   |g| j        d d <   |                     d           d S # t          $ r t          j	        |          }Y nw xY w| 
                    |          \  }}|t                      || j        |         |<   d S r1   )rA   rB   rC   r   r   listr/   re   rf   r$   r(   r2   )	r   r$   r3   rA   rB   rC   tmpr&   r%   s	            r   __setitem__zBarrelList.__setitem__	  s    	 %UZ4E 4:!##'+
1e$$4jj!E
!$
111q!!!F  	* 	* 	*N5))EEE	* !11%88',,(,
8W%%%s   A8 8BBc                 Z    |                      ||d          }|                     |          S )Nr   )rD   rP   )r   rA   rB   rD   s       r   __getslice__zBarrelList.__getslice__  s+    __UD!44
!!*---r   c                     t          | j                  dk    r|| j        d         ||<   n#t          |           }||||<   |g| j        d d <   |                     d           d S r1   )r   r   rk   r/   )r   rA   rB   sequencerl   s        r   __setslice__zBarrelList.__setslice__   sn    tz??a(0DJqM%*%%t**C&Cd
O EDJqqqM1r   c                 @    | j         j         dt          |           dS )N())	__class____name__rk   rR   s    r   __repr__zBarrelList.__repr__*  s$    .);;DJJ;;;;r   c                 R   t          | j                  dk    r!| j        d                                          d S | j        D ]}|                                 t          t	          j        | j                            }| j        d d = || j        d<   |                     d           d S r1   )r   r   sortsortedr   rP   r/   )r   li
tmp_sorteds      r   rz   zBarrelList.sort-  s     tz??aJqM     j  				 3DJ ? ?@@J
111&DJqMq!!!!!r   c                 t    | j         D ]}|                                 | j                                          d S r   )r   reverse)r   rb   s     r   r   zBarrelList.reverse:  s<    : 	 	CKKMMMM
r   c                 D    t          fd| j        D                       S )Nc                 :    g | ]}|                               S r;   )count)rW   rb   r3   s     r   r]   z$BarrelList.count.<locals>.<listcomp>@  s#    :::CIIdOO:::r   r^   r8   s    `r   r   zBarrelList.count?  s(    ::::tz:::;;;r   c                     d}| j         D ]@}	 |                    |          }||z   c S # t          $ r |t          |          z  }Y =w xY wt          |d          )Nr   z is not in list)r   r$   
ValueErrorr   )r   r3   	len_accumrb   r%   s        r   r$   zBarrelList.indexB  s    	: 	& 	&C&))D// 7**** & & &SXX%			&D333444s   )AAr   )!rw   
__module____qualname____doc__r   r   propertyr!   r(   r/   r*   r7   r   r<   rD   rL   __delslice__classmethodrP   rS   rZ   r`   rc   rg   ri   rm   ro   rr   rx   rz   r   r   r$   r;   r   r   r   r   <   s          D LO" " " "
 C C XC! ! !  
 
 
$ $ $( ( (  "3 3 3 3&< < < <8 L  [/ / /N N N1 1 1  - - -* * *- - -&. . .  < < <" " "  
< < <5 5 5 5 5r   c                        e Zd ZdZddZd ZdS )	SplayListzLike a `splay tree`_, the SplayList facilitates moving higher
    utility items closer to the front of the list for faster access.

    .. _splay tree: https://en.wikipedia.org/wiki/Splay_tree
    r   c                 l    ||k    rd S |                      |          }|                     ||           d S r   )r<   r*   )r   
item_index
dest_indexr3   s       r   shiftzSplayList.shiftW  s=    ##Fxx
##J%%%%%r   c                 4    | |         | |         c| |<   | |<   d S r   r;   )r   r   r   s      r   swapzSplayList.swap]  s(    -1*-=tJ?O*Z$z***r   N)r   )rw   r   r   r   r   r   r;   r   r   r   r   P  sF         & & & &P P P P Pr   r   )r   rf   mathr   r   	itertoolsr   r   	typeutilsr   r   ImportErrorobject__all__rk   r   r
   r   r;   r   r   <module>r      s  >               # # # # # # # #((((((}j111HH   vxxHHH L
!N5 N5 N5 N5 N5 N5 N5 N5b 	P P P P P P P P P Ps   ) ;;