"""Reader of the buffer."""
from abc import ABC, abstractmethod
from typing import Dict, List, Optional


class BufferReader(ABC):
    """Interface of the buffer reader."""

    @abstractmethod
    def read(self, batch_size: Optional[int] = None, **kwargs) -> List:
        """Read from buffer."""

    @abstractmethod
    async def read_async(self, batch_size: Optional[int] = None, **kwargs) -> List:
        """Read from buffer asynchronously."""

    def __len__(self) -> int:
        """Get the number of samples in buffer."""
        raise NotImplementedError

    def state_dict(self) -> Dict:
        """Return the state of the reader as a dict.
        Returns:
            A dict containing the reader state. At minimum, it should contain
            the `current_index` field.
        """
        raise NotImplementedError

    def load_state_dict(self, state_dict: Dict) -> None:
        raise NotImplementedError
