U
    Q»{jEA  ã                   @  sH  d Z ddlmZ ddlmZmZmZ ddlZddlm	Z	 ddl
mZmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZ d	Zed
ed�Zeded�ZedƒZedƒZddddœdd„Zddddœdd„Z G dd„ deeef ƒZ!edddœdd„ƒZ"edd d!œd"d„ƒZ"ed
ddd#œd$d„ƒZ"d%d„ Z"d
ddd#œd&d'„Z#dS )(a’  
Cycler
======

Cycling through combinations of values, producing dictionaries.

You can add cyclers::

    from cycler import cycler
    cc = (cycler(color=list('rgb')) +
          cycler(linestyle=['-', '--', '-.']))
    for d in cc:
        print(d)

Results in::

    {'color': 'r', 'linestyle': '-'}
    {'color': 'g', 'linestyle': '--'}
    {'color': 'b', 'linestyle': '-.'}


You can multiply cyclers::

    from cycler import cycler
    cc = (cycler(color=list('rgb')) *
          cycler(linestyle=['-', '--', '-.']))
    for d in cc:
        print(d)

Results in::

    {'color': 'r', 'linestyle': '-'}
    {'color': 'r', 'linestyle': '--'}
    {'color': 'r', 'linestyle': '-.'}
    {'color': 'g', 'linestyle': '-'}
    {'color': 'g', 'linestyle': '--'}
    {'color': 'g', 'linestyle': '-.'}
    {'color': 'b', 'linestyle': '-'}
    {'color': 'b', 'linestyle': '--'}
    {'color': 'b', 'linestyle': '-.'}
é    )Úannotations)ÚHashableÚIterableÚ	GeneratorN)Úreduce)ÚproductÚcycle)ÚmulÚadd)	ÚTypeVarÚGenericÚCallableÚUnionÚDictÚListÚAnyÚoverloadÚcastz0.12.1ÚK)ÚboundÚLÚVÚUz#Cycler[K, V] | Iterable[dict[K, V]]ú*Cycler[K, V] | Iterable[dict[K, V]] | Noneúset[K])ÚleftÚrightÚreturnc                 C  s`   | g krt t| ƒƒni }|dk	r,t t|ƒƒni }t| ¡ ƒ}t| ¡ ƒ}||@ rXtdƒ‚||B S )a  
    Helper function to compose cycler keys.

    Parameters
    ----------
    left, right : iterable of dictionaries or None
        The cyclers to be composed.

    Returns
    -------
    keys : set
        The keys in the composition of the two cyclers.
    Nz"Can not compose overlapping cycles)ÚnextÚiterÚsetÚkeysÚ
ValueError)r   r   Zl_peekZr_peekZl_keyZr_key© r#   úN/var/www/html/bwave/python/venv/lib/python3.8/site-packages/cycler/__init__.pyÚ_process_keys>   s    r%   úCycler[K, V]zCycler[K, U]zCycler[K, V | U]c                   sŽ   | j |j kr.tdj| j |j @ | j |j A d�ƒ‚ttttttt	f  f |  
¡ ƒ‰ ttttttt	f  f | 
¡ ƒ‰tt‡ ‡fdd„| j D ƒƒS )aS  
    Concatenate `Cycler`\s, as if chained using `itertools.chain`.

    The keys must match exactly.

    Examples
    --------
    >>> num = cycler('a', range(3))
    >>> let = cycler('a', 'abc')
    >>> num.concat(let)
    cycler('a', [0, 1, 2, 'a', 'b', 'c'])

    Returns
    -------
    `Cycler`
        The concatenated cycler.
    zBKeys do not match:
	Intersection: {both!r}
	Disjoint: {just_one!r})ZbothZjust_onec                 3  s$   | ]}t |ˆ | ˆ|  ƒV  qd S ©N©Ú_cycler©Ú.0Úk©Z_lÚ_rr#   r$   Ú	<genexpr>t   s     zconcat.<locals>.<genexpr>)r!   r"   Úformatr   r   r   r   r   r   r   Úby_keyr   r
   )r   r   r#   r-   r$   ÚconcatX   s    
 
