
    
9j)                        S SK r S SKrS SKrS SKrS SKrS SKJrJrJr  S SK	J
r
  S SKJr  S SKJrJrJrJrJrJrJr  \R*                  " \5      r " S S5      r\" 5       rS\S	\4S
 jrS\\\4   S	\4S jr " S S5      r " S S\5      rg)    N)heapifyheappopheappush)IOBase)Path)AnyCallableIterableIteratorMappingOptionalUnionc                   ^    \ rS rSrSrS\4S jrS\4S jrS\4S jr	S\4S jr
S\4S jrS	rg
)_EndOfFileSymbol   z
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                     g)N_EOF selfs    P/home/wildlama/miniconda3/lib/python3.13/site-packages/dahuffman/huffmancodec.py__repr___EndOfFileSymbol.__repr__   s        c                     g)NTr   r   others     r   __lt___EndOfFileSymbol.__lt__   s    r   c                     g)NFr   r   s     r   __gt___EndOfFileSymbol.__gt__   s    r   c                 4    UR                   U R                   :H  $ N)	__class__r   s     r   __eq___EndOfFileSymbol.__eq__!   s    $..00r   c                 ,    [        U R                  5      $ r%   )hashr&   r   s    r   __hash___EndOfFileSymbol.__hash__$   s    DNN##r   r   N)__name__
__module____qualname____firstlineno____doc__strr   boolr   r"   r'   intr+   __static_attributes__r   r   r   r   r      sC    # t t 1t 1$# $r   r   datar   c                     [        S5      SR                  [        S5      [        0R                  [        U 5      [        5      $ )z'
Guess concat function from given data
 r   )typejoinbytesgetlist)r6   s    r   _guess_concatr>   0   s6    
 	R"''S	5 
c$t*dr   pathc                     [        U 5      n U R                  5       (       d  U R                  SS9  U R                  5       (       d   eU $ )NT)parents)r   existsmkdiris_dir)r?   s    r   
ensure_dirrE   :   s9    :D;;==

4
 ;;===Kr   c            
       ^   \ rS rSrSr\S\4S\S\S\	4S jjr
