"""The Abstract Retriever Operator."""
from abc import abstractmethod

from gptdb.core.awel import MapOperator
from gptdb.core.awel.task.base import IN, OUT


class RetrieverOperator(MapOperator[IN, OUT]):
    """The Abstract Retriever Operator."""

    async def map(self, input_value: IN) -> OUT:
        """Map input value to output value.

        Args:
            input_value (IN): The input value.

        Returns:
            OUT: The output value.
        """
        # The retrieve function is blocking, so we need to wrap it in a
        # blocking_func_to_async.
        return await self.blocking_func_to_async(self.retrieve, input_value)

    @abstractmethod
    def retrieve(self, input_value: IN) -> OUT:
        """Retrieve data for input value."""