ýÿ""r2   c                   @  s~  e Zd ZdZdd„ ZdEddddœd	d
„Zdd„ Zeddœdd„ƒZddddœdd„Z	e
ddddœdd„ƒZdddœdd„Zddœd d!„Zd"d#d$œd%d&„Zed"d#d$œd'd(„ƒZed)dd$œd*d(„ƒZd+d(„ Zed"d#d$œd,d-„ƒZed)dd$œd.d-„ƒZd/d-„ Zd)dœd0d1„Zddd$œd2d3„Zd4dd$œd5d6„Zd7d8d$œd9d:„ZdZd;dœd<d=„Zd;dœd>d?„Zd@dœdAdB„ZeZddœdCdD„ZeZdS )FÚCycleraó  
    Composable cycles.

    This class has compositions methods:

    ``+``
      for 'inner' products (zip)

    ``+=``
      in-place ``+``

    ``*``
      for outer products (`itertools.product`) and integer multiplication

    ``*=``
      in-place ``*``

    and supports basic slicing via ``[]``.

    Parameters
    ----------
    left, right : Cycler or None
        The 'left' and 'right' cyclers.
    op : func or None
        Function which composes the 'left' and 'right' cyclers.
    c                 C  s   t | ƒS r'   )r   ©Úselfr#   r#   r$   Ú__call__“   s    zCycler.__call__Nr   zCycler[K, V] | Noner   )r   r   Úopc                 C  s€   t |tƒr t|j|j|jƒ| _n |dk	r:dd„ |D ƒ| _ng | _t |tƒr`t|j|j|jƒ| _nd| _t| j| jƒ| _|| _dS )zf
        Semi-private init.

        Do not use this directly, use `cycler` function instead.
        Nc                 S  s   g | ]}t   |¡‘qS r#   )Úcopy©r+   Úvr#   r#   r$   Ú
<listcomp>¨   s     z#Cycler.__init__.<locals>.<listcomp>)Ú
isinstancer3   Ú_leftÚ_rightÚ_opr%   Ú_keys)r5   r   r   r7   r#   r#   r$   Ú__init__–   s$    
  ÿ
  ÿzCycler.__init__c                 C  s
   || j kS r'   )r@   )r5   r,   r#   r#   r$   Ú__contains__¶   s    zCycler.__contains__r   )r   c                 C  s
   t | jƒS )z!The keys this Cycler knows about.)r    r@   r4   r#   r#   r$   r!   ¹   s    zCycler.keysr   ÚNone)ÚoldÚnewr   c                   sÎ   ˆˆ krdS ˆ | j kr2tdˆ› dˆ › dˆ › d�ƒ‚ˆ| j krXtdˆ› dˆ › dˆ› d�ƒ‚| j  ˆ¡ | j  ˆ ¡ | jdk	r–ˆ| jjkr–| j ˆˆ ¡ n4t| j	t
ƒr²| j	 ˆˆ ¡ n‡ ‡fdd„| j	D ƒ| _	dS )	a  
        Change a key in this cycler to a new name.
        Modification is performed in-place.

        Does nothing if the old key is the same as the new key.
        Raises a ValueError if the new key is already a key.
        Raises a KeyError if the old key isn't a key.
        NzCan't replace z with ú, z is already a keyz is not a keyc                   s   g | ]}ˆ |ˆ i‘qS r#   r#   )r+   Úentry©rE   rD   r#   r$   r;   à   s     z%Cycler.change_key.<locals>.<listcomp>)r@   r"   ÚKeyErrorÚremover
   r>   r!   Ú
