B
    "ec!                 @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZ d dlmZ ddddd	d
dddddddddgZdejkZedddZG dd dee ZG dd ded ZG dd de
eef Ze ZeedddZedddZedd d
Zedd!d"Z edd#d	Z!edd$dZ"edd%dZ#edd&dZ$ed'Z%ee% ee ee%ddf d(d)dZ&eeg ef ef ed*d+dZ'eeg ef ef ed*d,dZ(eeg e)f e)f Z*e*e)d*d-dZ+d0ee ed.d/dZ,dS )1    N)deque)
CallableContextManagerDequeDict	GeneratorGenericListOptionalTypeVarUnion)wcwidthEventDummyContext
get_cwidthsuspend_to_background_supportedis_conemu_ansi
is_windowsin_main_threadget_bell_environment_variableget_term_environment_variabletake_using_weightsto_strto_intAnyFloatto_floatis_dumb_terminalzsphinx.ext.autodoc_SenderT)Z	covariantc               @   s   e Zd ZdZdeeeegdf  ddddZddddZddd	d
Z	eegdf ddddZ
eegdf ddddZeegdf ddddZeegdf ddddZdS )r   a  
    Simple event to which event handlers can be attached. For instance::

        class Cls:
            def __init__(self):
                # Define event. The first parameter is the sender.
                self.event = Event(self)

        obj = Cls()

        def handler(sender):
            pass

        # Add event handler by using the += operator.
        obj.event += handler

        # Fire event.
        obj.event()
    N)senderhandlerreturnc             C   s    || _ g | _|d k	r| |7 } d S )N)r   	_handlers)selfr   r    r#   3lib/python3.7/site-packages/prompt_toolkit/utils.py__init__C   s    zEvent.__init__)r    c             C   s   x| j D ]}|| j qW dS )zFire event.N)r!   r   )r"   r   r#   r#   r$   __call__L   s    zEvent.__call__c             C   s
   |   dS )z!Alias for just calling the event.Nr#   )r"   r#   r#   r$   fireQ   s    z
Event.fire)r   r    c             C   s   | j | dS )z
        Add another handler to this callback.
        (Handler should be a callable that takes exactly one parameter: the
        sender object.)
        N)r!   append)r"   r   r#   r#   r$   add_handlerU   s    zEvent.add_handlerc             C   s   || j kr| j | dS )z6
        Remove a handler from this callback.
        N)r!   remove)r"   r   r#   r#   r$   remove_handler^   s    
zEvent.remove_handlerzEvent[_Sender]c             C   s   |  | | S )zC
        `event += handler` notation for adding a handler.
        )r)   )r"   r   r#   r#   r$   __iadd__e   s    
zEvent.__iadd__c             C   s   |  | | S )zE
        `event -= handler` notation for removing a handler.
        )r+   )r"   r   r#   r#   r$   __isub__l   s    
zEvent.__isub__)N)__name__
__module____qualname____doc__r   r
   r   r%   r&   r'   r)   r+   r,   r-   r#   r#   r#   r$   r   .   s   	c               @   s.   e Zd ZdZddddZeddddZdS )	r   z5
    (contextlib.nested is not available on Py3)
    N)r    c             C   s   d S )Nr#   )r"   r#   r#   r$   	__enter__y   s    zDummyContext.__enter__)ar    c             G   s   d S )Nr#   )r"   r3   r#   r#   r$   __exit__|   s    zDummyContext.__exit__)r.   r/   r0   r1   r2   objectr4   r#   r#   r#   r$   r   t   s   c                   s>   e Zd ZdZdZdZdd fddZeedd	d
Z	  Z
S )_CharSizesCachez"
    Cache for wcwidth sizes.
    @      N)r    c                s   t    t | _d S )N)superr%   r   _long_strings)r"   )	__class__r#   r$   r%      s    
