define PrimeTracker { @value Vector primes @value Int nextPossible create () { return PrimeTracker{ Vector:create(), 2 } } checkNextPossible (flag) { Int toCheck <- nextPossible $ReadOnly[toCheck]$ Bool isPrime <- true traverse (getResults() -> Int prime) { $ReadOnly[prime]$ $Hidden[nextPossible]$ if (!flag.shouldContinue()) { return self } if (toCheck%prime == 0) { isPrime <- false break } if (prime*prime >= toCheck) { break } } // Postpone updating the next possible until we know that there wasn't an // early return due to the flag. nextPossible <- nextPossible+1 if (isPrime) { \ LazyStream.new() .append("\r") .append(toCheck) .writeTo(SimpleOutput.stderr()) \ primes.push(toCheck) } return self } getResults () { return primes.defaultOrder() } }