o
    qoi                     @   s   d Z ddlZddlZddlmZmZmZ ddlZG dd dejZ	ej
ddG dd	 d	ZG d
d dejdZej
ddG dd deZi ZdededdfddZdede	defddZdS )a  Specialized code generation for certain types/values.

Several Python values, such as `jnp.bfloat16` (`jax.numpy.bfloat16`), will
render badly if we just try to call repr() on them. This module creates an
extensible API to register better formatting handlers for ML libraries.
    N)AnyCallableListc                   @   s"   e Zd ZdZdedefddZdS )ImportManagerApiz7Defines an API for a helper class that imports modules.module_namereturnc                 C   s   d S N )selfr   r	   r	   ]/home/ubuntu/.local/lib/python3.10/site-packages/fiddle/_src/codegen/special_value_codegen.pyadd_by_name!   s   zImportManagerApi.add_by_nameN)__name__
__module____qualname____doc__strr   r	   r	   r	   r   r      s    r   T)frozenc                   @   s"   e Zd ZU dZeed< dd ZdS )
ReprStringz6Helper class whose repr() is just the provided string.
repr_valuec                 C   s   | j S r   )r   r
   r	   r	   r   __repr__*   s   zReprString.__repr__N)r   r   r   r   r   __annotations__r   r	   r	   r	   r   r   %   s   
 r   c                   @   s@   e Zd Zejdee fddZejdee de	fddZ
dS )
Importabler   c                 C      t  r   NotImplementedErrorr   r	   r	   r   import_modules0      zImportable.import_modulesimported_module_namesc                 C   r   r   r   )r
   r   r	   r	   r   repr_string4   r   zImportable.repr_stringN)r   r   r   abcabstractpropertyr   r   r   abstractmethodr   r   r	   r	   r	   r   r   .   s
    r   )	metaclassc                   @   sX   e Zd ZU dZeed< eegef ed< edee fddZ	dee de
fdd	Zd
S )SingleImportablez8An Importable instance, that only needs a single module.import_modulerepr_fnr   c                 C   s   | j gS r   )r%   r   r	   r	   r   r   ?   s   zSingleImportable.import_modulesr   c                 C   s   |\}t | |S r   )r   r&   )r
   r   imported_module_namer	   r	   r   r   C   s   zSingleImportable.repr_stringN)r   r   r   r   r   r   r   propertyr   r   r   r   r	   r	   r	   r   r$   9   s   
 r$   value
resolutionr   c                 C   s   || ft t| < dS )zRegisters an exact-value match.N)_EXACT_VALUE_LOOKUPid)r)   r*   r	   r	   r   register_exact_valueK   s   r-   import_managerc              	      sL   z
t t|  \}}W n ttfy   Y | S w  fdd|jD }||S )ah  Transforms a Python value for code generation or printing with repr().

  Args:
    value: Python value, typically a leaf node if there are nested data
      structures. Data structures are not automatically transformed by this
      function.
    import_manager: Import manager used to resolve imports.

  Returns:
    Either `value` unchanged, or a ReprString containing code, which when
    evaluated, returns an equivalent object to `value`. (The exact semantics
    of equivalence--by object identity or regular equality--is not guaranteed,
    and mostly a function of what extensions the user has enabled.)
  c                    s   g | ]}  |qS r	   )r   ).0r   r.   r	   r   
<listcomp>f   s    z&transform_py_value.<locals>.<listcomp>)r+   r,   KeyError	TypeErrorr   r   )r)   r.   
importable_imported_namesr	   r0   r   transform_py_valueR   s   


r7   )r   r    dataclassestypingr   r   r   typing_extensionsProtocolr   	dataclassr   ABCMetar   r$   r+   r-   r7   r	   r	   r	   r   <module>   s   

