B
    F.\@                 @   s`   d dl mZmZmZ d dlZddlmZmZ dZefddZ	dd	 Z
d
d Zdd Zdd ZdS )    )print_functiondivisionabsolute_importN   )ensure_bytesnbytesi   c          	   C   s   | s| S t tt| |kr| S g }x| D ]}t||krt|ttfrNt|}y
|j}W n tk
rp   d}Y nX xFt	dt|| || D ]}|
|||||    qW q(|
| q(W |S )a  
    Split a list of frames into a list of frames of maximum size

    This helps us to avoid passing around very large bytestrings.

    Examples
    --------
    >>> frame_split_size([b'12345', b'678'], n=3)  # doctest: +SKIP
    [b'123', b'45', b'678']
       r   )maxmapr   
isinstancebytes	bytearray
memoryviewitemsizeAttributeErrorrangeappend)framesnoutframer   i r   9lib/python3.7/site-packages/distributed/protocol/utils.pyframe_split_size
   s"    


 r   c             C   s   t | d }|s|S t|ttt|ks.ttdd t||D rJ|S |ddd }|ddd }g }x|r| }g }xd|r| }t||kr|| |t|8 }q~t	|}||d|  |||d  d}q~W |d
tt| qlW |S )z Merge frames into original lengths

    Examples
    --------
    >>> merge_frames({'lengths': [3, 3]}, [b'123456'])
    [b'123', b'456']
    >>> merge_frames({'lengths': [6]}, [b'123', b'456'])
    [b'123456']
    lengthsc             s   s   | ]\}}t ||kV  qd S )N)len).0flr   r   r   	<genexpr><   s    zmerge_frames.<locals>.<genexpr>Nr       )listsumr
   r   AssertionErrorallzippopr   r   joinr   )headerr   r   r   r   Lr   Zmvr   r   r   merge_frames+   s.    

r,   c             C   s8   dd | D }t dt| gdd | D  }d|S )Nc             S   s   g | ]}t |qS r   )r   )r   r   r   r   r   
<listcomp>U   s    z'pack_frames_prelude.<locals>.<listcomp>Qc             S   s   g | ]}t d t|qS )r.   )structpackr   )r   r   r   r   r   r-   W   s    r"   )r/   r0   r   r)   )r   r   r   r   r   pack_frames_preludeT   s    r1   c             C   s*   t | g}t| tst| } d||  S )z Pack frames into a byte-like object

    This prepends length information to the front of the bytes-like object

    See Also
    --------
    unpack_frames
    r"   )r1   r   r#   r)   )r   Zpreluder   r   r   pack_frames[   s    	

r2   c             C   s   t d| dd \}g }d|d  }xXt|D ]L}t d| |d d |d d  \}| |||  }|| ||7 }q0W |S )z Unpack bytes into a sequence of frames

    This assumes that length information is at the front of the bytestring,
    as performed by pack_frames

    See Also
    --------
    pack_frames
    r.   N   r   r   )r/   Zunpackr   r   )bZn_framesr   startr   lengthr   r   r   r   unpack_framesl   s    
&
r7   )Z
__future__r   r   r   r/   Zutilsr   r   ZBIG_BYTES_SHARD_SIZEr   r,   r1   r2   r7   r   r   r   r   <module>   s   !)