
    .Ph                     R    d dl mZmZ d dlmZ ddZeeffdZ G d d          Z	dS )	    )defaultdictdeque)filterfalseNc              #      K   t                      }|j        }|)t          |j        |           D ]} ||           |V  dS | D ] } ||          }||vr ||           |V  !dS )zHList unique elements, preserving order. Remember all elements ever seen.N)setaddr   __contains__)iterablekeyseenseen_addelementks         ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/importlib_metadata/_itertools.pyunique_everseenr      s       55DxH
{"4#4h?? 	 	GHWMMMM	 	   	 	GGA}}		 	    c                     | t          d          S | t          | |          rt          | f          S 	 t          |           S # t          $ r t          | f          cY S w xY w)ax  If *obj* is iterable, return an iterator over its items::

        >>> obj = (1, 2, 3)
        >>> list(always_iterable(obj))
        [1, 2, 3]

    If *obj* is not iterable, return a one-item iterable containing *obj*::

        >>> obj = 1
        >>> list(always_iterable(obj))
        [1]

    If *obj* is ``None``, return an empty iterable:

        >>> obj = None
        >>> list(always_iterable(None))
        []

    By default, binary and text strings are not considered iterable::

        >>> obj = 'foo'
        >>> list(always_iterable(obj))
        ['foo']

    If *base_type* is set, objects for which ``isinstance(obj, base_type)``
    returns ``True`` won't be considered iterable.

        >>> obj = {'a': 1}
        >>> list(always_iterable(obj))  # Iterate over the dict's keys
        ['a']
        >>> list(always_iterable(obj, base_type=dict))  # Treat dicts as a unit
        [{'a': 1}]

    Set *base_type* to ``None`` to avoid any special handling and treat objects
    Python considers iterable as iterable:

        >>> obj = 'foo'
        >>> list(always_iterable(obj, base_type=None))
        ['f', 'o', 'o']
    N )iter
isinstance	TypeError)obj	base_types     r   always_iterabler      sx    R {Bxx:c9#=#=SF||Cyy   SF||s   A A! A!c                   2    e Zd ZdZddZd Zd Zd Zd ZdS )	bucketa  Wrap *iterable* and return an object that buckets the iterable into
    child iterables based on a *key* function.

        >>> iterable = ['a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'b3']
        >>> s = bucket(iterable, key=lambda x: x[0])  # Bucket by 1st character
        >>> sorted(list(s))  # Get the keys
        ['a', 'b', 'c']
        >>> a_iterable = s['a']
        >>> next(a_iterable)
        'a1'
        >>> next(a_iterable)
        'a2'
        >>> list(s['b'])
        ['b1', 'b2', 'b3']

    The original iterable will be advanced and its items will be cached until
    they are used by the child iterables. This may require significant storage.

    By default, attempting to select a bucket to which no items belong  will
    exhaust the iterable and cache all values.
    If you specify a *validator* function, selected buckets will instead be
    checked against it.

        >>> from itertools import count
        >>> it = count(1, 2)  # Infinite sequence of odd numbers
        >>> key = lambda x: x % 10  # Bucket by last digit
        >>> validator = lambda x: x in {1, 3, 5, 7, 9}  # Odd digits only
        >>> s = bucket(it, key=key, validator=validator)
        >>> 2 in s
        False
        >>> list(s[2])
        []

    Nc                     t          |          | _        || _        t          t                    | _        |pd | _        d S )Nc                     dS )NTr   )xs    r   <lambda>z!bucket.__init__.<locals>.<lambda>v   s    $ r   )r   _it_keyr   r   _cache
_validator)selfr
   r   	validators       r   __init__zbucket.__init__r   s7    >>	!%((#7r   c                     |                      |          sdS 	 t          | |                   }| j        |                             |           n# t          $ r Y dS w xY wdS )NFT)r$   nextr#   
appendleftStopIteration)r%   valueitems      r   r	   zbucket.__contains__x   s|    u%% 	5	0U$$D K))$////  	 	 	55	
 ts   A 
AAc              #   d  K   	 | j         |         r"| j         |                                         V  n~	 	 t          | j                  }n# t          $ r Y dS w xY w|                     |          }||k    r|V  n6|                     |          r | j         |                             |           })z
        Helper to yield items from the parent iterator that match *value*.
        Items that don't match are stored in the local cache as they
        are encountered.
        TN)r#   popleftr)   r!   r+   r"   r$   append)r%   r,   r-   
item_values       r   _get_valueszbucket._get_values   s      	= {5! =k%(00222222
=#DH~~(   !%4J!U**"


44 =J/66t<<<
=	=s   A
 

AAc              #      K   | j         D ]L}|                     |          }|                     |          r | j        |                             |           M| j                                        E d {V  d S N)r!   r"   r$   r#   r0   keys)r%   r-   r1   s      r   __iter__zbucket.__iter__   s      H 	5 	5D4Jz** 5J'..t444;##%%%%%%%%%%%r   c                 t    |                      |          st          d          S |                     |          S )Nr   )r$   r   r2   )r%   r,   s     r   __getitem__zbucket.__getitem__   s5    u%% 	88O&&&r   r4   )	__name__
__module____qualname____doc__r'   r	   r2   r6   r8   r   r   r   r   r   N   so        ! !F8 8 8 8  = = =4& & &' ' ' ' 'r   r   r4   )
collectionsr   r   	itertoolsr   r   strbytesr   r   r   r   r   <module>rA      s    * * * * * * * * ! ! ! ! ! !   & %(< 2 2 2 2l]' ]' ]' ]' ]' ]' ]' ]' ]' ]'r   