o
    Vh                     @  st   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dZdddZdddZdddZdS )zM
Routines for obtaining the class names
of an object and its parent classes.
    )annotations)TYPE_CHECKINGcast)unique_everseen)Iterator)Anyctype[object]returnlist[type[Any]]c                 C  s   |   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r    r   k/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/jaraco/classes/ancestry.py	all_bases   s   r   c                 C  s   |   S )ze
    return a tuple of all classes to which c belongs
    >>> list in all_classes(list)
    True
    r   r   r   r   r   all_classes   s   r   clsIterator[type[Any]]c                 C  s   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)r   r   r   r   iter_subclasses'   s   r   c                 c  sT    z|   }W n ty   td|  | }Y nw |D ]}|V  t|E d H  qd S )Nz
type[type])__subclasses__	TypeErrorr   r   )r   subssubr   r   r   r   E   s   r   N)r   r	   r
   r   )r   r	   r
   r   )__doc__
__future__r   typingr   r   more_itertoolsr   collections.abcr   r   r   r   r   r   r   r   r   r   <module>   s    

	
