code: def generate(self, minlen, maxlen):
          
          if minlen < 1 or maxlen < minlen:
              raise ValueError()
  
          for cur in range(minlen, maxlen + 1):
              # string product generator
              str_generator = product(self.charset, repeat=cur)
              for each in str_generator:
                  # yield the produced word
                  yield ''.join(each)+self.delimiter
docs: Generates words of different length without storing
          them into memory, enforced by itertools.product