
    Ki                    l    d Z ddlmZ ddlmZmZ ddlmZ erddlm	Z	 ddlm
Z
 ddZddZdd	Zdd
Zy)zM
Routines for obtaining the class names
of an object and its parent classes.
    )annotations)TYPE_CHECKINGcast)unique_everseen)Iterator)Anyc                (    | j                         dd S )zt
    return a tuple of all base classes the class c has as a parent.
    >>> object in all_bases(list)
    True
       Nmrocs    c/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/jaraco/classes/ancestry.py	all_basesr      s     55712;    c                "    | j                         S )ze
    return a tuple of all classes to which c belongs
    >>> list in all_classes(list)
    True
    r   r   s    r   all_classesr      s     557Nr   c                *    t        t        |             S )a:  
    Generator over all subclasses of a given class, in depth-first order.

    >>> bool in list(iter_subclasses(int))
    True
    >>> class A(object): pass
    >>> class B(A): pass
    >>> class C(A): pass
    >>> class D(B,C): pass
    >>> class E(D): pass
    >>>
    >>> for cls in iter_subclasses(A):
    ...     print(cls.__name__)
    B
    D
    E
    C
    >>> # get ALL classes currently defined
    >>> res = [cls.__name__ for cls in iter_subclasses(object)]
    >>> 'type' in res
    True
    >>> 'tuple' in res
    True
    >>> len(res) > 100
    True
    )r   _iter_all_subclasses)clss    r   iter_subclassesr   '   s    6 /455r   c              #     K   	 | j                         }|D ]  }| t        |      E d {     y # t        $ r t        d|       j                  |       }Y Ew xY w7 1w)Nz
type[type])__subclasses__	TypeErrorr   r   )r   subssubs      r   r   r   E   sj     ;!!#  (	"3'''(  ;L#&55c:; 	(s/   A3 AAA$AAAAN)r   type[object]returnzlist[type[Any]])r   r   r   zIterator[type[Any]])__doc__
__future__r   typingr   r   more_itertoolsr   collections.abcr   r   r   r   r   r    r   r   <module>r%      s2   
 # & *(6<(r   