U
    yh                     @   sV   d dl mZ ddddgZG dd deZdd ZG dd deZG d	d ded
ZdS )   )typenameVariadicSignatureType
isvariadicVariadicSignatureMetaVariadicc                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                    s2   t |r|jn|f}| kp0t fdd|D S )Nc                 3   s   | ]}t | jV  qd S N)
issubclassvariadic_type).0othercls m/var/www/html/venv/lib/python3.8/site-packages/torch/fx/experimental/unification/multipledispatch/variadic.py	<genexpr>   s    z:VariadicSignatureType.__subclasscheck__.<locals>.<genexpr>)r   r	   all)r   subclassZ
other_typer   r   r   __subclasscheck__   s    z'VariadicSignatureType.__subclasscheck__c                 C   s   t |ot| jt|jkS )a  
        Return True if other has the same variadic type
        Parameters
        ----------
        other : object (type)
            The object (type) to check
        Returns
        -------
        bool
            Whether or not `other` is equal to `self`
        )r   setr	   )r   r   r   r   r   __eq__   s    zVariadicSignatureType.__eq__c                 C   s   t t| t| jfS r   )hashtype	frozensetr	   r   r   r   r   __hash__   s    zVariadicSignatureType.__hash__N)__name__
__module____qualname__r   r   r   r   r   r   r   r      s   c                 C   s
   t | tS )a@  Check whether the type `obj` is variadic.
    Parameters
    ----------
    obj : type
        The type to check
    Returns
    -------
    bool
        Whether or not `obj` is variadic
    Examples
    --------
    >>> # xdoctest: +SKIP
    >>> isvariadic(int)
    False
    >>> isvariadic(Variadic[int])
    True
    )
isinstancer   )objr   r   r   r   "   s    c                   @   s   e Zd ZdZdd ZdS )r   zA metaclass that overrides ``__getitem__`` on the class. This is used to
    generate a new type for Variadic signatures. See the Variadic class for
    examples of how this behaves.
    c                 C   sN   t |ttfst|stdt |ts.|f}tdt| ddt|ddS )NzVVariadic types must be type or tuple of types (Variadic[int] or Variadic[(int, float)]z	Variadic[]r   )r	   	__slots__)r   r   tuple
ValueErrorr   r   dict)r   r	   r   r   r   __getitem__<   s    

z!VariadicSignatureMeta.__getitem__N)r   r   r   __doc__r$   r   r   r   r   r   7   s   c                   @   s   e Zd ZdZdS )r   ar  A class whose getitem method can be used to generate a new type
    representing a specific variadic signature.
    Examples
    --------
    >>> # xdoctest: +SKIP
    >>> Variadic[int]  # any number of int arguments
    <class 'multipledispatch.variadic.Variadic[int]'>
    >>> Variadic[(int, str)]  # any number of one of int or str arguments
    <class 'multipledispatch.variadic.Variadic[(int, str)]'>
    >>> issubclass(int, Variadic[int])
    True
    >>> issubclass(int, Variadic[(int, str)])
    True
    >>> issubclass(str, Variadic[(int, str)])
    True
    >>> issubclass(float, Variadic[(int, str)])
    False
    N)r   r   r   r%   r   r   r   r   r   J   s   )	metaclassN)utilsr   __all__r   r   r   r   r   r   r   r   r   <module>   s
   