parameters: (self, start, end, left, right)
docstring: Return an iterator 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
docstring_summary: Return an iterator of intervals to be fetched.
docstring_tokens: Return an iterator of intervals to be fetched .
function: def _merge(self, start, end, left, right):
          # type: (int, int, int, int) -> Iterator[Tuple[int, int]]
          """Return an iterator 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]
function_tokens: def _merge ( self , start , end , left , right ) : # type: (int, int, int, int) -> Iterator[Tuple[int, int]] 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 ]