
    |Le                         d dl mZmZmZ d dlmZ d dlZddlmZ ddlm	Z	 ddlm
Z
 ddlmZ dd	lmZ d
Z ej        d          Zd Zd Zd Zd Zd Zd Zd ZdS )    )print_functiondivisionabsolute_import)chainN   )py2help)parser)type_symbol_table)validate)	coretypes)dshapedshapeshas_var_dimhas_ellipsiscat_dshapes__subclasses__c                      d | D             S )zl
    Parse a bunch of datashapes all at once.

    >>> a, b = dshapes('3 * int32', '2 * var * float64')
    c                 ,    g | ]}t          |          S  )r   ).0args     Blib/python3.11/site-packages/datashader/datashape/util/__init__.py
<listcomp>zdshapes.<locals>.<listcomp>   s    (((CF3KK(((    r   )argss    r   r   r      s     )(4((((r   c                    t          | t          j                  r| S t          | t          j                  r t          j        | t          j                  }nt          | t          j	        t          j
        t          j        t          j        t          j        t          j        t          j        t          j        f          rt          j        |           }ngt          | t          j                  r| }nJt          | t$          t&          f          rt          j        |  }nt)          dt+          |           z            t-          |           |S )z
    Parse a datashape. For a thorough description see
    http://blaze.pydata.org/docs/datashape.html

    >>> ds = dshape('2 * int32')
    >>> ds[1]
    ctype("int32")
    z+Cannot create dshape from object of type %s)
isinstancer   	DataShaper   	_strtypesr	   parser
   symCTypeStringRecordJSONDateTimeDateTimeUnitMonolisttuple	TypeErrortyper   )odss     r   r   r      s    !Y()) !W&'' Q\!.233	A	)9!().!		8J!( 
) 
) 
Q  ##	Ay~	&	& Q	Ae}	%	% Q !$EQOPPPRLLLIr   c           	         t          |           dk    rt          d          t          |           dk    r| d         S t          j        | d         d                   }| d         dd         }| dd         D ]K}|t          j        |d                   z  }|dd         |k    rt          d|d|dd         d          Lt	          j        t	          j        |          gt          |          z    S )a  
    Concatenates a list of dshapes together along
    the first axis. Raises an error if there is
    a mismatch along another axis or the measures
    are different.

    Requires that the leading dimension be a known
    size for all data shapes.
    TODO: Relax this restriction to support
          streaming dimensions.

    >>> cat_dshapes(dshapes('10 * int32', '5 * int32'))
    dshape("15 * int32")
    r   z+Cannot concatenate an empty list of dshapes   NzHThe datashapes to concatenate much all match after the first dimension (z vs ))len
ValueErroroperatorindexr   r   Fixedr+   )dslistouter_dim_sizeinner_dsr0   s       r   r   r   :   s    6{{aFGGG	V		ay^F1IaL11Nay}HQRRj 2 2(.A///abb6X*  (xxABB1 2 2 2 
 !@!@ ADNN RSSr   c                       |          r|gS t          |t          j                  r%t          j         fd|j        D                       S t          |t          j                  r%t          j         fd|j        D                       S t          |t          t          f          r t          j         fd|D                       S dS )a   Collect terms in expression that match predicate

    >>> from datashader.datashape import Unit, dshape
    >>> predicate = lambda term: isinstance(term, Unit)
    >>> dshape = dshape('var * {value: int64, loc: 2 * int32}')
    >>> sorted(set(collect(predicate, dshape)), key=str)
    [Fixed(val=2), ctype("int32"), ctype("int64"), Var()]
    >>> from datashader.datashape import var, int64
    >>> sorted(set(collect(predicate, [var, int64])), key=str)
    [ctype("int64"), Var()]
    c              3   8   K   | ]}t          |          V  d S Ncollectr   typpreds     r   	<genexpr>zcollect.<locals>.<genexpr>i   s-      "L"L#74#5#5"L"L"L"L"L"Lr   c              3   8   K   | ]}t          |          V  d S r>   r?   rA   s     r   rD   zcollect.<locals>.<genexpr>k   s-      "Q"Q#74#5#5"Q"Q"Q"Q"Q"Qr   c              3   8   K   | ]}t          |          V  d S r>   r?   )r   itemrC   s     r   rD   zcollect.<locals>.<genexpr>m   s-      "H"H474#6#6"H"H"H"H"H"Hr   N)
r   r   r$   r   from_iterabletypesr*   
parametersr+   r,   )rC   exprs   ` r   r@   r@   Z   s     tDzz v$	()) M""L"L"L"L"L"L"LLLL$	'' R""Q"Q"Q"Q"Q"Q"QQQQ$u&& I""H"H"H"H4"H"H"HHHHI Ir   c                 N    t          t          j        t          j        f|           S )zReturns True if datashape has a variable dimension

    Note currently treats variable length string as scalars.

    >>> has_var_dim(dshape('2 * int32'))
    False
    >>> has_var_dim(dshape('var * 2 * int32'))
    True
    )hasr   EllipsisVarr0   s    r   r   r   p   s     	"IM2B777r   c                     t          |           rdS t          |t          j                  r t           fd|j        D                       S t          |t          j                  r t           fd|j        D                       S t          |t          t          f          rt           fd|D                       S dS )NTc              3   8   K   | ]}t          |          V  d S r>   rM   )r   trB   s     r   rD   zhas.<locals>.<genexpr>   s+      1113sA;;111111r   c              3   8   K   | ]}t          |          V  d S r>   rS   )r   prB   s     r   rD   zhas.<locals>.<genexpr>   s+      6613sA;;666666r   c              3   8   K   | ]}t          |          V  d S r>   rS   )r   rG   rB   s     r   rD   zhas.<locals>.<genexpr>   s+      11d3sD>>111111r   F)	r   r   r$   anyrI   r*   rJ   r+   r,   )rB   r0   s   ` r   rM   rM   }   s    "c t"i&'' 21111111111"in%% 76666666666"tUm$$ 21111b1111115r   c                 6    t          t          j        |           S )zReturns True if the datashape has an ellipsis

    >>> has_ellipsis(dshape('2 * int'))
    False
    >>> has_ellipsis(dshape('... * int'))
    True
    )rM   r   rN   rP   s    r   r   r      s     y!2&&&r   )
__future__r   r   r   	itertoolsr   r6    r   r	   r
   
validationr   r   __all__methodcaller
subclassesr   r   r   r@   r   rM   r   r   r   r   <module>ra      s-   @ @ @ @ @ @ @ @ @ @                                ! ! ! ! ! !       L"X"#344
) ) )  8T T T@I I I,
8 
8 
8	 	 	' ' ' ' 'r   