o
    uyii                     @  st   d dl mZ d dlmZmZmZmZmZmZ edZ	G dd dee	 Z
G dd dee	 ZG dd	 d	ee	 Zd
S )    )annotations)CallableGenericIterableListOptionalTypeVarTc                   @  s4   e Zd ZdddZdddZdddZdddZdS )Bintarget_weightintreturnNonec                 C  s   d| _ || _g | _d S )Nr   )
bin_weightr   items)selfr    r   ^/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/pyiceberg/utils/bin_packing.py__init__       
zBin.__init__c                 C  s   | j S N)r   r   r   r   r   weight%   s   z
Bin.weightr   boolc                 C  s   | j | | jkS r   )r   r   )r   r   r   r   r   can_add(   s   zBin.can_additemr	   c                 C  s   |  j |7  _ | j| d S r   )r   r   append)r   r   r   r   r   r   add+   s   zBin.addN)r   r   r   r   )r   r   )r   r   r   r   )r   r	   r   r   r   r   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r
      s
    


r
   c                   @  sL   e Zd ZU ded< 	dd ddZd!ddZd"ddZd#ddZd$ddZdS )%PackingIteratorzList[Bin[T]]binsFr   Iterable[T]r   r   lookbackweight_funcCallable[[T], int]largest_bin_firstr   r   r   c                 C  s,   t || _|| _|| _|| _|| _g | _d S r   )iterr   r   r$   r%   r'   r"   )r   r   r   r$   r%   r'   r   r   r   r   3   s   

zPackingIterator.__init__PackingIterator[T]c                 C  s   | S )z1Return an iterator for the PackingIterator class.r   r   r   r   r   __iter__B   s   zPackingIterator.__iter__List[T]c                 C  s   	 z;t | j}| |}| |}|dur||| nt| j}||| | j| t	| j| j
kr;|  jW S W n	 tyE   Y nw qt	| jdkrQt |  jS )zCReturn the next item when iterating over the PackingIterator class.TNr   )nextr   r%   find_binr   r
   r   r"   r   lenr$   
remove_binStopIteration)r   r   r   bin_r   r   r   __next__F   s(   




zPackingIterator.__next__r   Optional[Bin[T]]c                 C  s"   | j D ]}||r|  S qd S r   )r"   r   )r   r   r1   r   r   r   r-   ^   s
   

zPackingIterator.find_binBin[T]c                 C  s4   | j rt| jdd d}| j| |S | jdS )Nc                 S  s   |   S r   )r   )br   r   r   <lambda>f   s    z,PackingIterator.remove_bin.<locals>.<lambda>)keyr   )r'   maxr"   removepop)r   r1   r   r   r   r/   d   s
   zPackingIterator.remove_binN)F)r   r#   r   r   r$   r   r%   r&   r'   r   r   r   )r   r)   )r   r+   )r   r   r   r3   )r   r4   )	r   r   r    __annotations__r   r*   r2   r-   r/   r   r   r   r   r!   0   s   
 


r!   c                   @  sD   e Zd ZU ded< ded< ded< dddZdddZdddZdS )
ListPackerr   _target_weight	_lookbackr   _largest_bin_firstr   r$   r'   r   r   c                 C  s   || _ || _|| _d S r   )r=   r>   r?   )r   r   r$   r'   r   r   r   r   r   r   zListPacker.__init__r   r+   r%   r&   List[List[T]]c                 C  s   t t|| j| j|| jdS )N)r   r   r$   r%   r'   )listr!   r=   r>   r?   )r   r   r%   r   r   r   packw   s   zListPacker.packc                 C  s(   | j tt||d}dd t|D S )N)r   r%   c                 S  s   g | ]}t t|qS r   )rA   reversed).0	bin_itemsr   r   r   
<listcomp>   s    z'ListPacker.pack_end.<locals>.<listcomp>)rB   rA   rC   )r   r   r%   packedr   r   r   pack_end   s   zListPacker.pack_endN)r   r   r$   r   r'   r   r   r   )r   r+   r%   r&   r   r@   )r   r   r    r;   r   rB   rH   r   r   r   r   r<   m   s   
 

r<   N)
__future__r   typingr   r   r   r   r   r   r	   r
   r!   r<   r   r   r   r   <module>   s    	=