
    O=dc                        d Z ddlmZmZ ddlZddlmZ ddlZddlZddl	Z	ddl
mZ ddlZddlmZmZmZmZmZmZ dZ e e	j        d	                    Zd
 Zd Zd Zd Zd Zd6dZd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d  Z/d! Z0d" Z1d# Z2d$ Z3d% Z4deeefd&Z5d' Z6d( Z7d) Z8d* Z9d+ Z:d, Z;d- Z<d. Z=d/ Z>d0 Z?d1 Z@d2 ZAd3 ZBd4 ZCd5 ZDdS )7zZ
Predicate functions that return boolean evaluations of objects.

.. versionadded:: 2.0.0
    )IterableMappingN)islice)BuiltinFunctionType   )BUILTINSNUMBER_TYPESUNSETbase_getcallititerator),eqgtgteltltein_rangeis_associativeis_blank
is_boolean
is_builtinis_dateis_decreasingis_dictis_emptyis_equalis_equal_withis_erroris_evenis_floatis_functionis_increasing
is_indexedis_instance_of
is_integeris_iterableis_jsonis_listis_matchis_match_withis_monotoneis_nanis_negativeis_none	is_number	is_objectis_oddis_positive
is_reg_expis_setis_strictly_decreasingis_strictly_increasing	is_stringis_tupleis_zero c                 
    | |u S )a  
    Checks if :attr:`value` is equal to :attr:`other`.

    Args:
        value (mixed): Value to compare.
        other (mixed): Other value to compare.

    Returns:
        bool: Whether :attr:`value` is equal to :attr:`other`.

    Example:

        >>> eq(None, None)
        True
        >>> eq(None, '')
        False
        >>> eq('a', 'a')
        True
        >>> eq(1, str(1))
        False

    .. versionadded:: 4.0.0
     valueothers     ;D:\Sites\api_v1\venv\Lib\site-packages\pydash/predicates.pyr   r   G   s    0 E>    c                     | |k    S )ar  
    Checks if `value` is greater than `other`.

    Args:
        value (number): Value to compare.
        other (number): Other value to compare.

    Returns:
        bool: Whether `value` is greater than `other`.

    Example:

        >>> gt(5, 3)
        True
        >>> gt(3, 5)
        False
        >>> gt(5, 5)
        False

    .. versionadded:: 3.3.0
    r<   r=   s     r@   r   r   b       , 5=rA   c                     | |k    S )a  
    Checks if `value` is greater than or equal to `other`.

    Args:
        value (number): Value to compare.
        other (number): Other value to compare.

    Returns:
        bool: Whether `value` is greater than or equal to `other`.

    Example:

        >>> gte(5, 3)
        True
        >>> gte(3, 5)
        False
        >>> gte(5, 5)
        True

    .. versionadded:: 3.3.0
    r<   r=   s     r@   r   r   {       , E>rA   c                     | |k     S )al  
    Checks if `value` is less than `other`.

    Args:
        value (number): Value to compare.
        other (number): Other value to compare.

    Returns:
        bool: Whether `value` is less than `other`.

    Example:

        >>> lt(5, 3)
        False
        >>> lt(3, 5)
        True
        >>> lt(5, 5)
        False

    .. versionadded:: 3.3.0
    r<   r=   s     r@   r   r      rC   rA   c                     | |k    S )a  
    Checks if `value` is less than or equal to `other`.

    Args:
        value (number): Value to compare.
        other (number): Other value to compare.

    Returns:
        bool: Whether `value` is less than or equal to `other`.

    Example:

        >>> lte(5, 3)
        False
        >>> lte(3, 5)
        True
        >>> lte(5, 5)
        True

    .. versionadded:: 3.3.0
    r<   r=   s     r@   r   r      rE   rA   c                     t          |           sdS t          |          sd}||}d}nt          |          sd}|| cxk    o|k     nc S )a  
    Checks if `value` is between `start` and up to but not including `end`. If `end` is not
    specified it defaults to `start` with `start` becoming ``0``.

    Args:

        value (int|float): Number to check.
        start (int|float, optional): Start of range inclusive. Defaults to ``0``.
        end (int|float, optional): End of range exclusive. Defaults to `start`.

    Returns:
        bool: Whether `value` is in range.

    Example:

        >>> in_range(2, 4)
        True
        >>> in_range(4, 2)
        False
        >>> in_range(2, 1, 3)
        True
        >>> in_range(3, 1, 2)
        False
        >>> in_range(2.5, 3.5)
        True
        >>> in_range(3.5, 2.5)
        False

    .. versionadded:: 3.1.0
    Fr   r/   )r>   startends      r@   r   r      st    > U uU 
{s^^ ECrA   c                 "    t          | d          S )a  
    Checks if `value` is an associative object meaning that it can be accessed via an index or key.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is associative.

    Example:

        >>> is_associative([])
        True
        >>> is_associative({})
        True
        >>> is_associative(1)
        False
        >>> is_associative(True)
        False

    .. versionadded:: 2.0.0
    __getitem__)hasattrr>   s    r@   r   r      s    . 5-(((rA   c                 r    	 t          t          j        d|                     }n# t          $ r d}Y nw xY w|S )aK  
    Checks if `text` contains only whitespace characters.

    Args:
        text (str): String to test.

    Returns:
        bool: Whether `text` is blank.

    Example:

        >>> is_blank('')
        True
        >>> is_blank(' \r\n ')
        True
        >>> is_blank(False)
        False

    .. versionadded:: 3.0.0
    z^(\s+)?$F)boolrematch	TypeError)textrets     r@   r   r     sM    *28K..//    Js   "% 44c                 ,    t          | t                    S )a  
    Checks if `value` is a boolean value.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a boolean.

    Example:

        >>> is_boolean(True)
        True
        >>> is_boolean(False)
        True
        >>> is_boolean(0)
        False

    .. versionadded:: 1.0.0

    .. versionchanged:: 3.0.0
        Added ``is_bool`` as alias.

    .. versionchanged:: 4.0.0
        Removed alias ``is_bool``.
    )
