
    ,                         S r SSKJr  SSKJrJr  SSKJr  SSKJ	r	J
r
Jr  SSKJrJr  SSKJrJr  Sr " S	 S
\5      r " S S\" \\5      5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)a  
Key bindings registry.

A `Registry` object is a container that holds a list of key bindings. It has a
very efficient internal data structure for checking which key bindings apply
for a pressed key.

Typical usage::

    r = Registry()

    @r.add_binding(Keys.ControlX, Keys.ControlC, filter=INSERT)
    def handler(event):
        # Handle ControlX-ControlC key sequence.
        pass


It is also possible to combine multiple registries. We do this in the default
key bindings. There are some registries that contain Emacs bindings, while
others contain the Vi bindings. They are merged together using a
`MergedRegistry`.

We also have a `ConditionalRegistry` object that can enable/disable a group of
key bindings at once.
    )unicode_literals)ABCMetaabstractmethod)SimpleCache)	CLIFilterto_cli_filterNever)KeyKeys)	text_typewith_metaclass)BaseRegistryRegistryConditionalRegistryMergedRegistryc                   .    \ rS rSrSrSS jrS rS rSrg)	_Binding+   z
(Immutable binding class.)
Nc                    [        U[        5      (       d   e[        U5      (       d   e[        U[        5      (       d   e[        U[        5      (       d   e[        U5      (       d   eXl        X l        X0l        X@l        XPl        g N)	
isinstancetuplecallabler   keyshandlerfiltereagersave_before)selfr   r   r   r   r   s         6lib/third_party/prompt_toolkit/key_binding/registry.py__init___Binding.__init__/   sw    $&&&&    &),,,,%++++$$$$	
&    c                 $    U R                  U5      $ r   )r   )r   events     r    call_Binding.call<   s    ||E""r#   c                 n    U R                   R                  < SU R                  < SU R                  < S3$ )Nz(keys=z
, handler=))	__class____name__r   r   r   s    r    __repr___Binding.__repr__?   s%    NN##TYY> 	>r#   )r   r   r   r   r   )NNN)	r+   
__module____qualname____firstlineno____doc__r!   r&   r-   __static_attributes__ r#   r    r   r   +   s    '#>r#   r   c                   <    \ rS rSrSrSr\S 5       r\S 5       rSr	g)r   D   z
Interface for a Registry.
r   c                     g r   r4   r   r   s     r    get_bindings_for_keys"BaseRegistry.get_bindings_for_keysJ       r#   c                     g r   r4   r8   s     r    get_bindings_starting_with_keys,BaseRegistry.get_bindings_starting_with_keysN   r;   r#   r4   N)
r+   r/   r0   r1   r2   _versionr   r9   r=   r3   r4   r#   r    r   r   D   s4     H   r#   r   c                   <    \ rS rSrSrS rS rS rS rS r	S r
S	rg
)r   V   z
Key binding registry.
c                 X    / U l         [        SS9U l        [        SS9U l        SU l        g )Ni'  )maxsizei  r   )key_bindingsr   _get_bindings_for_keys_cache&_get_bindings_starting_with_keys_cacher?   r,   s    r    r!   Registry.__init__Z   s+    ,7,F)6A$6O3r#   c                     U =R                   S-  sl         U R                  R                  5         U R                  R                  5         g )N   )r?   rE   clearrF   r,   s    r    _clear_cacheRegistry._clear_cache`   s4    ))//13399;r#   c                   ^ ^^^^ [        UR                  SS5      5      m[        UR                  SS5      5      mUR                  SS 5      m[        UR                  SS5      5        U(       a   eT(       d   e[        S T 5       5      (       d   S	5       e[        T5      (       d   e[	        T[
        5      (       a  S
 nU$ UUUUU 4S jnU$ )av  
Decorator for annotating key bindings.

:param filter: :class:`~prompt_toolkit.filters.CLIFilter` to determine
    when this key binding is active.
:param eager: :class:`~prompt_toolkit.filters.CLIFilter` or `bool`.
    When True, ignore potential longer matches when this key binding is
    hit. E.g. when there is an active eager key binding for Ctrl-X,
    execute the handler immediately and ignore the key binding for
    Ctrl-X Ctrl-E of which it is a prefix.
:param save_before: Callable that takes an `Event` and returns True if
    we should save the current buffer, before handling the event.
    (That's the default.)
r   Tr   Fr   c                     gNTr4   )es    r    <lambda>&Registry.add_binding.<locals>.<lambda>v   s    $r#   invalidate_uic              3   N   #    U  H  n[        U[        [        45      v   M     g 7fr   )r   r
   r   ).0ks     r    	<genexpr>'Registry.add_binding.<locals>.<genexpr>{   s     ADq:a#y!122Ds   #%zBKey bindings should consist of Key and string (unicode) instances.c                     U $ r   r4   )funcs    r    	decorator'Registry.add_binding.<locals>.decorator   s    r#   c           
      t   > TR                   R                  [        TU TTTS95        TR                  5         U $ )N)r   r   r   )rD   appendr   rK   )rZ   r   r   r   r   r   s    r    r[   r\      s=    !!((T4e)467 !!#r#   )r   popallr   r   r	   )r   r   kwargsr[   r   r   r   s   ``  @@@r    add_bindingRegistry.add_bindinge   s     vzz(D9:fjj%89jj?fjj$78ztADAAA 	QP	QA$$$$fe$$   r#   c                     [        U5      (       d   eU R                   H@  nUR                  U:X  d  M  U R                  R                  U5        U R	                  5           g   [        SU< 35      e)z
Remove a key binding.

This expects a function that was given to `add_binding` method as
parameter. Raises `ValueError` when the given function was not
registered before.
NzBinding not found: )r   rD   r   removerK   
ValueError)r   functionbs      r    remove_bindingRegistry.remove_binding   sd     !!!!""AyyH$!!((+!!#	 # H?@@r#   c                 L   ^ ^ UU 4S jnT R                   R                  TU5      $ )z
Return a list of key bindings that can handle this key.
(This return also inactive bindings, so the `filter` still has to be
called, for checking it.)

:param keys: tuple of keys.
c                    > / n TR                    H  n[        T5      [        UR                  5      :X  d  M'  SnSn[        UR                  T5       H=  u  pEXE:w  a  U[        R
                  :w  a  Sn  OU[        R
                  :X  d  M8  US-  nM?     U(       d  M  U R                  X145        M     [        U S S9n U  Vs/ s H  ofS   PM	     sn$ s  snf )NTr   FrI   c                     U S   * $ )Nr   r4   )items    r    rQ   =Registry.get_bindings_for_keys.<locals>.get.<locals>.<lambda>   s
    d1gXr#   )key)rD   lenr   zipr   Anyr^   sorted)	resultrh   match	any_countijrn   r   r   s	          r    get+Registry.get_bindings_for_keys.<locals>.get   s    F&&t9AFF+ E !I #AFFD 16a488m$)E!=%NI !2 uyn5 '" F(=>F(./G///s    C)rE   rz   r   r   rz   s   `` r    r9   Registry.get_bindings_for_keys   s#    	0. 0044T3??r#   c                 L   ^ ^ UU 4S jnT R                   R                  TU5      $ )a  
Return a list of key bindings that handle a key sequence starting with
`keys`. (It does only return bindings for which the sequences are
longer than `keys`. And like `get_bindings_for_keys`, it also includes
inactive bindings.)

:param keys: tuple of keys.
c                  .  > / n TR                    H  n[        T5      [        UR                  5      :  d  M'  Sn[        UR                  T5       H$  u  p4X4:w  d  M  U[        R
                  :w  d  M"  Sn  O   U(       d  Mp  U R                  U5        M     U $ )NTF)rD   rq   r   rr   r   rs   r^   )ru   rh   rv   rx   ry   r   r   s        r    rz   5Registry.get_bindings_starting_with_keys.<locals>.get   sy    F&&t9s166{* E #AFFD 16a488m$)E! !2 ua( ' Mr#   )rF   rz   r|   s   `` r    r=   (Registry.get_bindings_starting_with_keys   s#    	 ::>>tSIIr#   )rE   rF   r?   rD   N)r+   r/   r0   r1   r2   r!   rK   rb   ri   r9   r=   r3   r4   r#   r    r   r   V   s*    <
(TA&@BJr#   r   c                   \    \ rS rSrSrS rS rS rS r\	S 5       r
\	S 5       rS	 rS
 rSrg)_AddRemoveMixin   z9
Common part for ConditionalRegistry and MergedRegistry.
c                 N    [        5       U l        S U l        [        5       U l        g r   )r   
_registry2_last_version_extra_registryr,   s    r    r!   _AddRemoveMixin.__init__   s    "*!  (zr#   c                     [         er   )NotImplementedErrorr,   s    r    _update_cache_AddRemoveMixin._update_cache   s    !!r#   c                 :    U R                   R                  " U0 UD6$ r   )r   rb   r   rV   kws      r    rb   _AddRemoveMixin.add_binding   s    ##//9b99r#   c                 :    U R                   R                  " U0 UD6$ r   )r   ri   r   s      r    ri   _AddRemoveMixin.remove_binding   s    ##22A<<<r#   c                 N    U R                  5         U R                  R                  $ r   )r   r   rD   r,   s    r    rD   _AddRemoveMixin.key_bindings   s    +++r#   c                 :    U R                  5         U R                  $ r   )r   r   r,   s    r    r?   _AddRemoveMixin._version   s    !!!r#   c                 Z    U R                  5         U R                  R                  " U0 UD6$ r   )r   r   r9   r   ar   s      r    r9   %_AddRemoveMixin.get_bindings_for_keys  s(    44a>2>>r#   c                 Z    U R                  5         U R                  R                  " U0 UD6$ r   )r   r   r=   r   s      r    r=   /_AddRemoveMixin.get_bindings_starting_with_keys  s(    >>HRHHr#   )r   r   r   N)r+   r/   r0   r1   r2   r!   r   rb   ri   propertyrD   r?   r9   r=   r3   r4   r#   r    r   r      sN    *":=
 , , " "?Ir#   r   c                   (    \ rS rSrSrSS jrS rSrg)r   i  a  
Wraps around a `Registry`. Disable/enable all the key bindings according to
the given (additional) filter.::

    @Condition
    def setting_is_true(cli):
        return True  # or False

    registy = ConditionalRegistry(registry, setting_is_true)

When new key bindings are added to this object. They are also
enable/disabled according to the given `filter`.

:param registries: List of `Registry` objects.
:param filter: `CLIFilter` object.
Nc                     U=(       d
    [        5       n[        U[        5      (       d   e[        R	                  U 5        Xl        [        U5      U l        g r   )r   r   r   r   r!   registryr   r   )r   r   r   s      r    r!   ConditionalRegistry.__init__  s@    )xz(L1111  & #F+r#   c                    U R                   R                  U R                  R                  4nU R                  U:w  a  [	        5       nU R                   U R                  4 H{  nUR
                   Hh  nUR
                  R                  [        UR                  UR                  U R                  UR                  -  UR                  UR                  S95        Mj     M}     X l        Xl        gg)z?If the original registry was changed. Update our copy version. )r   r   r   r   r   N)r   r?   r   r   r   rD   r^   r   r   r   r   r   r   r   )r   expected_version	registry2regrh   s        r    r   !ConditionalRegistry._update_cache%  s     MM22D4H4H4Q4QR!11 
I t';';<))A**11 !"$%II#';;#9"#''()78 * = (O!1 2r#   )r   r   r   r   rO   r+   r/   r0   r1   r2   r!   r   r3   r4   r#   r    r   r     s     ,2r#   r   c                   $    \ rS rSrSrS rS rSrg)r   i;  z
Merge multiple registries of key bindings into one.

This class acts as a proxy to multiple `Registry` objects, but behaves as
if this is just one bigger `Registry`.

:param registries: List of `Registry` objects.
c                 l    [        S U 5       5      (       d   e[        R                  U 5        Xl        g )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7fr   )r   r   rU   rs     r    rW   *MergedRegistry.__init__.<locals>.<genexpr>E  s     C
1:a..
s   )r`   r   r!   
registries)r   r   s     r    r!   MergedRegistry.__init__D  s,    C
CCCCC  &$r#   c                    [        S U R                   5       5      U R                  R                  4-   nU R                  U:w  a~  [        5       nU R                   H(  nUR                  R                  UR                  5        M*     UR                  R                  U R                  R                  5        X l        Xl        gg)zK
If one of the original registries was changed. Update our merged
version.
c              3   8   #    U  H  oR                   v   M     g 7fr   )r?   r   s     r    rW   /MergedRegistry._update_cache.<locals>.<genexpr>Q  s     6o**os   N)	r   r   r   r?   r   r   rD   extendr   )r   r   r   r   s       r    r   MergedRegistry._update_cacheK  s     6doo66!!**-. 	 !11 
I&&--c.>.>? ' ""))$*>*>*K*KL'O!1 2r#   )r   r   r   Nr   r4   r#   r    r   r   ;  s    %2r#   r   N)r2   
__future__r   abcr   r   prompt_toolkit.cacher   prompt_toolkit.filtersr   r   r	   prompt_toolkit.keysr
   r   sixr   r   __all__objectr   r   r   r   r   r   r4   r#   r    <module>r      s   2 ( ' , B B ) )>v >2>'62 $CJ| CJL,Il ,I^-2/ -2`#2_ #2r#   