
    +j)                     2   d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZ  ej        e          Z G d d          Z e            Zded	efd
Zdeeef         d	efdZ G d d          Z G d de          ZdS )    N)heapifyheappopheappush)IOBase)Path)AnyCallableIterableIteratorMappingOptionalUnionc                   N    e Zd ZdZdefdZdefdZdefdZdefdZ	de
fdZdS )	_EndOfFileSymbolz
    Internal class for "end of file" symbol to be able
    to detect the end of the encoded bit stream,
    which does not necessarily align with byte boundaries.
    returnc                     dS )N_EOF selfs    Y/home/wildlama/comfy/ComfyUI/.venv/lib/python3.11/site-packages/dahuffman/huffmancodec.py__repr__z_EndOfFileSymbol.__repr__   s    v    c                     dS )NTr   r   others     r   __lt__z_EndOfFileSymbol.__lt__   s    tr   c                     dS )NFr   r   s     r   __gt__z_EndOfFileSymbol.__gt__   s    ur   c                 "    |j         | j         k    S N)	__class__r   s     r   __eq__z_EndOfFileSymbol.__eq__!   s    $.00r   c                 *    t          | j                  S r!   )hashr"   r   s    r   __hash__z_EndOfFileSymbol.__hash__$   s    DN###r   N)__name__
__module____qualname____doc__strr   boolr   r   r#   intr&   r   r   r   r   r      s         #    t    t    1t 1 1 1 1$# $ $ $ $ $ $r   r   datar   c                     t          d          dj        t          d          t          i                    t          |           t                    S )z/
    Guess concat function from given data
     r   )typejoinbytesgetlist)r.   s    r   _guess_concatr6   0   s=    
 	R"'S		5 
c$t**dr   pathc                     t          |           } |                                 s|                     d           |                                 sJ | S )NT)parents)r   existsmkdiris_dir)r7   s    r   
ensure_dirr=   :   sI    ::D;;== !

4
   ;;===Kr   c            
       |   e Zd ZdZedefdededefdZ	defdZ
ej        fd	edd
fdZdeeeef         defdZdeeeef         dee         fdZ	 ddeeee         f         dee         deeeef         fdZdeeee         f         defdZddeeef         dedd
fdZedeeef         dd fd            Zd
S )PrefixCodecz4
    Prefix code codec, using given code table.
    T
code_tableconcatcheckc                     || _         || _        || _        |rLt          | j         t                    r0t          d | j                                         D                       sJ dS dS )a>  
        Initialize codec with given code table.

        :param code_table: mapping of symbol to code tuple (bitsize, value)
        :param concat: function to concatenate symbols
        :param check: whether to check the code table
        :param eof: "end of file" symbol (customizable for advanced usage)
        c              3      K   | ]=\  }}t          |t                    o |d k    ot          |t                    o|dk    V  >dS )   r   N)
