OwlCyberSecurity - MANAGER
Edit File: _itertools.cpython-312.pyc
� H��g� � �J � d dl mZmZ d dlmZ dd�Zeeffd�Z G d� d� Z y) � )�defaultdict�deque)�filterfalseNc # �� K � t � }|j }|�(t |j | � D ] } ||� |�� � y| D ] } ||� }||vs� ||� |�� � y�w)zHList unique elements, preserving order. Remember all elements ever seen.N)�set�addr �__contains__)�iterable�key�seen�seen_add�element�ks �L/opt/hc_python/lib/python3.12/site-packages/importlib_metadata/_itertools.py�unique_everseenr sj � �� � �5�D��x�x�H� �{�"�4�#4�#4�h�?�G��W���M� @� �G��G��A���}����� � �s �AA$�A$c � � | �t d� S |�t | |� rt | f� S t | � S # t $ r t | f� cY S w xY 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 �{��B�x����:�c�9�#=��S�F�|����C�y���� ��S�F�|���s � 4 �A�Ac �0 � e Zd ZdZdd�Zd� Zd� Zd� Zd� Zy) �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 � | _ |xs 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__zbucket.__init__r s, � ���>����� �!�%�(���#�7���r c � � | j |� sy t | | � }| j | j |� y# t $ r Y yw xY w)NFT)r$ �nextr# � appendleft� StopIteration)r% �value�items r r zbucket.__contains__x sT � ����u�%�� 0���U��$�D� �K�K���)�)�$�/��� � �� �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 yw xY 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"