change_keyr<   r=   r3   )r5   rD   rE   r#   rH   r$   rK   ¾   s"    	
ÿ
ÿzCycler.change_keyúIterable[V]r&   ©ÚlabelÚitrr   c                   s,   | dƒ}t ‡ fdd„|D ƒƒ|_ˆ h|_|S )aª  
        Class method to create 'base' Cycler objects
        that do not have a 'right' or 'op' and for which
        the 'left' object is not another Cycler.

        Parameters
        ----------
        label : hashable
            The property key.

        itr : iterable
            Finite length iterable of the property values.

        Returns
        -------
        `Cycler`
            New 'base' cycler.
        Nc                 3  s   | ]}ˆ |iV  qd S r'   r#   r9   ©rN   r#   r$   r/   ÷   s     z$Cycler._from_iter.<locals>.<genexpr>)Úlistr=   r@   )ÚclsrN   rO   Úretr#   rP   r$   Ú
_from_iterâ   s    zCycler._from_iterÚslice)Úkeyr   c                   s:   t ˆ tƒr.|  ¡ }tt‡ fdd„| ¡ D ƒƒS tdƒ‚d S )Nc                 3  s    | ]\}}t ||ˆ  ƒV  qd S r'   r(   ©r+   r,   r:   ©rV   r#   r$   r/   ÿ   s     z%Cycler.__getitem__.<locals>.<genexpr>z+Can only use slices with Cycler.__getitem__)r<   rU   r1   r   r
   Úitemsr"   )r5   rV   Útransr#   rX   r$   Ú__getitem__û   s    
zCycler.__getitem__z!Generator[dict[K, V], None, None]c                 c  sp   | j d kr"| jD ]}t|ƒV  qnJ| jd kr4tdƒ‚|  | j| j ¡D ]&\}}i }| |¡ | |¡ |V  qDd S )Nz=Operation cannot be None when both left and right are defined)r>   r=   Údictr?   Ú	TypeErrorÚupdate)r5   r   ÚaÚbÚoutr#   r#   r$   Ú__iter__  s    


ÿ

zCycler.__iter__zCycler[L, U]zCycler[K | L, V | U])Úotherr   c                 C  st   t | ƒt |ƒkr,tdt | ƒ› dt |ƒ› �ƒ‚ttttttf tttf f | ƒtttttf tttf f |ƒt	ƒS )z�
        Pair-wise combine two equal length cyclers (zip).

        Parameters
        ----------
        other : Cycler
        z&Can only add equal length cycles, not z and )
Úlenr"   r3   r   r   r   r   r   r   Úzip©r5   rc   r#   r#   r$   Ú__add__  s    ÿ  ýzCycler.__add__c                 C  s   d S r'   r#   rf   r#   r#   r$   Ú__mul__$  s    zCycler.__mul__Úintc                 C  s   d S r'   r#   rf   r#   r#   r$   rh   (  s    c                   sˆ   t ˆ tƒrRttttttf tttf f | ƒtttttf tttf f ˆ ƒtƒS t ˆ t	ƒr€|  
¡ }tt‡ fdd„| ¡ D ƒƒS tS dS )z¬
        Outer product of two cyclers (`itertools.product`) or integer
        multiplication.

        Parameters
        ----------
        other : Cycler or int
        c                 3  s    | ]\}}t ||ˆ  ƒV  qd S r'   r(   rW   ©rc   r#   r$   r/   >  s     z!Cycler.__mul__.<locals>.<genexpr>N)r<   r3   r   r   r   r   r   r   r   ri   r1   r   r
   rY   ÚNotImplemented)r5   rc   rZ   r#   rj   r$   rh   ,  s    	
  ý
 ÿc                 C  s   d S r'   r#   rf   r#   r#   r$   Ú__rmul__C  s    zCycler.__rmul__c                 C  s   d S r'   r#   rf   r#   r#   r$   rl   G  s    c                 C  s   | | S r'   r#   rf   r#   r#   r$   rl   K  s    c                 C  sD   t ttti}| jd kr t| jƒS t| jƒ}t| jƒ}|| j ||ƒS r'   )re   Úminr   r	   r>   rd   r=   r?   )r5   Zop_dictZl_lenZr_lenr#   r#   r$   Ú__len__N  s    



