o
    Zh                     @   sh   d dl mZmZmZmZmZmZmZmZm	Z	m
Z
 d dlmZ e	dZe	dZG dd deeef ZdS )    )
AnyAsyncIteratorCallableIteratorListOptionalSequenceTupleTypeVarUnion)	BaseStoreKVc                
   @   sP  e Zd ZdZdeeef deegef dee	ge
f deege	f ddf
dd	Zd
ee deee	  fddZd
ee deee	  fddZdeeee	f  ddfddZdeeee	f  ddfddZd
ee ddfddZd
ee ddfddZdddee deee ee f fddZdddee deee ee f fddZdS )EncoderBackedStorea  Wraps a store with key and value encoders/decoders.

    Examples that uses JSON for encoding/decoding:

    .. code-block:: python

        import json

        def key_encoder(key: int) -> str:
            return json.dumps(key)

        def value_serializer(value: float) -> str:
            return json.dumps(value)

        def value_deserializer(serialized_value: str) -> float:
            return json.loads(serialized_value)

        # Create an instance of the abstract store
        abstract_store = MyCustomStore()

        # Create an instance of the encoder-backed store
        store = EncoderBackedStore(
            store=abstract_store,
            key_encoder=key_encoder,
            value_serializer=value_serializer,
            value_deserializer=value_deserializer
        )

        # Use the encoder-backed store methods
        store.mset([(1, 3.14), (2, 2.718)])
        values = store.mget([1, 2])  # Retrieves [3.14, 2.718]
        store.mdelete([1, 2])  # Deletes the keys 1 and 2
    storekey_encodervalue_serializervalue_deserializerreturnNc                 C   s   || _ || _|| _|| _dS )zInitialize an EncodedStore.N)r   r   r   r   )selfr   r   r   r    r   W/var/www/html/lang_env/lib/python3.10/site-packages/langchain/storage/encoder_backed.py__init__7   s   
zEncoderBackedStore.__init__keysc                    s0    fdd|D } j |} fdd|D S ).Get the values associated with the given keys.c                       g | ]}  |qS r   r   .0keyr   r   r   
<listcomp>F       z+EncoderBackedStore.mget.<locals>.<listcomp>c                    "   g | ]}|d ur  |n|qS Nr   r   valuer    r   r   r!   H       )r   mgetr   r   encoded_keysvaluesr   r    r   r)   D   s
   
zEncoderBackedStore.mgetc                    s8    fdd|D } j |I dH } fdd|D S )r   c                    r   r   r   r   r    r   r   r!   O   r"   z,EncoderBackedStore.amget.<locals>.<listcomp>Nc                    r#   r$   r%   r&   r    r   r   r!   Q   r(   )r   amgetr*   r   r    r   r-   M   s   
zEncoderBackedStore.amgetkey_value_pairsc                    "    fdd|D } j | dS )"Set the values for the given keys.c                    $   g | ]\}}  | |fqS r   r   r   r   r   r'   r    r   r   r!   X       z+EncoderBackedStore.mset.<locals>.<listcomp>N)r   msetr   r.   Zencoded_pairsr   r    r   r5   V   s   
zEncoderBackedStore.msetc                    *    fdd|D } j |I dH  dS )r0   c                    r1   r   r2   r3   r    r   r   r!   `   r4   z,EncoderBackedStore.amset.<locals>.<listcomp>N)r   amsetr6   r   r    r   r8   ^   s
   
zEncoderBackedStore.amsetc                    r/   )2Delete the given keys and their associated values.c                    r   r   r   r   r    r   r   r!   h   r"   z.EncoderBackedStore.mdelete.<locals>.<listcomp>N)r   mdeleter   r   r+   r   r    r   r:   f   s   zEncoderBackedStore.mdeletec                    r7   )r9   c                    r   r   r   r   r    r   r   r!   m   r"   z/EncoderBackedStore.amdelete.<locals>.<listcomp>N)r   amdeleter;   r   r    r   r<   k   s   zEncoderBackedStore.amdeleteprefixr>   c                c   s    | j j|dE dH  dS z6Get an iterator over keys that match the given prefix.r=   N)r   
yield_keys)r   r>   r   r   r   r@   p   s   zEncoderBackedStore.yield_keysc                C  s*   | j j|d2 z	3 dH W }|V  q6 dS r?   )r   ayield_keys)r   r>   r   r   r   r   rA   x   s   zEncoderBackedStore.ayield_keys)__name__
__module____qualname____doc__r   strr   r   r   r   bytesr   r   r   r   r)   r-   r	   r5   r8   r:   r<   r   r   r@   r   rA   r   r   r   r   r      s>    "

		
	r   N)typingr   r   r   r   r   r   r   r	   r
   r   Zlangchain_core.storesr   r   r   r   r   r   r   r   <module>   s
   0 