isinstancerQ   rO   s    r@   r   r   +  s    6 eT"""rA   c                 b    	 t          | t                    p| t          v S # t          $ r Y dS w xY w)a  
    Checks if `value` is a Python builtin function or method.

    Args:
        value (callable): Value to check.

    Returns:
        bool: Whether `value` is a Python builtin function or method.

    Example:

        >>> is_builtin(1)
        True
        >>> is_builtin(list)
        True
        >>> is_builtin('foo')
        False

    .. versionadded:: 3.0.0

    .. versionchanged:: 4.0.0
        Removed alias ``is_native``.
    F)rX   r   r   rT   rO   s    r@   r   r   I  sD    0%!455J(9JJ   uus     
..c                 6    t          | t          j                  S )a  
    Check if `value` is a date object.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a date object.

    Example:

        >>> import datetime
        >>> is_date(datetime.date.today())
        True
        >>> is_date(datetime.datetime.today())
        True
        >>> is_date('2014-01-01')
        False

    Note:
        This will also return ``True`` for datetime objects.

    .. versionadded:: 1.0.0
    )rX   datetimedaterO   s    r@   r   r   g  s    2 eX]+++rA   c                 6    t          | t          j                  S )aw  
    Check if `value` is monotonically decreasing.

    Args:
        value (list): Value to check.

    Returns:
        bool: Whether `value` is monotonically decreasing.

    Example:

        >>> is_decreasing([5, 4, 4, 3])
        True
        >>> is_decreasing([5, 5, 5])
        True
        >>> is_decreasing([5, 4, 5])
        False

    .. versionadded:: 2.0.0
    )r+   operatorgerO   s    r@   r   r     s    * uhk***rA   c                 ,    t          | t                    S )a  
    Checks if `value` is a ``dict``.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a ``dict``.

    Example:

        >>> is_dict({})
        True
        >>> is_dict([])
        False

    .. versionadded:: 1.0.0

    .. versionchanged:: 3.0.0
        Added :func:`is_dict` as main definition and made `is_plain_object`` an alias.

    .. versionchanged:: 4.0.0
        Removed alias ``is_plain_object``.
    )rX   dictrO   s    r@   r   r     s    2 eT"""rA   c                 D    t          |           pt          |           p|  S )a  
    Checks if `value` is empty.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is empty.

    Example:

        >>> is_empty(0)
        True
        >>> is_empty(1)
        True
        >>> is_empty(True)
        True
        >>> is_empty('foo')
        False
        >>> is_empty(None)
        True
        >>> is_empty({})
        True

    Note:
        Returns ``True`` for booleans and numbers.

    .. versionadded:: 1.0.0
    )r   r/   rO   s    r@   r   r     s&    < e=	% 0 0=I=rA   c                 &    t          | |d          S )a%  
    Performs a comparison between two values to determine if they are equivalent to each other.

    Args:
        value (list|dict): Object to compare.
        other (list|dict): Object to compare.

    Returns:
        bool: Whether `value` and `other` are equal.

    Example:

        >>> is_equal([1, 2, 3], [1, 2, 3])
        True
        >>> is_equal('a', 'A')
        False

    .. versionadded:: 1.0.0

    .. versionchanged:: 4.0.0
        Removed :attr:`iteratee` from :func:`is_equal` and added it in
        :func:`is_equal_with`.
    N)
