
    qc/                         d Z ddlmZm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	 e 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`.
    )print_functiondivisionN)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(xrange(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     1lib/python3.11/site-packages/boltons/listutils.py__init__zBarrelList.__init__k   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_limitp   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_indexu   s    19 	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_list   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,   r1   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   r5   s     r   r9   zBarrelList.append   s"    
2d#####r   c                 F    | j         d                             |           d S r7   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    r8   )r   r   popr*   r4   r1   )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19 	SYYE!8 	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   rF   r   r1   r   r*   r4   )	r   rC   rD   rE   new_liststart_list_idxstart_rel_idxstop_list_idxstop_rel_idxs	            r   	del_slicezBarrelList.del_slice   s    	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   rR   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   )rB   .0ls     r   	<genexpr>z*BarrelList.__reversed__.<locals>.<genexpr>   s(      "M"M18A;;"M"M"M"M"M"Mr   )r   rR   rB   r   rT   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   rX   s     r   
<listcomp>z&BarrelList.__len__.<locals>.<listcomp>   s    ///qCFF///r   sumr   rT   s    r   __len__zBarrelList.__len__   s!    //DJ///000r   c                 (    | j         D ]	}||v r dS 
dS )NTF)r   )r   r5   curs      r   __contains__zBarrelList.__contains__   s0    : 	 	Cs{ ttur   c                 H   	 |j         |j        |j        }}}|                     |||          }|                     |          }|S # t
          $ r t          j        |          }Y nw xY w|                     |          \  }}|t                      | j
        |         |         S r   )rC   rD   rE   rF   rR   AttributeErroroperatorr&   r*   r4   r   )	r   r&   rC   rD   rE   rF   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   )
rC   rD   rE   rN   rg   rh   r&   r*   r4   r   )r   r&   rC   rD   rE   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 r3   )rC   rD   rE   r   r   listr1   rg   rh   r&   r*   r4   )	r   r&   r5   rC   rD   rE   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   )rF   rR   )r   rC   rD   rF   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 r3   )r   r   rm   r1   )r   rC   rD   sequencern   s        r   __setslice__zBarrelList.__setslice__)  sp    tz??a 	"(0DJqM%*%%t**C&Cd
O EDJqqqM1r   c                 @    | j         j        dt          |           dS )N())	__class____name__rm   rT   s    r   __repr__zBarrelList.__repr__3  s"    >222DJJJJ??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 r3   )r   r   sortsortedr   rR   r1   )r   li
tmp_sorteds      r   r|   zBarrelList.sort6  s     tz??a 	"JqM     j  				 3DJ ? ?@@J
111&DJqMq!!!!!r   c                 t    | j         D ]}|                                 | j                                          d S r   )r   reverse)r   rd   s     r   r   zBarrelList.reverseC  s<    : 	 	CKKMMMM
r   c                 D    t          fd| j        D                       S )Nc                 :    g | ]}|                               S r=   )count)rY   rd   r5   s     r   r_   z$BarrelList.count.<locals>.<listcomp>I  s#    :::CIIdOO:::r   r`   r:   s    `r   r   zBarrelList.countH  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   r5   	len_accumrd   r'   s        r   r&   zBarrelList.indexK  s    	: 	& 	&C&))D// 7**** & & &SXX%			&6777s   )AAr   )!ry   
__module____qualname____doc__r   r   propertyr#   r*   r1   r,   r9   r   r>   rF   rN   __delslice__classmethodrR   rU   r\   rb   re   ri   rk   ro   rq   rt   rz   r|   r   r   r&   r=   r   r   r   r   E   s          D LO" " " "
 C C XC! ! !  
 
 
$ $ $( ( (  "3 3 3 3&< < < <8 L  [/ / /N N N1 1 1  - - -* * *- - -&. . .  @ @ @" " "  
< < <8 8 8 8 8r   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_indexr5   s       r   shiftzSplayList.shift`  s?    # 	Fxx
##J%%%%%r   c                 4    | |         | |         c| |<   | |<   d S r   r=   )r   r   r   s      r   swapzSplayList.swapf  s(    -1*-=tJ?O*Z$z***r   N)r   )ry   r   r   r   r   r   r=   r   r   r   r   Y  sF         & & & &P P P P Pr   r   )r   
__future__r   r   rh   mathr   r    	itertoolsr   r   	typeutilsr	   r
   ImportErrorobjectxrange	NameErrorr%   __all__rm   r   r   r   r=   r   r   <module>r      sf  B  0 / / / / / / /              # # # # # # # #((((((}j111HH   vxxHHH
FF   FFF
 L
!N8 N8 N8 N8 N8 N8 N8 N8b 	P P P P P P P P P Ps!   1 AAA
 
AA