zCycler.__len__c                 C  sL   t |tƒstdƒ‚t | ¡}t||ƒ| _|| _t| _t|j|j	|jƒ| _	| S )zŠ
        In-place pair-wise combine two equal length cyclers (zip).

        Parameters
        ----------
        other : Cycler
        z"Cannot += with a non-Cycler object)
r<   r3   r]   r8   r%   r@   r=   re   r?   r>   ©r5   rc   Zold_selfr#   r#   r$   Ú__iadd__X  s    

zCycler.__iadd__zCycler[K, V] | intc                 C  sL   t |tƒstdƒ‚t | ¡}t||ƒ| _|| _t| _t|j|j	|jƒ| _	| S )zŒ
        In-place outer product of two cyclers (`itertools.product`).

        Parameters
        ----------
        other : Cycler
        z"Cannot *= with a non-Cycler object)
r<   r3   r]   r8   r%   r@   r=   r   r?   r>   ro   r#   r#   r$   Ú__imul__j  s    

zCycler.__imul__ÚobjectÚboolc                 C  sJ   t |tƒsdS t| ƒt|ƒkr"dS | j|jA r2dS tdd„ t| |ƒD ƒƒS )NFc                 s  s   | ]\}}||kV  qd S r'   r#   )r+   r_   r`   r#   r#   r$   r/   ƒ  s     z Cycler.__eq__.<locals>.<genexpr>)r<   r3   rd   r!   Úallre   rf   r#   r#   r$   Ú__eq__|  s    
zCycler.__eq__Ústrc                   sr   t dtdi}| jd krH| j ¡ ‰ t‡ fdd„| D ƒƒ}dˆ ›d|›d�S | | jd¡}d	}|j| j	|| jd
�S d S )Nú+Ú*c                 3  s   | ]}|ˆ  V  qd S r'   r#   r9   ©Zlabr#   r$   r/   ‹  s     z"Cycler.__repr__.<locals>.<genexpr>zcycler(rF   ú)ú?z({left!r} {op} {right!r}))r   r7   r   )
re   r   r>   r!   ÚpoprQ   Úgetr?   r0   r=   )r5   Zop_maprO   r7   Úmsgr#   ry   r$   Ú__repr__‡  s    

zCycler.__repr__c                 C  st   d}t | jtd�}|D ]}|d|›d�7 }qt| ƒD ]2}|d7 }|D ]}|d|| ›d�7 }qD|d7 }q4|d	7 }|S )
Nz<table>rX   z<th>z</th>z<tr>z<td>z</td>z</tr>z</table>)Úsortedr!   Úreprr   )r5   ÚoutputZsorted_keysrV   Údr,   r#   r#   r$   Ú_repr_html_’  s    
zCycler._repr_html_zdict[K, list[V]]c                 C  s>   | j }dd„ |D ƒ}| D ] }|D ]}||  || ¡ q q|S )aÝ  
        Values by key.

        This returns the transposed values of the cycler.  Iterating
        over a `Cycler` yields dicts with a single value for each key,
        this method returns a `dict` of `list` which are the values
        for the given key.

        The returned value can be used to create an equivalent `Cycler`
        using only `+`.

        Returns
        -------
        transpose : dict
            dict of lists of the values for each key.
        c                 S  s   i | ]}|t ƒ “qS r#   )rQ   r*   r#   r#   r$   Ú
<dictcomp>¶  s      z!Cycler.by_key.<locals>.<dictcomp>)r!   Úappend)r5   r!   ra   rƒ   r,   r#   r#   r$   r1      s    zCycler.by_keyc                 C  s    |   ¡ }ttdd„ | ¡ D ƒƒS )z‡
        Simplify the cycler into a sum (but no products) of cyclers.

        Returns
        -------
        simple : Cycler
        c                 s  s   | ]\}}t ||ƒV  qd S r'   r(   rW   r#   r#   r$   r/   Î  s     z"Cycler.simplify.<locals>.<genexpr>)r1   r   r
   rY   )r5   rZ   r#   r#   r$   ÚsimplifyÀ  s    zCycler.simplify)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   rA   rB   Úpropertyr!   rK   ÚclassmethodrT   r[   rb   rg   r   rh   rl   rn   rp   rq   ru   Ú__hash__r   r„   r1   Z