S\4S	 jr\R                  4S
\SS4S jjrS\\\\4   S\4S jrS\\\\4   S\\   4S jr SS\\\\   4   S\\   S\\\\4   4S jjrS\\\\   4   S\4S jrSS\\\4   S\SS4S jjr\S\\\4   SS 4S j5       rSr g)PrefixCodecB   z,
Prefix code codec, using given code table.
T
code_tableconcatcheckc                     Xl         X l        X@l        U(       aQ  [        U R                   [        5      (       a/  [        S U R                   R                  5        5       5      (       d   egg)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      #    U  HF  u  p[        U[        5      =(       a(    US :  =(       a    [        U[        5      =(       a    US:  v   MH     g7f)   r   N)
isinstancer4   ).0bvs      r   	<genexpr>'PrefixCodec.__init__.<locals>.<genexpr>W   sA      92FQ 1c"OqAvO*Q2DOaO2s   AAN)_table_concat_eofrO   dictallvalues)r   rI   rJ   rK   eofs        r   __init__PrefixCodec.__init__G   sa     !	dkk400S 9"kk0029 6 6   6 r   r   c                     U R                   $ )zR
Get code table
:return: dictionary mapping symbol to code tuple (bitsize, value)
)rU   r   s    r   get_code_tablePrefixCodec.get_code_table_   s    
 {{r   outNc           
         [        [        [        R                  " S/S U R                  R                  5        5       5      6 5      n[        S U 5       5      nSUSS -  n[        U6  H!  nUR                  UR                  " U6 5        M#     g)z
Print code table overview
)BitsCodeValueSymbolc              3      #    U  HG  u  nu  p#[        U5      [        U5      S S R                  US5      [        U5      [        U5      4v   MI     g7f)   N0)r2   binrjustrepr)rP   symbolbitsvals       r   rS   /PrefixCodec.print_code_table.<locals>.<genexpr>p   sU       4G/FKT  IHQRL..tS9H L	 4Gs   AAc              3   F   #    U  H  n[        S  U 5       5      v   M     g7f)c              3   8   #    U  H  n[        U5      v   M     g 7fr%   )len)rP   ss     r   rS   9PrefixCodec.print_code_table.<locals>.<genexpr>.<genexpr>}   s     /3a3q663s   N)max)rP   cols     r   rS   rp   }   s     C7Cs/3///7s   !z{0:>%d} {1:%d} {2:>%d} {3}
N   )	r=   zip	itertoolschainrU   itemstuplewriteformat)r   ra   columnswidthstemplaterows         r   print_code_tablePrefixCodec.print_code_tablef   s     89 48;;3D3D3F
" C7CC1F2AJ>=CIIhoos+, !r   r6   c                 6    [        U R                  U5      5      $ )z~
Encode given data.

:param data: sequence of symbols (e.g. byte string, unicode string, list, iterator)
:return: byte string
)r;   encode_streaming)r   r6   s     r   encodePrefixCodec.encode   s     T**4011r   c              #   @  #    SnSnU HI  nU R                   U   u  pVX%-  U-   nX5-  nUS:  d  M'  X#S-
  -	  nUv   X'US-
  -  -
  nUS-  nUS:  a  M"  MK     US:  aA  U R                   U R                     u  pVX%-  U-   nX5-  nUS:  a  X#S-
  -	  nOUSU-
  -  nUv   gg7f)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)rU   rW   )r   r6   buffersizert   rQ   rR   bytes           r   r   PrefixCodec.encode_streaming   s      A;;q>DAkQ&FID!)(+
D1H#56		 !) & !8;;tyy)DAkQ&FIDqy(+!d(+J s   *B BABc                 V    U=(       d    U R                   " U R                  U5      5      $ )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:
)rV   decode_streaming)r   r6   rJ   s      r   decodePrefixCodec.decode   s&     &$,,&(=(=d(CDDr   c              #   2  #    U R                   R                  5        VVVs0 s H  u  nu  p4X44U_M     nnnnSnSnU HM  nS HD  n	US-  [        X-  5      -   nUS-  nXv4U;   d  M$  XWU4   n
XR                  :X  a      gU
v   SnSnMF     MO     gs  snnnf 7f)z
Decode given data in streaming fashion

:param data: sequence of bytes (string, list or generator of bytes)
:return: generator of symbols
r   )   @          r      rh   rN   rN   N)rU   r|   r3   rW   )r   r6   rt   rQ   rR   lookupr   r   r   mrm   s              r   r   PrefixCodec.decode_streaming   s      .2[[->->-@A-@	6A1&!)-@AD2 A+dh7	>V+#&L1F* LFD 3 	 Bs   BB/B'0Br?   metadatac           	         U R                  5       nU[        U 5      U R                  S.nU(       a  X$S'   [        U5      n[	        UR
                  5        UR                  SS9 n[        R                  " XES9  SSS5        [        R                  SR                  [        U 5      R                  [        U5      [        U5      S95        g! , (       d  f       NX= f)	zv
Persist the code table to a file.
:param path: file path to persist to
:param metadata: additional metadata
:return:
)rI   r9   rJ   r   wbmode)fileNz)Saved {c} code table ({l} items) to {p!r}clp)r_   r9   rV   r   rE   parentopenpickledump_loginfor   r-   rs   r2   )r   r?   r   rI   r6   fs         r   savePrefixCodec.save   s     ((*
$Jll

 'Dz4;;YYDY!QKK% " 			7>>t*%%ZCI ? 	
 "!s   $C
Cc           	      j   [        U 5      n U R                  SS9 n[        R                  " U5      nSSS5        WS   n[	        U[
        5      (       d   eUS   n[        R                  SR                  UR                  [        U5      [        U 5      S95        U" XBS   S	9$ ! , (       d  f       Nx= f)
zd
Load a persisted PrefixCodec
:param path: path to serialized PrefixCodec code table data.
:return:
rbr   Nr9   rI   z0Loading {c} with {l} code table items from {p!r}r   rJ   rJ   )r   r   r   load
issubclassrG   r   r   r   r-   rs   r2   )r?   r   r6   clsrI   s        r   r   PrefixCodec.load   s     DzYYDY!Q;;q>D "6l#{++++,'
		>EE,,#j/SY F 	

 :8n55 "!s   B$$
B2)rV   rW   rU   r%   )!r-   r.   r/   r0   r1   r=   r   rX   r	   r3   r\   r_   sysstdoutr   r   r   r2   r;   r
   r   r   r4   r   r   r   r   r   r   r   staticmethodr   r5   r   r   r   rG   rG   B   sO   
 48tQU(0@D0  .1ZZ -F -D -825eX!56 25 2%U3x+?%@ %Xc] %P OS
E%#./
E9A(9K
E	sE8#	$
EU5(3-+?%@ X 0
sDy) 
S 
D 
4 65d# 6 6 6r   rG   c                   x    \ rS rSrSr\S\4S\\\	4   S\
\   SS 4S jj5       r\S\\\\4   SS 4S	 j5       rS
rg)HuffmanCodeci  zz
Huffman coder, with code table built from given symbol frequencies or raw data,
providing encoding and decoding methods.
NfrequenciesrJ   r   c                    U=(       d    [        [        [        U5      5      5      nUR                  5        VVs/ s H  u  pEXTS4/4PM     nnnX1;  a  UR	                  SUS4/45        [        U5        [        U5      S:  a  [        U5      n[        U5      nUS   US   -   US    VV	V
s/ s H  u  nu  pXIS-   U
44PM     sn
n	nUS    VV	V
s/ s H  u  nu  pXIS-   SU	-  U
-   44PM     sn
n	n-   4n[        Xk5        [        U5      S:  a  M  [        [        U5      S   5      nU " XSUS9$ s  snnf s  sn
n	nf s  sn
n	nf )z
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)
)r   r   rN   r   F)rJ   rK   r[   )
r>   nextiterr|   appendr   rs   r   r   rX   )r   r   rJ   r[   rt   r   heaparQ   nrR   mergedtables                r   from_frequenciesHuffmanCodec.from_frequencies  sI    A=d;.?)@A 0;/@/@/BC/Btq[M"/BC!KKc6]O,- 	$i!mAA !qt45aD9D[a!!!eQZD9AB1F+1fqAAQ!|,-FGF
 T" $i!m WT]1%&5u#>>- D :Fs   D1-D7
D>r6   c                 `    [         R                  " U5      nU R                  U[        U5      S9$ )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   r>   )r   r6   r   s      r   	from_dataHuffmanCodec.from_data3  s/     "))$/##Kd8K#LLr   r   )r-   r.   r/   r0   r1   classmethodr   r   rX   r   r   r	   r   r2   r;   r
   r   r5   r   r   r   r   r     s    
  &*	%?4=)%? "%?
 
%? %?N MU3x#78 M^ M Mr   r   )r   rz   loggingr   r   heapqr   r   r   ior   pathlibr   typingr   r	   r
   r   r   r   r   	getLoggerr-   r   r   r   r>   r2   rE   rG   r   r   r   r   <module>r      s        
 , ,   N N N"$ $6   U39% $ @6 @6F7M; 7Mr   