"""
The classes in this module are common model used to represent the data
manipulated in the various APIs.
"""
from typing import TypeVar, List, Dict


T = TypeVar("T")
"""Used to type hint the GenericWrappingIterator class' methods"""


class GenericWrappingIterator:
    """
    Iterate over wrapped dict items from a list in an API response.

    This iterator allows to iterate over wrapped representation of entities contained
    in the API response.
    """
    def __init__(self, items: List[Dict], wrapper_class):
        """
        :param items: the (dict) items over which we want to iterate
        :param wrapper_class: each item returned while iterating using this iterator will
        be wrapped using the class provided by wrapper_class
        """
        self._wrapper_class = wrapper_class
        self._items = items
        self._items_iterator = iter(items)

    def __iter__(self) -> 'GenericWrappingIterator':
        """Used in for..in loops to get the iterator."""
        return self

    def __next__(self) -> T:
        """Used in for..in loops to get the next item."""
        return self._wrapper_class(next(self._items_iterator))

    def __getitem__(self, key: int) -> T:
        """[] operator"""
        return self._wrapper_class(self._items[key])

    def __len__(self) -> int:
        """Used by the builtin len() function."""
        return len(self._items)
