o
    uyi                     @   s   d Z ddlZddlmZ ddlmZmZ dedefddZd	ed
edefddZ	deeef defddZ
ddedee defddZded
edefddZdededefddZedd edD Zedd edD ZdedefddZdS ) z0Helper methods for working with Python Decimals.    N)Decimal)OptionalUnionvaluereturnc                 C   s$   |   \}}}tt||df S )zGet an unscaled value given a Decimal value.

    Args:
        value (Decimal): A Decimal instance.

    Returns:
        int: The unscaled value.
    r   )as_tupleintr   to_integral_value)r   signdigits_ r   Z/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/pyiceberg/utils/decimal.pydecimal_to_unscaled   s   	r   unscaledscalec                 C   s"   t |  \}}}t ||| fS )zGet a scaled Decimal value given an unscaled value and a scale.

    Args:
        unscaled (int): An unscaled value.
        scale (int): A scale to set for the returned Decimal instance.

    Returns:
        Decimal: A scaled Decimal instance.
    )r   r   )r   r   r
   r   r   r   r   r   unscaled_to_decimal&   s   
r   c                 C   sF   t | tr|  d d S t | trt|  d d S td|  )zReturn the minimum number of bytes needed to serialize a decimal or unscaled value.

    Args:
        value (int | Decimal): a Decimal value or unscaled int value.

    Returns:
        int: the minimum number of bytes needed to serialize the value.
       zUnsupported value: )
isinstancer   
bit_lengthr   r   
ValueError)r   r   r   r   bytes_required4   s
   
	
r   byte_lengthc                 C   s(   t | }|du rt|}|j|dddS )zReturn a byte representation of a decimal.

    Args:
        value (Decimal): a decimal value.
        byte_length (int): The number of bytes.
    Returns:
        bytes: the unscaled value of the Decimal as bytes.
    NbigT	byteordersigned)r   r   to_bytes)r   r   unscaled_valuer   r   r   decimal_to_bytesE   s   	r   c                 C   s   t j| ddd}t||S )zReturn a decimal from the bytes.

    Args:
        value (bytes): the bytes to be converted into a decimal.
        scale (int): the scale of the decimal.

    Returns:
        Decimal: the scaled decimal.
    r   Tr   )r   
from_bytesr   )r   r   unscaled_datumr   r   r   bytes_to_decimalT   s   

r"   widthc                 C   s4   t | }||| | |  }t|tt|  jS )zGet a truncated Decimal value given a decimal value and a width.

    Args:
        value (Decimal): a decimal value.
        width (int): A width for the returned Decimal instance.
    Returns:
        Decimal: A truncated Decimal instance.
    )r   r   absr   r   exponent)r   r#   r   applied_valuer   r   r   truncate_decimalb   s   	r'   c                 c   s:    | ]}t t t t d d| d d V  qdS )   r      N)mathfloorlog10fabspow.0posr   r   r   	<genexpr>p   s   8 r2      c                 #   s*    | ] t  fd dtdD V  qdS )c                 3   s     | ]} t | kr|V  qd S N)MAX_PRECISIONr/   pr   r   r2   q   s    z<genexpr>.<genexpr>r3   N)nextrange)r0   r   r6   r   r2   q   s   ( (   	precisionc                 C   s&   | dks| dkrt d|  t|  S )zCompute the number of bytes required to store a precision.

    Args:
        precision: The number of digits to store.

    Returns:
        The number of bytes required to store a decimal with a certain precision.
    r   r:   z+Unsupported precision, outside of (0, 40]: )r   REQUIRED_LENGTH)r;   r   r   r   decimal_required_bytest   s   	r=   r4   )__doc__r*   decimalr   typingr   r   r   r   r   r   bytesr   r"   r'   tupler9   r5   r<   r=   r   r   r   r   <module>   s   