o
    <i                     @   s   d Z ddlZddlmZ dedefddZded	edefd
dZdeeB defddZddededB 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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   T/home/ubuntu/veenaModal/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_required3   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_bytesD   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_decimalS   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_decimala   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>o   s   8 r0      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   r0   p   s    z<genexpr>.<genexpr>r1   N)nextrange)r.   r   r4   r   r0   p   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   r8   z+Unsupported precision, outside of (0, 40]: )r   REQUIRED_LENGTH)r9   r   r   r   decimal_required_bytess   s   	r;   r2   )__doc__r(   decimalr   r   r   r   r   bytesr   r    r%   tupler7   r3   r:   r;   r   r   r   r   <module>   s   