def METHOD_NAME(
    self, start: int, end: int, left: int, right: int
) -> Generator[Tuple[int, int], None, None]:
    """Return a generator of intervals to be fetched.
    Args:
        start (int): Start of needed interval
        end (int): End of needed interval
        left (int): Index of first overlapping downloaded data
        right (int): Index after last overlapping downloaded data
    """
    lslice, rslice = self._left[left:right], self._right[left:right]
    i = start = min([start] + lslice[:1])
    end = max([end] + rslice[-1:])
    for j, k in zip(lslice, rslice):
        if j > i:
            yield i, j - 1
        i = k + 1
    if i <= end:
        yield i, end
    self._left[left:right], self._right[left:right] = [start], [end]