o
    ˳ia                     @  st   d dl mZ d dlmZmZ d dl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Iterable)Generic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   O/home/ubuntu/.local/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   0   s   

zPackingIterator.__init__PackingIterator[T]c                 C  s   | S )z1Return an iterator for the PackingIterator class.r   r   r   r   r   __iter__?   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__C   s(   




zPackingIterator.__next__r   Bin[T] | Nonec                 C  s"   | j D ]}||r|  S qd S r   )r    r   )r   r   r/   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>c   s    z,PackingIterator.remove_bin.<locals>.<lambda>)keyr   )r%   maxr    removepop)r   r/   r   r   r   r-   a   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   r1   )r   r2   )	r   r   r   __annotations__r   r(   r0   r+   r-   r   r   r   r   r   -   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   o   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   packt   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   )r?   reversed).0	bin_itemsr   r   r   
<listcomp>   s    z'ListPacker.pack_end.<locals>.<listcomp>)r@   r?   rA   )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   r9   r   r@   rF   r   r   r   r   r:   j   s   
 

r:   N)
__future__r   collections.abcr   r   typingr   r   r   r   r   r:   r   r   r   r   <module>   s   =