docs: def next(self):
          """Generate merged row, consuming rows of original iterstors"""
          left = next(self.seq_left)
          if self.width is None:
              self.width = len(left) / self.nplanes_left
          if self.bitdepth is None:
              # Detect bitdepth
              if hasattr(left, 'itemsize'):  # array
                  self.bitdepth = left.itemsize * 8
              elif isinstance(left, (bytes, bytearray)):  # bytearray
                  self.bitdepth = 8
              else:
                  raise Error("Unknown bitdepth for merging planes")
          right = next(self.seq_right)
          rowlength = self.nplanes_res * self.width
          new = self.newarray(rowlength)
          if type(left) == type(right) == type(new):
              # slice assignment
              for i in range(self.nplanes_left):
                  new[i::self.nplanes_res] = left[i::self.nplanes_left]
              for i in range(self.nplanes_right):
                  i_ = i + self.nplanes_left
                  new[i_::self.nplanes_res] = right[i::self.nplanes_right]
          else:
              for i in range(self.nplanes_left):
                  for j in range(self.width):
                      new[(i * self.nplanes_res) + j] =\
                          left[(i * self.nplanes_left) + j]
              for i in range(self.nplanes_right):
                  i_ = i + self.nplanes_left
                  for j in range(self.width):
                      new[(i_ * self.nplanes_res) + j] =\
                          right[(i * self.nplanes_right) + j]
          return new