z_CharSizesCache.__init__)stringr    c                s   t |dkrtdt|}nt fdd|D }| |< t | jkr| j}|| t | jkr|| }| kr| |= |S )N   r   c             3   s   | ]} | V  qd S )Nr#   ).0c)r"   r#   r$   	<genexpr>   s    z._CharSizesCache.__missing__.<locals>.<genexpr>)	lenmaxr   sumLONG_STRING_MIN_LENr:   r(   MAX_LONG_STRINGSpopleft)r"   r<   resultZlong_stringsZkey_to_remover#   )r"   r$   __missing__   s    
z_CharSizesCache.__missing__)r.   r/   r0   r1   rD   rE   r%   strintrH   __classcell__r#   r#   )r;   r$   r6      s
   r6   )r<   r    c             C   s   t |  S )z?
    Return width of a string. Wrapper around ``wcwidth``.
    )_CHAR_SIZES_CACHE)r<   r#   r#   r$   r      s    )r    c               C   s
   t tdS )z
    Returns `True` when the Python implementation supports
    suspend-to-background. This is typically `False' on Windows systems.
    SIGTSTP)hasattrsignalr#   r#   r#   r$   r      s    c               C   s
   t jdkS )z)
    True when we are using Windows.
    win32)sysplatformr#   r#   r#   r$   r      s    c              C   s    t jdkrddlm}  |  S dS )zS
    True when we are using Windows, but VT100 escape sequences are supported.
    rP   r   )is_win_vt100_enabledF)rQ   rR   Zprompt_toolkit.output.windows10rS   )rS   r#   r#   r$   is_windows_vt100_supported   s    
rT   c               C   s   t jdkotjdddkS )z7
    True when the ConEmu Windows console is used.
    rP   Z
ConEmuANSIZOFFZON)rQ   rR   osenvirongetr#   r#   r#   r$   r      s    c               C   s   t  jjdkS )z:
    True when the current thread is the main thread.
    Z_MainThread)	threadingZcurrent_threadr;   r.   r#   r#   r#   r$   r      s    c              C   s   t jdd} |  dkS )zD
    True if env variable is set to true (true, TRUE, TrUe, 1).
    ZPROMPT_TOOLKIT_BELLtrue)1rY   )rU   rV   rW   lower)valuer#   r#   r$   r      s    c               C   s   t jddS )z&Return the $TERM environment variable.TERM )rU   rV   rW   r#   r#   r#   r$   r      s    _T)itemsweightsr    c             c   s  t | t |kstt | dks$tg }g }x2t| |D ]$\}}|dkr8|| || q8W |} |}| sttddd | D }t | }t|}d}	xpd}
x^|
rd}
xPtt|| |D ]<\}}}|| |	| t| k r|V  ||  d7  < d}
qW qW |	d7 }	qW dS )	a  
    Generator that keeps yielding items from the items list, in proportion to
    their weight. For instance::

        # Getting the first 70 items from this generator should have yielded 10
        # times A, 20 times B and 40 times C, all distributed equally..
        take_using_weights(['A', 'B', 'C'], [5, 10, 20])

    :param items: List of items to take from.
    :param weights: Integers representing the weight. (Numbers have to be
                    integers, not floats.)
    r   z+Did't got any items with a positive weight.c             S   s   g | ]}d qS )r   r#   )r>   ir#   r#   r$   
<listcomp>  s    z&take_using_weights.<locals>.<listcomp>TFr=   N)rA   AssertionErrorzipr(   
ValueErrorrB   rangefloat)r`   ra   Zitems2Zweights2itemwZalready_takenZ
item_countZ
max_weightrb   ZaddingZitem_iZweightr#   r#   r$   r      s4    
)r\   r    c             C   s   t | rt|  S t| S dS )z$Turn callable or string into string.N)callabler   rI   )r\   r#   r#   r$   r   #  s    
c             C   s   t | rt|  S t| S dS )zTurn callable or int into int.N)rk   r   rJ   )r\   r#   r#   r$   r   +  s    
c             C   s   t | rt|  S t| S dS )z"Turn callable or float into float.N)rk   r   rh   )r\   r#   r#   r$   r   6  s    
)termr    c             C   s&   | dkrt tjddS |  dkS )z
    True if this terminal type is considered "dumb".

    If so, we should fall back to the simplest possible form of line editing,
    without cursor positioning and color support.
    Nr]   r^   )Zdumbunknown)r   rU   rV   rW   r[   )rl   r#   r#   r$   r   >  s    )N)-rU   rO   rQ   rX   collectionsr   typingr   r   r   r   r   r   r	   r
   r   r   r   __all__modulesZSPHINX_AUTODOC_RUNNINGr   r   r   rI   rJ   r6   rL   r   boolr   r   rT   r   r   r   r   r_   r   r   r   rh   r   r   r   r#   r#   r#   r$   <module>   sV   0
F)4  