o
    Nrf                     @  sv   d dl mZ d dlmZ d dlmZ d dlmZ ddgZG dd dZ	dd	 Z
edddZdd ZG dd dZd
S )    )annotations)Callable)contextmanager)ClassVarCallbackadd_callbacksc                   @  s^   e Zd ZU dZe Zded< 	dddZedd	d
Z	dd Z
dd ZdddZdddZdS )r   a  Base class for using the callback mechanism

    Create a callback with functions of the following signatures:

    >>> def start(dsk):
    ...     pass
    >>> def start_state(dsk, state):
    ...     pass
    >>> def pretask(key, dsk, state):
    ...     pass
    >>> def posttask(key, result, dsk, state, worker_id):
    ...     pass
    >>> def finish(dsk, state, failed):
    ...     pass

    You may then construct a callback object with any number of them

    >>> cb = Callback(pretask=pretask, finish=finish)

    And use it either as a context manager over a compute/get call

    >>> with cb:            # doctest: +SKIP
    ...     x.compute()

    Or globally with the ``register`` method

    >>> cb.register()
    >>> cb.unregister()

    Alternatively subclass the ``Callback`` class with your own methods.

    >>> class PrintKeys(Callback):
    ...     def _pretask(self, key, dask, state):
    ...         print("Computing: {0}!".format(repr(key)))

    >>> with PrintKeys():   # doctest: +SKIP
    ...     x.compute()
    z*ClassVar[set[tuple[Callable | None, ...]]]activeNc                 C  s:   |r|| _ |r
|| _|r|| _|r|| _|r|| _d S d S N_startZ_start_stateZ_pretaskZ	_posttaskZ_finish)selfstartZstart_stateZpretaskZposttaskfinish r   W/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/dask/callbacks.py__init__4   s   
zCallback.__init__returntuple[Callable | None, ...]c                   s   g d}t  fdd|D S )Nr
   c                 3  s    | ]	}t  |d V  qd S r	   )getattr.0ir   r   r   	<genexpr>E   s    z%Callback._callback.<locals>.<genexpr>)tuple)r   fieldsr   r   r   	_callbackB   s   zCallback._callbackc                 C  s   t | | _| j  | S r	   )r   _cm	__enter__r   r   r   r   r   G   s   

zCallback.__enter__c                 G  s   | j j|  d S r	   )r   __exit__)r   argsr   r   r   r   L   s   zCallback.__exit__Nonec                 C     t j| j d S r	   )r   r   addr   r   r   r   r   registerO      zCallback.registerc                 C  r"   r	   )r   r   remover   r   r   r   r   
unregisterR   r%   zCallback.unregister)NNNNN)r   r   )r   r!   )__name__
__module____qualname____doc__setr   __annotations__r   propertyr   r   r   r$   r'   r   r   r   r   r   
   s   
 '

c                 C  s   | rdd t |  D S g dS )z>Take an iterable of callbacks, return a list of each callback.c                 S  s   g | ]	}d d |D qS )c                 S  s   g | ]}|r|qS r   r   r   r   r   r   
<listcomp>Y       z/unpack_callbacks.<locals>.<listcomp>.<listcomp>r   )r   fr   r   r   r/   Y   s    z$unpack_callbacks.<locals>.<listcomp>)r   r   r   r   r   )zip)Zcbsr   r   r   unpack_callbacksV   s   r3   Nc                 c  sJ    | du }|rt jt } t _z| pdV  W |r| t _dS dS |r$| t _w )zAllows callbacks to work with nested schedulers.

    Callbacks will only be used by the first started scheduler they encounter.
    This means that only the outermost scheduler will use global callbacks.Nr   )r   r   r,   )	callbacksZglobal_callbacksr   r   r   local_callbacks^   s   
r5   c                 C  s&   t | tr| jS t | tr| S td)z Normalizes a callback to a tuplez.Callbacks must be either `Callback` or `tuple`)
isinstancer   r   r   	TypeError)cbr   r   r   normalize_callbackn   s
   

r9   c                   @  s(   e Zd ZdZdd Zdd Zdd ZdS )	r   a  Context manager for callbacks.

    Takes several callbacks and applies them only in the enclosed context.
    Callbacks can either be represented as a ``Callback`` object, or as a tuple
    of length 4.

    Examples
    --------
    >>> def pretask(key, dsk, state):
    ...     print("Now running {0}").format(key)
    >>> callbacks = (None, pretask, None, None)
    >>> with add_callbacks(callbacks):    # doctest: +SKIP
    ...     res.compute()
    c                 G  s"   dd |D | _ tj| j  d S )Nc                 S  s   g | ]}t |qS r   )r9   )r   cr   r   r   r/      r0   z*add_callbacks.__init__.<locals>.<listcomp>)r4   r   r   update)r   r4   r   r   r   r      s   zadd_callbacks.__init__c                 C  s   d S r	   r   r   r   r   r   r      s   zadd_callbacks.__enter__c                 C  s   | j D ]}tj| qd S r	   )r4   r   r   discard)r   typevalue	tracebackr:   r   r   r   r      s   
zadd_callbacks.__exit__N)r(   r)   r*   r+   r   r   r   r   r   r   r   r   x   s
    r	   )
__future__r   collections.abcr   
contextlibr   typingr   __all__r   r3   r5   r9   r   r   r   r   r   <module>   s    L
