a
    jDf                     @  s  U d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	 d dl
mZ d dlmZmZmZmZ d dlZd dlmZ d dlmZmZ erejdkrd d	lmZ nd d	lmZ d d
lmZ zd dlmZ d dl m!Z! W n" e"y   eZeZ!de#d< Y n0 d dlm$Z$m%Z% edZ&edZ'edZ(ed?ddddddZ)dddddZ*dddd d!Z+d"d#dd$d%Z,dd&dd'd(Z-dd)dd*d+Z.d,d,d-d.d/d0d1Z/d@d,d,d-d3d4d5d6Z0d7d8dd9d:d;d<Z1G d=d> d>Z2dS )A    )annotationsN)HashableIterableIteratorMapping)	lru_cache)TYPE_CHECKINGAnyTypeVarcast)Version)ErrorOptionsWithWarn	_DimsLike)   
   )	TypeGuard)NDArray)Array)DaskCollectionr	   r   )_Dim	duckarrayKVTstrz
str | Nonebool)module
minversionreturnc                 C  s<   t j| du rdS |dur8t j| }t|t|kS dS )a_  Checks whether a module is installed without importing it.

    Use this for a lightweight check and lazy imports.

    Parameters
    ----------
    module : str
        Name of the module.
    minversion : str, optional
        Minimum version of the module

    Returns
    -------
    available : bool
        Whether the module is installed.
    NFT)	importlibutil	find_specmetadataversionr   )r   r   r#    r$   d/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/xarray/namedarray/utils.pymodule_available&   s    r&   objectzTypeGuard[DaskCollection])xr   c                 C  s    t drddlm} || S dS )NZdaskr   )is_dask_collectionF)r&   	dask.baser)   )r(   r)   r$   r$   r%   r)   C   s    r)   zTypeGuard[duckarray[Any, Any]])valuer   c                 C  sL   t | tjrdS t| doJt| doJt| doJt| drBt| dpJt| dS )NTndimshapedtypeZ__array_function__Z__array_ufunc__Z__array_namespace__)
isinstancenpZndarrayhasattrr+   r$   r$   r%   is_duck_arrayM   s    
r3   zduckarray[Any, Any]zTypeGuard[DaskArray]c                 C  s   t | ot| S N)r3   r)   )r(   r$   r$   r%   is_duck_dask_array]   s    r5   zNDArray[np.object_]c                 C  s   t jdtd}| |d< |S )z@Given a value, wrap it in a 0-D numpy.ndarray with dtype=object.r$   )r.   )r0   emptyr'   )r+   resultr$   r$   r%   to_0d_object_arraya   s    r8   zTypeGuard[Mapping[Any, Any]]c                 C  s   t | dot | dS )Nkeys__getitem__)r1   r2   r$   r$   r%   is_dict_likej   s    r;   zIterable[_Dim]r   r   )supplied_dimsdimsmissing_dimsr   c                   s   |dkr>dd | D }|t    }r:td| d  | S |dkrt | t    }rptd| d    fdd| D S |d	kr fd
d| D S td| ddS )a  Depending on the setting of missing_dims, drop any dimensions from supplied_dims that
    are not present in dims.

    Parameters
    ----------
    supplied_dims : Iterable of Hashable
    dims : Iterable of Hashable
    missing_dims : {"raise", "warn", "ignore"}
    raisec                 S  s   h | ]}|d ur|qS .r$   .0valr$   r$   r%   	<setcomp>~       z$drop_missing_dims.<locals>.<setcomp>zDimensions z' do not exist. Expected one or more of warnc                   s    g | ]}| v s|d u r|qS r@   r$   rA   r=   r$   r%   
<listcomp>   rE   z%drop_missing_dims.<locals>.<listcomp>ignorec                   s    g | ]}| v s|d u r|qS r@   r$   rA   rG   r$   r%   rH      rE   zUnrecognised option z for missing_dims argumentN)set
ValueErrorwarningsrF   )r<   r=   r>   Zsupplied_dims_setinvalidr$   rG   r%   drop_missing_dimsn   s$    
rN   r?   zIterator[_Dim])dims_supplieddims_allr>   r   c                 #  s   d v rt |}tt|t|kr,tdt  ddkrFtd fdd|D }t ||}|D ]}|du r|E dH  qh|V  qhn:t ||}t|t|A rt  d| d	|E dH  dS )
z
    Resolves a supplied list containing an ellipsis representing other items, to
    a generator with the 'realized' list of all items
    .z&Cannot use ellipsis with repeated dims   zMore than one ellipsis suppliedc                   s   g | ]}| vr|qS r$   r$   )rB   drO   r$   r%   rH      rE   zinfix_dims.<locals>.<listcomp>Nz must be a permuted list of z, unless `...` is included)listlenrJ   rK   countrN   )rO   rP   r>   Zdims_all_listZ
other_dimsZexisting_dimsrR   r$   rS   r%   
infix_dims   s$    	
rW   zMapping[Any, T] | NonezMapping[str, T]zMapping[Hashable, T])
pos_kwargs	kw_kwargs	func_namer   c                 C  sP   | d u s| i kr"t tttf |S t| s:td| d|rLtd| | S )Nzthe first argument to .z must be a dictionaryz9cannot specify both keyword and positional arguments to .)r   r   r   r   r;   rK   )rX   rY   rZ   r$   r$   r%   either_dict_or_kwargs   s    r[   c                   @  sf   e Zd ZU dZdZded< ddddZddd	d
ZdddddZddddZ	ddddZ
dS )
ReprObjectzDObject that prints as the given value, for use with sentinel values._valuer   r^   r2   c                 C  s
   || _ d S r4   r]   )selfr+   r$   r$   r%   __init__   s    zReprObject.__init__)r   c                 C  s   | j S r4   r]   r_   r$   r$   r%   __repr__   s    zReprObject.__repr__zReprObject | Anyr   )otherr   c                 C  s   t |tr| j|jkS dS )NF)r/   r\   r^   )r_   rc   r$   r$   r%   __eq__   s    zReprObject.__eq__intc                 C  s   t t| | jfS r4   )hashtyper^   ra   r$   r$   r%   __hash__   s    zReprObject.__hash__r'   c                 C  s   ddl m} |t| | jfS )Nr   )normalize_token)r*   ri   rg   r^   )r_   ri   r$   r$   r%   __dask_tokenize__   s    zReprObject.__dask_tokenize__N)__name__
__module____qualname____doc__	__slots____annotations__r`   rb   rd   rh   rj   r$   r$   r$   r%   r\      s   
r\   )N)r?   )3
__future__r   r   sysrL   collections.abcr   r   r   r   	functoolsr   typingr   r	   r
   r   numpyr0   Zpackaging.versionr   Zxarray.namedarray._typingr   r   version_infor   Ztyping_extensionsZnumpy.typingr   Zdask.array.corer   Z	DaskArrayZdask.typingr   ImportErrorrp   r   r   r   r   r   r&   r)   r3   r5   r8   r;   rN   rW   r[   r\   r$   r$   r$   r%   <module>   sH   

	, 