U
    1ÜŸj  ã                   @   sZ   d dl Z d dlZddlmZ dddddd	œZddd„Zdd„ Zdd„ Zdd„ Zdd„ Z	dS )é    Né   )Ú__ne__z==ú<z<=ú>z>=)ÚeqÚltÚleÚgtÚgeTÚ
Comparablec                    s  dgt ƒ g tdœ‰ d}d}| dk	r<d}td| ƒˆ d< tˆ d	< |dk	rZ|d
7 }td|ƒˆ d< |dk	rx|d
7 }td|ƒˆ d< |dk	r–|d
7 }td|ƒˆ d< |dk	r´|d
7 }td|ƒˆ d< t |tfi ‡ fdd„¡}	|rÞ|	j t	¡ d|  k rôdk �rn n|�s
d}
t
|
ƒ‚t |	¡}	|	S )aú  
    Create a class that can be passed into `attrs.field`'s ``eq``, ``order``,
    and ``cmp`` arguments to customize field comparison.

    The resulting class will have a full set of ordering methods if at least
    one of ``{lt, le, gt, ge}`` and ``eq``  are provided.

    Args:
        eq (typing.Callable | None):
            Callable used to evaluate equality of two objects.

        lt (typing.Callable | None):
            Callable used to evaluate whether one object is less than another
            object.

        le (typing.Callable | None):
            Callable used to evaluate whether one object is less than or equal
            to another object.

        gt (typing.Callable | None):
            Callable used to evaluate whether one object is greater than
            another object.

        ge (typing.Callable | None):
            Callable used to evaluate whether one object is greater than or
            equal to another object.

        require_same_type (bool):
            When `True`, equality and ordering methods will return
            `NotImplemented` if objects are not of the same type.

        class_name (str | None): Name of class. Defaults to "Comparable".

    See `comparison` for more details.

    .. versionadded:: 21.1.0
    Úvalue)Ú	__slots__Ú__init__Ú_requirementsÚ_is_comparable_tor   FNTr   Ú__eq__r   r   r   Ú__lt__r   Ú__le__r	   Ú__gt__r
   Ú__ge__c                    s
   |   ˆ ¡S ©N)Úupdate)Úns©Úbody© ú-/tmp/pip-unpacked-wheel-1zjqotdg/attr/_cmp.pyÚ<lambda>]   ó    zcmp_using.<locals>.<lambda>é   zDeq must be define is order to complete ordering from lt, le, gt, ge.)Ú
_make_initr   Ú_make_operatorr   ÚtypesÚ	new_classÚobjectr   ÚappendÚ_check_same_typeÚ
ValueErrorÚ	functoolsÚtotal_ordering)r   r   r   r	   r
   Zrequire_same_typeÚ
class_nameZnum_order_functionsZhas_eq_functionÚtype_Úmsgr   r   r   Ú	cmp_using   sJ    0ü   
ÿ
r-   c                  C   s   dd„ } | S )z!
    Create __init__ method.
    c                 S   s
   || _ dS )z1
        Initialize object with *value*.
        N)r   )Úselfr   r   r   r   r   u   s    z_make_init.<locals>.__init__r   )r   r   r   r   r    p   s    r    c                    s0   ‡ fdd„}d| › d�|_ dt|  › d�|_|S )z!
    Create operator method.
    c                    s,   |   |¡stS ˆ | j|jƒ}|tkr(tS |S r   )r   ÚNotImplementedr   )r.   ÚotherÚresult©Úfuncr   r   Úmethodƒ   s    
z_make_operator.<locals>.methodÚ__z	Return a z b.  Computed by attrs.)Ú__name__Ú_operation_namesÚ__doc__)Únamer3   r4   r   r2   r   r!   ~   s
    
ÿr!   c                    s   t ‡ ‡fdd„ˆjD ƒƒS )z8
    Check whether `other` is comparable to `self`.
    c                 3   s   | ]}|ˆˆ ƒV  qd S r   r   )Ú.0r3   ©r0   r.   r   r   Ú	<genexpr>™   s     z$_is_comparable_to.<locals>.<genexpr>)Úallr   ©r.   r0   r   r;   r   r   •   s    r   c                 C   s   |j j| j jkS )zR
    Return True if *self* and *other* are of the same type, False otherwise.
    )r   Ú	__class__r>   r   r   r   r&   œ   s    r&   )NNNNNTr   )
r(   r"   Ú_maker   r7   r-   r    r!   r   r&   r   r   r   r   Ú<module>   s          ù
c