
    "g                     J    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	y)	    )defaultdictdeque)filterfalseNc              #      K   t               }|j                  }|(t        |j                  |       D ]  } ||       |  y| D ]  } ||      }||vs ||       |  yw)zHList unique elements, preserving order. Remember all elements ever seen.N)setaddr   __contains__)iterablekeyseenseen_addelementks         R/var/www/openai/venv/lib/python3.12/site-packages/importlib_metadata/_itertools.pyunique_everseenr      sj      5DxxH
{"4#4#4h?GWM @  GGA}	  s   AA$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']
     )iter
isinstance	TypeError)obj	base_types     r   always_iterabler      sX    R {Bx:c9#=SF|Cy SF|s   
4 AAc                   0    e Zd ZdZddZd Zd Zd Zd Zy)	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                 r    t        |      | _        || _        t        t              | _        |xs d | _        y )Nc                      y)NTr   )xs    r   <lambda>z!bucket.__init__.<locals>.<lambda>v   s    $    )r   _it_keyr   r   _cache
_validator)selfr
   r   	validators       r   __init__zbucket.__init__r   s,    >	!%(#7r    c                     | j                  |      sy	 t        | |         }| j                  |   j                  |       y# t        $ r Y yw xY w)NFT)r$   nextr#   
appendleftStopIteration)r%   valueitems      r   r	   zbucket.__contains__x   sT    u%	0U$D KK))$/  		s   A 	AAc              #   N  K   	 | j                   |   r | j                   |   j                          nb	 	 t        | j                        }| j                  |      }||k(  r| n0| j                  |      r| j                   |   j                  |       a# t        $ r Y yw xY ww)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.
        N)r#   popleftr)   r!   r+   r"   r$   append)r%   r,   r-   
item_values       r   _get_valueszbucket._get_values   s       {{5!kk%(0022 #DHH~ "&4J!U*"
4J/66t<   ) s)   2B%B 
AB%	B"B%!B""B%c              #      K   | j                   D ]C  }| j                  |      }| j                  |      s&| j                  |   j	                  |       E | j                  j                         E d {    y 7 wN)r!   r"   r$   r#   r0   keys)r%   r-   r1   s      r   __iter__zbucket.__iter__   s\     HHD4Jz*J'..t4 
 ;;##%%%s   2A:=A:2A83A:c                 \    | j                  |      st        d      S | j                  |      S )Nr   )r$   r   r2   )r%   r,   s     r   __getitem__zbucket.__getitem__   s(    u%8O&&r    r4   )	__name__
__module____qualname____doc__r'   r	   r2   r6   r8   r   r    r   r   r   N   s!    !F8=4&'r    r   r4   )
collectionsr   r   	itertoolsr   r   strbytesr   r   r   r    r   <module>rA      s+    * !& %(< 2l]' ]'r    