isinstancer-   ).0bvs      r   	<genexpr>z'PrefixCodec.__init__.<locals>.<genexpr>W   se       9 9Q 1c""OqAvO*Q2D2DOa9 9 9 9 9 9r   N)_table_concat_eofrF   dictallvalues)r   r@   rA   rB   eofs        r   __init__zPrefixCodec.__init__G   s     !	 	dk400 S 9 9"k00229 9 9 6 6   	 	 r   r   c                     | j         S )zj
        Get code table
        :return: dictionary mapping symbol to code tuple (bitsize, value)
        )rK   r   s    r   get_code_tablezPrefixCodec.get_code_table_   s    
 {r   outNc           
      :   t          t          t          j        dgd | j                                        D                                  }t          d |D                       }d|dd         z  }t          | D ]}|                     |j        |             dS )z+
        Print code table overview
        )BitsCodeValueSymbolc              3      K   | ]`\  }\  }}t          |          t          |          d d                             |d          t          |          t          |          fV  adS )   N0)r+   binrjustrepr)rG   symbolbitsvals       r   rJ   z/PrefixCodec.print_code_table.<locals>.<genexpr>p   s~         0FKT3  IIHHQRRL..tS99HH LL	     r   c              3   H   K   | ]}t          d  |D                       V  dS )c              3   4   K   | ]}t          |          V  d S r!   )len)rG   ss     r   rJ   z9PrefixCodec.print_code_table.<locals>.<genexpr>.<genexpr>}   s(      //a3q66//////r   N)max)rG   cols     r   rJ   z/PrefixCodec.print_code_table.<locals>.<genexpr>}   s9      CCCs//3/////CCCCCCr   z{0:>%d} {1:%d} {2:>%d} {3}
N   )	r5   zip	itertoolschainrK   itemstuplewriteformat)r   rU   columnswidthstemplaterows         r   print_code_tablezPrefixCodec.print_code_tablef   s     89  48;3D3D3F3F   
 
" CC7CCCCC1F2A2J>= 	- 	-CIIohos+,,,,	- 	-r   r.   c                 F    t          |                     |                    S )z
        Encode given data.

        :param data: sequence of symbols (e.g. byte string, unicode string, list, iterator)
        :return: byte string
        )r3   encode_streaming)r   r.   s     r   encodezPrefixCodec.encode   s      T**400111r   c              #   0  K   d}d}|D ]G}| j         |         \  }}||z  |z   }||z  }|dk    r"||dz
  z	  }|V  |||dz
  z  z
  }|dz  }|dk    "H|dk    r?| j         | j                 \  }}||z  |z   }||z  }|dk    r	||dz
  z	  }n|d|z
  z  }|V  dS dS )z
        Encode given data in streaming fashion.

        :param data: sequence of symbols (e.g. byte string, unicode string, list, iterator)
        :return: generator of bytes
        r      N)rK   rM   )r   r.   buffersizerg   rH   rI   bytes           r   rx   zPrefixCodec.encode_streaming   s        
	 
	A;q>DAqkQ&FAID!))$(+


4D1H#56		 !)) !88;ty)DAqkQ&FAIDqyy$(+!d(+JJJJJ 8r   c                 L     |p| j         |                     |                    S )z
        Decode given data.

        :param data: sequence of bytes (string, list or generator of bytes)
        :param concat: optional override of function to concatenate the decoded symbols
        :return:
        )rL   decode_streaming)r   r.   rA   s      r   decodezPrefixCodec.decode   s)     '&$,(=(=d(C(CDDDr   c              #      K   d | j                                         D             }d}d}|D ]K}dD ]F}|dz  t          ||z            z   }|dz  }||f|v r!|||f         }|| j        k    r  dS |V  d}d}GLdS )z
        Decode given data in streaming fashion

        :param data: sequence of bytes (string, list or generator of bytes)
        :return: generator of symbols
        c                 $    i | ]\  }\  }}||f|S r   r   )rG   rg   rH   rI   s       r   
<dictcomp>z0PrefixCodec.decode_streaming.<locals>.<dictcomp>   s&    AAA	6Aq1a&!AAAr   r   )   @          r{      r\   rE   rE   N)rK   rn   r,   rM   )r   r.   lookupr|   r}   r~   mra   s           r   r   zPrefixCodec.decode_streaming   s       BAT[->->-@-@AAA 
	 
	D2 	 	 A+dQh7	&>V++#D&L1F** LLLFD	
	 
	r   r7   metadatac           	         |                                  }|t          |           | j        d}|r||d<   t          |          }t	          |j                   |                    d          5 }t          j        ||           ddd           n# 1 swxY w Y   t          
                    d                    t          |           j        t          |          t          |                               dS )	z
        Persist the code table to a file.
        :param path: file path to persist to
        :param metadata: additional metadata
        :return:
        )r@   r1   rA   r   wbmode)fileNz)Saved {c} code table ({l} items) to {p!r}clp)rT   r1   rL   r   r=   parentopenpickledump_loginforq   r'   rf   r+   )r   r7   r   r@   r.   fs         r   savezPrefixCodec.save   s2    ((**
$JJl
 

  	('DDzz4;YYDY!! 	&QK1%%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 			7>>t**%ZCII ?  	
 	
 	
 	
 	
s   -BBBc           	         t          |           } |                     d          5 }t          j        |          }ddd           n# 1 swxY w Y   |d         }t	          |t
                    sJ |d         }t                              d                    |j	        t          |          t          |                                 |||d         	          S )
z
        Load a persisted PrefixCodec
        :param path: path to serialized PrefixCodec code table data.
        :return:
        rbr   Nr1   r@   z0Loading {c} with {l} code table items from {p!r}r   rA   rA   )r   r   r   load
issubclassr?   r   r   rq   r'   rf   r+   )r7   r   r.   clsr@   s        r   r   zPrefixCodec.load   s
    DzzYYDY!! 	"Q;q>>D	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"6l#{+++++,'
		>EE,#j//SYY F  	
 	
 	

 s:d8n5555s   AAAr!   )r'   r(   r)   r*   r5   r   rN   r	   r,   rR   rT   sysstdoutr   rv   r   r+   r3   r
   ry   r   r-   rx   r   r   r   r   r   r   staticmethodr   r   r   r   r?   r?   B   s         
 48tQU (0@D   0     .1Z - -F -D - - - -825eX!56 25 2 2 2 2%U3x+?%@ %Xc] % % % %P OS
E 
E%#./
E9A(9K
E	sE8#	$
E 
E 
E 
EU5(3-+?%@ X    0
 
sDy) 
S 
D 
 
 
 
4 65d# 6 6 6 6 \6 6 6r   r?   c                       e Zd ZdZedefdeeef         de	e
         dd fd            Zedeeeef         dd fd            ZdS )	HuffmanCodecz
    Huffman coder, with code table built from given symbol frequencies or raw data,
    providing encoding and decoding methods.
    NfrequenciesrA   r   c                 d   |p(t          t          t          |                              }d |                                D             }||vr|                    d|dfgf           t          |           t          |          dk    rwt          |          }t          |          }|d         |d         z   d |d         D             d |d         D             z   f}t          ||           t          |          dk    wt          t          |          d                   } | ||d|          S )	a  
        Build Huffman code table from given symbol frequencies
        :param frequencies: symbol to frequency mapping
        :param concat: function to concatenate symbols
        :param eof: "end of file" symbol (customizable for advanced usage)
        c                 "    g | ]\  }}||d fgfS )r   r   r   )rG   rg   r   s      r   
<listcomp>z1HuffmanCodec.from_frequencies.<locals>.<listcomp>  s'    CCCtq!a[M"CCCr   rE   r   r   c                 ,    g | ]\  }\  }}||d z   |ffS rE   r   rG   rg   nrI   s       r   r   z1HuffmanCodec.from_frequencies.<locals>.<listcomp>)  s,    999[a!Q!a!eQZ999r   c                 8    g | ]\  }\  }}||d z   d |z  |z   ffS r   r   r   s       r   r   z1HuffmanCodec.from_frequencies.<locals>.<listcomp>*  s6    FFF+1fq!AAQ!|,-FFFr   F)rA   rB   rQ   )
r6   nextiterrn   appendr   rf   r   r   rN   )	r   r   rA   rQ   heaparH   mergedtables	            r   from_frequencieszHuffmanCodec.from_frequencies  s@    A=d;.?.?)@)@AA DC{/@/@/B/BCCCk!!KKc6]O,--- 	$ii!mmAA !qt99AaD999FF1FFFGF
 T6""" $ii!mm WT]]1%&&s5u#>>>>r   r.   c                 r    t          j        |          }|                     |t          |                    S )z
        Build Huffman code table from symbol sequence

        :param data: sequence of symbols (e.g. byte string, unicode string, list, iterator)
        :return: HuffmanCoder
        r   )collectionsCounterr   r6   )r   r.   r   s      r   	from_datazHuffmanCodec.from_data3  s5     ")$//##Kd8K8K#LLLr   )r'   r(   r)   r*   classmethodr   r   rN   r   r   r	   r   r+   r3   r
   r   r   r   r   r   r     s         
  &*	%? %?4=)%? "%?
 
%? %? %? [%?N MU3x#78 M^ M M M [M M Mr   r   )r   rl   loggingr   r   heapqr   r   r   ior   pathlibr   typingr   r	   r
   r   r   r   r   	getLoggerr'   r   r   r   r6   r+   r=   r?   r   r   r   r   <module>r      s             



 , , , , , , , , , ,             N N N N N N N N N N N N N N N N N Nw""$ $ $ $ $ $ $ $6      U39% $    @6 @6 @6 @6 @6 @6 @6 @6F7M 7M 7M 7M 7M; 7M 7M 7M 7M 7Mr   