_transposer‡   r2   r#   r#   r#   r$   r3   w   sF     ü $
	r3   )Úargr   c                 C  s   d S r'   r#   )r�   r#   r#   r$   ÚcyclerÓ  s    r�   rL   zCycler[str, V])Úkwargsr   c                  K  s   d S r'   r#   )r‘   r#   r#   r$   r�   Ø  s    rM   c                 C  s   d S r'   r#   )rN   rO   r#   r#   r$   r�   Ý  s    c                  O  sŽ   | r|rt dƒ‚t| ƒdkr>t| d tƒs2t dƒ‚t| d ƒS t| ƒdkrRt| Ž S t| ƒdkrft dƒ‚|r‚ttdd„ | ¡ D ƒƒS t d	ƒ‚d
S )aë  
    Create a new `Cycler` object from a single positional argument,
    a pair of positional arguments, or the combination of keyword arguments.

    cycler(arg)
    cycler(label1=itr1[, label2=iter2[, ...]])
    cycler(label, itr)

    Form 1 simply copies a given `Cycler` object.

    Form 2 composes a `Cycler` as an inner product of the
    pairs of keyword arguments. In other words, all of the
    iterables are cycled simultaneously, as if through zip().

    Form 3 creates a `Cycler` from a label and an iterable.
    This is useful for when the label cannot be a keyword argument
    (e.g., an integer or a name that has a space in it).

    Parameters
    ----------
    arg : Cycler
        Copy constructor for Cycler (does a shallow copy of iterables).
    label : name
        The property key. In the 2-arg form of the function,
        the label can be any hashable object. In the keyword argument
        form of the function, it must be a valid python identifier.
    itr : iterable
        Finite length iterable of the property values.
        Can be a single-property `Cycler` that would
        be like a key change, but as a shallow copy.

    Returns
    -------
    cycler : Cycler
        New `Cycler` for the given property

    zEcycler() can only accept positional OR keyword arguments -- not both.é   r   zDIf only one positional argument given, it must be a Cycler instance.é   zdOnly a single Cycler can be accepted as the lone positional argument. Use keyword arguments instead.c                 s  s   | ]\}}t ||ƒV  qd S r'   r(   rW   r#   r#   r$   r/     s     zcycler.<locals>.<genexpr>z4Must have at least a positional OR keyword argumentsN)r]   rd   r<   r3   r)   r   r
   rY   )Úargsr‘   r#   r#   r$   r�   â  s&    &ÿÿÿc                   sN   t |tƒrB|j}t|ƒdkr(d}t|ƒ‚| ¡ ‰ ‡ fdd„|D ƒ}t | |¡S )aD  
    Create a new `Cycler` object from a property name and iterable of values.

    Parameters
    ----------
    label : hashable
        The property key.
    itr : iterable
        Finite length iterable of the property values.

    Returns
    -------
    cycler : Cycler
        New `Cycler` for the given property
    r’   z2Can not create Cycler from a multi-property Cyclerc                 3  s   | ]}|ˆ  V  qd S r'   r#   r9   ry   r#   r$   r/   ;  s     z_cycler.<locals>.<genexpr>)r<   r3   r!   rd   r"   r|   rT   )rN   rO   r!   r~   r#   ry   r$   r)   "  s    
r)   )$r‹   Ú
__future__r   Úcollections.abcr   r   r   r8   Ú	functoolsr   Ú	itertoolsr   r   Úoperatorr	   r
   Útypingr   r   r   r   r   r   r   r   r   Ú__version__r   r   r   r   r%   r2   r3   r�   r)   r#   r#   r#   r$   Ú<module>   s2   +,  ^@