struct KPrimeGen: Sequence, IteratorProtocol {
  let k: Int
  private(set) var n: Int

  private func isKPrime() -> Bool {
    var primes = 0
    var f = 2
    var rem = n

    while primes < k && rem > 1 {
      while rem% f == 0 && rem > 1 {
        rem /= f
        primes += 1
      }

      f += 1
    }

    return rem == 1 && primes == k
  }

  mutating func next() -> Int? {
    n += 1

    while!isKPrime() {
      n += 1
    }

    return n
  }
}

for k in 1..<6 {
  print("\(k): \(Array(KPrimeGen(k: k, n: 1).lazy.prefix(10)))")
}