docs: def grouper(self, n, iterable, fillvalue=None):
          """This generator yields a set of tuples, where the
          iterable is broken into n sized chunks. If the
          iterable is not evenly sized then fillvalue will
          be appended to the last tuple to make up the difference.
  
          This function is copied from the standard docs on
          itertools.
          """
          args = [iter(iterable)] * n
          if hasattr(itertools, 'zip_longest'):
              return itertools.zip_longest(*args, fillvalue=fillvalue)
          return itertools.izip_longest(*args, fillvalue=fillvalue)