Current Dir: /snap/core22/2955/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/__pycache__/
[FILE] more.cpython-310.pyc [ edit | delete | rename ]
[FILE] recipes.cpython-310.pyc [ edit | delete | rename ]
[FILE] __init__.cpython-310.pyc [ edit | delete | rename ]
Viewing: /snap/core22/2955/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-310.pyc
o
�_�a�� � @ s� d dl Z d dlmZmZmZmZ d dlmZ d dlm Z d dl
mZmZm
Z
d dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dl m!Z!m"Z"m#Z#m$Z$ d d l%m&Z&m'Z' d d
l(m(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 d d
l4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< g d�Z=e>� Z?d�dd�Z@e?fdd�ZAe?fdd�ZBe?fdd�ZCG dd� d�ZDdd� ZEdd� ZFd d!� ZGd"d#� ZHd$d%� ZId�d&d'�ZJd�d(d)�ZKd�d*d+�ZLd,d-� ZMd�d.d/�ZNd0d1� ZOd�d2d3�ZPG d4d5� d5�ZQd�d6d7�ZRd8d9� ZSd:d;� ZTd�d<d=�ZUd�d>d?�ZVd�d@dA�ZWd�dCdD�ZXd�dEdF�ZYd�dGdH�ZZd�dIdJ�Z[dKdL� Z\d�dMdN�Z]d�dOdP�Z^dQdR� Z_d�dTdU�Z`G dVdW� dWea�ZbdXdY� ZcdZd[� Zdddd\�d]d^�Zed�d`da�Zfdbdc� Zgddde� Zheiejffdfdg�Zkd�dhdi�Zld�djdk�ZmG dldm� dmejejn�Zod�dndo�Zpdpdq� Zqerdfdrds�Zsdtdu� Ztdvdw� Zudxdy� ZvG dzd{� d{�Zwd|d}� Zxd~d� Zyd�d�� fd�d��Zze.fdd��d�d��Z{G d�d�� d�e�Z|G d�d�� d��Z}G d�d�� d��Z~erfd�d��Zd�d�� Z�d_d�d��Z�d�d�d��Z�erdfd�d��Z�d�d�d��Z�d�d�� Z�d�d�d��Z�G d�d�� d��Z�d�d�d��Z�d�d�� Z�d�d�� Z�d�d�� Z�d�d�� Z�d�d�� Z�d�d�� Z�d�d�d��Z�d�d�d��Z�G d�d�� d�e��Z�G d�d�� d��Z�d�d�� Z�d�d�d��Z�d�d�� Z�d�d�� Z�d�d�� Z�d�d�� Z�d�d Z�d�dĄ Z�G d�dƄ dƃZ�dS )�� N)�Counter�defaultdict�deque�abc)�Sequence)�ThreadPoolExecutor)�partial�reduce�wraps)�merge�heapify�heapreplace�heappop)�chain�compress�count�cycle� dropwhile�groupby�islice�repeat�starmap� takewhile�tee�zip_longest)�exp� factorial�floor�log)�Empty�Queue)�random� randrange�uniform)�
itemgetter�mul�sub�gt�lt)�
hexversion�maxsize)� monotonic� )�consume�flatten�pairwise�powerset�take�unique_everseen)S�AbortThread�adjacent�always_iterable�always_reversible�bucket�
callback_iter�chunked�circular_shifts�collapse�collate�consecutive_groups�consumer� countable�count_cycle� mark_ends�
difference�distinct_combinations�distinct_permutations�
distribute�divide� exactly_n�
filter_except�first�groupby_transform�ilen�interleave_longest�
interleave�intersperse�islice_extended�iterate�ichunked� is_sorted�last�locate�lstrip�make_decorator�
map_except�
map_reduce�nth_or_last�nth_permutation�nth_product�
numeric_range�one�only�padded�
partitions�set_partitions�peekable�repeat_last�replace�rlocate�rstrip�
run_length�sample�seekable�SequenceView�side_effect�sliced�
sort_together�split_at�split_after�split_before�
split_when�
split_into�spy�stagger�strip�
substrings�substrings_indexes�time_limited�unique_to_each�unzip�windowed� with_iter�UnequalIterablesError� zip_equal�
zip_offset�windowed_complete�
all_unique�value_chain�
product_index�combination_index�permutation_indexFc s6 t tt�t | ��g �� |r� �fdd�}t |� �S � S )aJ Break *iterable* into lists of length *n*:
>>> list(chunked([1, 2, 3, 4, 5, 6], 3))
[[1, 2, 3], [4, 5, 6]]
By the default, the last yielded list will have fewer than *n* elements
if the length of *iterable* is not divisible by *n*:
>>> list(chunked([1, 2, 3, 4, 5, 6, 7, 8], 3))
[[1, 2, 3], [4, 5, 6], [7, 8]]
To use a fill-in value instead, see the :func:`grouper` recipe.
If the length of *iterable* is not divisible by *n* and *strict* is
``True``, then ``ValueError`` will be raised before the last
list is yielded.
c 3 �* � � D ]} t | ��krtd��| V qd S )Nziterable is not divisible by n.��len�
ValueError)�chunk��iterator�n� �H/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/more.py�ret� � ��zchunked.<locals>.ret)�iterr r1 )�iterabler� �strictr� r� r� r� r9 s
r9 c
C sJ zt t| ��W S ty$ } z|tu rtd�|�|W Y d}~S d}~ww )a� Return the first item of *iterable*, or *default* if *iterable* is
empty.
>>> first([0, 1, 2, 3])
0
>>> first([], 'some default')
'some default'
If *default* is not provided and there are no items in the iterable,
raise ``ValueError``.
:func:`first` is useful when you have a generator of expensive-to-retrieve
values and want any arbitrary one. It is marginally shorter than
``next(iter(iterable), default)``.
zKfirst() was called on an empty iterable, and no default value was provided.N)�nextr� �
StopIteration�_markerr� )r� �default�er� r� r� rI � s ����rI c
C st z#t | t�r| d W S t| d�rtdkrtt| ��W S t| dd�d W S ttt fy9 |t
u r5td��| Y S w )a Return the last item of *iterable*, or *default* if *iterable* is
empty.
>>> last([0, 1, 2, 3])
3
>>> last([], 'some default')
'some default'
If *default* is not provided and there are no items in the iterable,
raise ``ValueError``.
����__reversed__i� r, ��maxlenzDlast() was called on an empty iterable, and no default was provided.)�
isinstancer �hasattrr) r� �reversedr �
IndexError� TypeErrorr� r� r� )r� r� r� r� r� rS � s
��rS c C s t t| |d �|d�S )ag Return the nth or the last item of *iterable*,
or *default* if *iterable* is empty.
>>> nth_or_last([0, 1, 2, 3], 2)
2
>>> nth_or_last([0, 1], 2)
1
>>> nth_or_last([], 0, 'some default')
'some default'
If *default* is not provided and there are no items in the iterable,
raise ``ValueError``.
r, �r� )rS r )r� r� r� r� r� r� rY � s rY c @ sT e Zd ZdZdd� Zdd� Zdd� Zefdd �Zd
d� Z dd
� Z
dd� Zdd� ZdS )rb a Wrap an iterator to allow lookahead and prepending elements.
Call :meth:`peek` on the result to get the value that will be returned
by :func:`next`. This won't advance the iterator:
>>> p = peekable(['a', 'b'])
>>> p.peek()
'a'
>>> next(p)
'a'
Pass :meth:`peek` a default value to return that instead of raising
``StopIteration`` when the iterator is exhausted.
>>> p = peekable([])
>>> p.peek('hi')
'hi'
peekables also offer a :meth:`prepend` method, which "inserts" items
at the head of the iterable:
>>> p = peekable([1, 2, 3])
>>> p.prepend(10, 11, 12)
>>> next(p)
10
>>> p.peek()
11
>>> list(p)
[11, 12, 1, 2, 3]
peekables can be indexed. Index 0 is the item that will be returned by
:func:`next`, index 1 is the item after that, and so on:
The values up to the given index will be cached.
>>> p = peekable(['a', 'b', 'c', 'd'])
>>> p[0]
'a'
>>> p[1]
'b'
>>> next(p)
'a'
Negative indexes are supported, but be aware that they will cache the
remaining items in the source iterator, which may require significant
storage.
To check whether a peekable is exhausted, check its truth value:
>>> p = peekable(['a', 'b'])
>>> if p: # peekable has items
... list(p)
['a', 'b']
>>> if not p: # peekable is exhausted
... list(p)
[]
c C s t |�| _t� | _d S �N)r� �_itr �_cache��selfr� r� r� r� �__init__% s
zpeekable.__init__c C � | S r� r� �r� r� r� r� �__iter__) � zpeekable.__iter__c C �$ z| � � W dS ty Y dS w �NFT��peekr� r� r� r� r� �__bool__, �
��zpeekable.__bool__c C sH | j sz| j �t| j�� W n ty |tu r� | Y S w | j d S )z�Return the item that will be next returned from ``next()``.
Return ``default`` if there are no items left. If ``default`` is not
provided, raise ``StopIteration``.
r )r� �appendr� r� r� r� )r� r� r� r� r� r� 3 s �
z
peekable.peekc G s | j �t|�� dS )a Stack up items to be the next ones returned from ``next()`` or
``self.peek()``. The items will be returned in
first in, first out order::
>>> p = peekable([1, 2, 3])
>>> p.prepend(10, 11, 12)
>>> next(p)
10
>>> list(p)
[11, 12, 1, 2, 3]
It is possible, by prepending items, to "resurrect" a peekable that
previously raised ``StopIteration``.
>>> p = peekable([])
>>> next(p)
Traceback (most recent call last):
...
StopIteration
>>> p.prepend(1)
>>> next(p)
1
>>> next(p)
Traceback (most recent call last):
...
StopIteration
N)r� �
extendleftr� )r� �itemsr� r� r� �prependC s zpeekable.prependc C s | j r| j �� S t| j�S r� )r� �popleftr� r� r� r� r� r� �__next__b s
zpeekable.__next__c C s� |j d u rdn|j }|dkr#|jd u rdn|j}|jd u rtn|j}n |dk r?|jd u r.dn|j}|jd u r;t d n|j}ntd��|dk sK|dk rS| j�| j� ntt ||�d t�}t
| j�}||krr| j�t| j|| �� t| j�| S )Nr, r r� zslice step cannot be zero)
�step�start�stopr* r� r� �extendr� �min�maxr� r �list)r� �indexr� r� r� r� � cache_lenr� r� r� �
_get_sliceh s
zpeekable._get_slicec C sd t |t�r
| �|�S t| j�}|dk r| j�| j� n||kr-| j�t| j|d | �� | j| S �Nr r, )r� �slicer� r� r� r� r� r )r� r� r� r� r� r� �__getitem__� s
zpeekable.__getitem__N)
�__name__�
__module__�__qualname__�__doc__r� r� r� r� r� r� r� r� r� r� r� r� r� rb � s :rb c O s t �dt� t| i |��S )a� Return a sorted merge of the items from each of several already-sorted
*iterables*.
>>> list(collate('ACDZ', 'AZ', 'JKL'))
['A', 'A', 'C', 'D', 'J', 'K', 'L', 'Z', 'Z']
Works lazily, keeping only the next value from each iterable in memory. Use
:func:`collate` to, for example, perform a n-way mergesort of items that
don't fit in memory.
If a *key* function is specified, the iterables will be sorted according
to its result:
>>> key = lambda s: int(s) # Sort by numeric value, not by string
>>> list(collate(['1', '10'], ['2', '11'], key=key))
['1', '2', '10', '11']
If the *iterables* are sorted in descending order, set *reverse* to
``True``:
>>> list(collate([5, 3, 1], [4, 2, 0], reverse=True))
[5, 4, 3, 2, 1, 0]
If the elements of the passed-in iterables are out of order, you might get
unexpected results.
On Python 3.5+, this function is an alias for :func:`heapq.merge`.
z<collate is no longer part of more_itertools, use heapq.merge)�warnings�warn�DeprecationWarningr )� iterables�kwargsr� r� r� r<