customizer)r   r=   s     r@   r   r     s    0 $7777rA   c                    t          |          r || |          nd}|nt          |          rt          |           t          |          u rt          | t          t          f          rt          |t          t          f          rit          |           t          |          k    rIt          |           D ]8\  }}t          j        ||          rt          |||         |          }nd}|s n9n| |k    }|S )ae  
    This method is like :func:`is_equal` except that it accepts customizer which is invoked to
    compare values. A customizer is provided which will be executed to compare values. If the
    customizer returns ``None``, comparisons will be handled by the method instead. The customizer
    is invoked with two arguments: ``(value, other)``.

    Args:
        value (list|dict): Object to compare.
        other (list|dict): Object to compare.
        customizer (mixed, optional): Customizer used to compare values from `value` and `other`.

    Returns:
        bool: Whether `value` and `other` are equal.

    Example:

        >>> is_equal_with([1, 2, 3], [1, 2, 3], None)
        True
        >>> is_equal_with('a', 'A', None)
        False
        >>> is_equal_with('a', 'A', lambda a, b: a.lower() == b.lower())
        True

    .. versionadded:: 4.0.0
    NF)
callabletyperX   listra   lenr   pydhasr   )r>   r?   rd   equalkeyvals         r@   r   r     s   6 )1(<(<FJJue$$$$E KK4;;&&utTl++ 'utTl++ ' JJ#e**$$ ! 	 	HCwuc"" %c5:zBB  LrA   c                 ,    t          | t                    S )aQ  
    Checks if `value` is an ``Exception``.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is an exception.

    Example:

        >>> is_error(Exception())
        True
        >>> is_error(Exception)
        False
        >>> is_error(None)
        False

    .. versionadded:: 1.1.0
    )rX   	ExceptionrO   s    r@   r   r   *  s    * eY'''rA   c                 2    t          |           o| dz  dk    S )a)  
    Checks if `value` is even.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is even.

    Example:

        >>> is_even(2)
        True
        >>> is_even(3)
        False
        >>> is_even(False)
        False

    .. versionadded:: 2.0.0
       r   rI   rO   s    r@   r   r   B      * U.	Q.rA   c                 ,    t          | t                    S )a
  
    Checks if `value` is a float.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a float.

    Example:

        >>> is_float(1.0)
        True
        >>> is_float(1)
        False

    .. versionadded:: 2.0.0
    )rX   floatrO   s    r@   r    r    Z  s    & eU###rA   c                      t          |           S )aH  
    Checks if `value` is a function.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is callable.

    Example:

        >>> is_function(list)
        True
        >>> is_function(lambda: True)
        True
        >>> is_function(1)
        False

    .. versionadded:: 1.0.0
    )rf   rO   s    r@   r!   r!   p  s    * E??rA   c                 6    t          | t          j                  S )a  
    Check if `value` is monotonically increasing.

    Args:
        value (list): Value to check.

    Returns:
        bool: Whether `value` is monotonically increasing.

    Example:

        >>> is_increasing([1, 3, 5])
        True
        >>> is_increasing([1, 1, 2, 3, 3])
        True
        >>> is_increasing([5, 5, 5])
        True
        >>> is_increasing([1, 2, 4, 3])
        False

    .. versionadded:: 2.0.0
    )r+   r^   lerO   s    r@   r"   r"     s    . uhk***rA   c                 F    t          | t          t          t          f          S )a  
    Checks if `value` is integer indexed, i.e., ``list``, ``str`` or ``tuple``.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is integer indexed.

    Example:

        >>> is_indexed('')
        True
        >>> is_indexed([])
        True
        >>> is_indexed(())
        True
        >>> is_indexed({})
        False

    .. versionadded:: 2.0.0

    .. versionchanged:: 3.0.0
        Return ``True`` for tuples.
    )rX   rh   tuplestrrO   s    r@   r#   r#     s    4 edE3/000rA   c                 "    t          | |          S )a  
    Checks if `value` is an instance of `types`.

    Args:
        value (mixed): Value to check.
        types (mixed): Types to check against. Pass as ``tuple`` to check if `value` is one of
            multiple types.

    Returns:
        bool: Whether `value` is an instance of `types`.

    Example:

        >>> is_instance_of({}, dict)
        True
        >>> is_instance_of({}, list)
        False

    .. versionadded:: 2.0.0
    )rX   )r>   typess     r@   r$   r$     s    * eU###rA   c                 J    t          |           ot          | t                    S )a  
    Checks if `value` is a integer.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is an integer.

    Example:

        >>> is_integer(1)
        True
        >>> is_integer(1.0)
        False
        >>> is_integer(True)
        False

    .. versionadded:: 2.0.0

    .. versionchanged:: 3.0.0
        Added ``is_int`` as alias.

    .. versionchanged:: 4.0.0
        Removed alias ``is_int``.
    )r/   rX   intrO   s    r@   r%   r%     s!    6 U6
5# 6 66rA   c                 H    	 t          |            dS # t          $ r Y dS w xY w)a  
    Checks if `value` is an iterable.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is an iterable.

    Example:

        >>> is_iterable([])
        True
        >>> is_iterable({})
        True
        >>> is_iterable(())
        True
        >>> is_iterable(5)
        False
        >>> is_iterable(True)
        False

    .. versionadded:: 3.3.0
    TF)iterrT   rO   s    r@   r&   r&     s=    2U t    uus    
!!c                 R    	 t          j        |            dS # t          $ r Y dS w xY w)a  
    Checks if `value` is a valid JSON string.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is JSON.

    Example:

        >>> is_json({})
        False
        >>> is_json('{}')
        True
        >>> is_json({"hello": 1, "world": 2})
        False
        >>> is_json('{"hello": 1, "world": 2}')
        True

    .. versionadded:: 2.0.0
    TF)jsonloadsrp   rO   s    r@   r'   r'     s>    .
5t   uus    
&&c                 ,    t          | t                    S )a,  
    Checks if `value` is a list.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a list.

    Example:

        >>> is_list([])
        True
        >>> is_list({})
        False
        >>> is_list(())
        False

    .. versionadded:: 1.0.0
    )rX   rh   rO   s    r@   r(   r(   4  s    * eT"""rA   c                 "    t          | |          S )a3  
    Performs a partial deep comparison between `obj` and `source` to determine if `obj` contains
    equivalent property values.

    Args:
        obj (list|dict): Object to compare.
        source (list|dict): Object of property values to match.

    Returns:
        bool: Whether `obj` is a match or not.

    Example:

        >>> is_match({'a': 1, 'b': 2}, {'b': 2})
        True
        >>> is_match({'a': 1, 'b': 2}, {'b': 3})
        False
        >>> is_match({'a': [{'b': [{'c': 3, 'd': 4}]}]},                     {'a': [{'b': [{'d': 4}]}]})
        True

    .. versionadded:: 3.0.0

    .. versionchanged:: 3.2.0
        Don't compare `obj` and `source` using ``type``. Use ``isinstance``
        exclusively.

    .. versionchanged:: 4.0.0
        Move `iteratee` argument to :func:`is_match_with`.
    )r*   )objsources     r@   r)   r)   L  s    > f%%%rA   c           	         |t           u r| }|t           u r|}t          |          sd }d|_        n|}t          |t          t
          f          rkt          |t                    sV| }t          |          D ]B\  }}		 t          | |          }
t          |
|	||||          }n# t          $ r d}Y nw xY w|s nCnt          || ||||          }|S )a  
    This method is like :func:`is_match` except that it accepts customizer which is invoked to
    compare values. If customizer returns ``None``, comparisons are handled by the method instead.
    The customizer is invoked with five arguments: ``(obj_value, src_value, index|key, obj,
    source)``.

    Args:
        obj (list|dict): Object to compare.
        source (list|dict): Object of property values to match.
        customizer (mixed, optional): Customizer used to compare values from `obj` and `source`.

    Returns:
        bool: Whether `obj` is a match or not.

    Example:

        >>> is_greeting = lambda val: val in ('hello', 'hi')
        >>> customizer = lambda ov, sv: is_greeting(ov) and is_greeting(sv)
        >>> obj = {'greeting': 'hello'}
        >>> src = {'greeting': 'hi'}
        >>> is_match_with(obj, src, customizer)
        True

    .. versionadded:: 4.0.0
    c                     | |k    S )Nr<   )	obj_value	src_values     r@   cbkzis_match_with.<locals>.cbk  s    	))rA   rr   )_key_obj_sourceF)r
   rf   	_argcountrX   r   r   r{   r   r   r*   rp   r   )r   r   rd   r   r   r   r   rl   rm   r>   r   s              r@   r*   r*   n  s'   4 u}}%J 	* 	* 	* &7H-.. >z&#7N7N > 
 #6** 	 	JC$S#..	%i#DZabbb      sCtW==Ls   <%B""B10B1c           	          t          |           s| g} fdt          | t          | dd                    D             }t          |d          S )a  
    Checks if `value` is monotonic when `operator` used for comparison.

    Args:
        value (list): Value to check.
        op (callable): Operation to used for comparison.

    Returns:
        bool: Whether `value` is monotone.

    Example:

        >>> is_monotone([1, 1, 2, 3], operator.le)
        True
        >>> is_monotone([1, 1, 2, 3], operator.lt)
        False

    .. versionadded:: 2.0.0
    c              3   :   K   | ]\  }} ||          d V  dS )FNr<   ).0xyops      r@   	<genexpr>zis_monotone.<locals>.<genexpr>  s7      SS1""QPQ((SeSSSSSSrA   r   NT)r(   zipr   next)r>   r   searchs    ` r@   r+   r+     sY    ( 5>> SSSSE6%D+A+A B BSSSFrA   c                 "    t          |            S )a6  
    Checks if `value` is not a number.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is not a number.

    Example:

        >>> is_nan('a')
        True
        >>> is_nan(1)
        False
        >>> is_nan(1.0)
        False

    .. versionadded:: 1.0.0
    rI   rO   s    r@   r,   r,     s    * rA   c                 ,    t          |           o| dk     S )a:  
    Checks if `value` is negative.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is negative.

    Example:

        >>> is_negative(-1)
        True
        >>> is_negative(0)
        False
        >>> is_negative(1)
        False

    .. versionadded:: 2.0.0
    r   rI   rO   s    r@   r-   r-         * U)	)rA   c                 
    | du S )a  
    Checks if `value` is `None`.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is ``None``.

    Example:

        >>> is_none(None)
        True
        >>> is_none(False)
        False

    .. versionadded:: 1.0.0
    Nr<   rO   s    r@   r.   r.     s    & D=rA   c                 L    t          |            ot          | t                    S )a&  
    Checks if `value` is a number.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a number.

    Note:
        Returns ``True`` for ``int``, ``long`` (PY2), ``float``, and
        ``decimal.Decimal``.

    Example:

        >>> is_number(1)
        True
        >>> is_number(1.0)
        True
        >>> is_number('a')
        False

    .. versionadded:: 1.0.0

    .. versionchanged:: 3.0.0
        Added ``is_num`` as alias.

    .. versionchanged:: 4.0.0
        Removed alias ``is_num``.
    )r   rX   r	   rO   s    r@   r/   r/     s$    > %   DZ|%D%DDrA   c                 :    t          | t          t          f          S )av  
    Checks if `value` is a ``list`` or ``dict``.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is ``list`` or ``dict``.

    Example:

        >>> is_object([])
        True
        >>> is_object({})
        True
        >>> is_object(())
        False
        >>> is_object(1)
        False

    .. versionadded:: 1.0.0
    )rX   rh   ra   rO   s    r@   r0   r0   0  s    . edD\***rA   c                 2    t          |           o| dz  dk    S )a"  
    Checks if `value` is odd.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is odd.

    Example:

        >>> is_odd(3)
        True
        >>> is_odd(2)
        False
        >>> is_odd('a')
        False

    .. versionadded:: 2.0.0
    rr   r   rI   rO   s    r@   r1   r1   J  rs   rA   c                 ,    t          |           o| dk    S )a:  
    Checks if `value` is positive.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is positive.

    Example:

        >>> is_positive(1)
        True
        >>> is_positive(0)
        False
        >>> is_positive(-1)
        False

    .. versionadded:: 2.0.0
    r   rI   rO   s    r@   r2   r2   b  r   rA   c                 ,    t          | t                    S )an  
    Checks if `value` is a ``RegExp`` object.

    Args:
        value (mxied): Value to check.

    Returns:
        bool: Whether `value` is a RegExp object.

    Example:

        >>> is_reg_exp(re.compile(''))
        True
        >>> is_reg_exp('')
        False

    .. versionadded:: 1.1.0

    .. versionchanged:: 4.0.0
        Removed alias ``is_re``.
    )rX   RegExprO   s    r@   r3   r3   z  s    , eV$$$rA   c                 ,    t          | t                    S )aH  
    Checks if the given value is a set object or not.

    Args:
        value (mixed): Value passed in by the user.

    Returns:
        bool: True if the given value is a set else False.

    Example:

        >>> is_set(set([1, 2]))
        True
        >>> is_set([1, 2, 3])
        False

    .. versionadded:: 4.0.0
    )rX   setrO   s    r@   r4   r4         & eS!!!rA   c                 6    t          | t          j                  S )aP  
    Check if `value` is strictly decreasing.

    Args:
        value (list): Value to check.

    Returns:
        bool: Whether `value` is strictly decreasing.

    Example:

        >>> is_strictly_decreasing([4, 3, 2, 1])
        True
        >>> is_strictly_decreasing([4, 4, 2, 1])
        False

    .. versionadded:: 2.0.0
    )r+   r^   r   rO   s    r@   r5   r5         & uhk***rA   c                 6    t          | t          j                  S )aP  
    Check if `value` is strictly increasing.

    Args:
        value (list): Value to check.

    Returns:
        bool: Whether `value` is strictly increasing.

    Example:

        >>> is_strictly_increasing([1, 2, 3, 4])
        True
        >>> is_strictly_increasing([1, 1, 3, 4])
        False

    .. versionadded:: 2.0.0
    )r+   r^   r   rO   s    r@   r6   r6     r   rA   c                 ,    t          | t                    S )a  
    Checks if `value` is a string.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a string.

    Example:

        >>> is_string('')
        True
        >>> is_string(1)
        False

    .. versionadded:: 1.0.0
    )rX   r{   rO   s    r@   r7   r7     r   rA   c                 ,    t          | t                    S )a1  
    Checks if `value` is a tuple.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is a tuple.

    Example:

        >>> is_tuple(())
        True
        >>> is_tuple({})
        False
        >>> is_tuple([])
        False

    .. versionadded:: 3.0.0
    )rX   rz   rO   s    r@   r8   r8     s    * eU###rA   c                 ,    | dk    ot          |           S )a  
    Checks if `value` is ``0``.

    Args:
        value (mixed): Value to check.

    Returns:
        bool: Whether `value` is ``0``.

    Example:

        >>> is_zero(0)
        True
        >>> is_zero(1)
        False

    .. versionadded:: 2.0.0
    r   )r%   rO   s    r@   r9   r9     s    & A:+*U+++rA   )r   N)E__doc__collections.abcr   r   r[   	itertoolsr   r   r^   rR   r}   r   pydashrj   helpersr   r	   r
   r   r   r   __all__rg   compiler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r<   rA   r@   <module>r      s    . - - - - - - -          				 % % % % % %     N N N N N N N N N N N N N N N N-` 
jbjnn		  6  2  2  2  2+  +  +  + \) ) )4  :# # #<  <, , ,8+ + +0# # #8> > >B8 8 864 4 4n( ( (0/ / /0$ $ $,  0+ + +41 1 1:$ $ $07 7 7<  B  <# # #0& & &D +/UPU ; ; ; ;|  8     0* * *0  ,E E ED+ + +4/ / /0* * *0% % %2" " ",+ + +,+ + +," " ",$ $ $0, , , , ,rA   