zeolite-lang-0.16.0.0: example/primes/prime-tracker.0rx
define PrimeTracker {
@value Vector<Int> primes
@value Int nextPossible
create () {
return PrimeTracker{ Vector:create<Int>(), 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<Formatted>.new()
.append("\r")
.append(toCheck)
.writeTo(SimpleOutput.stderr())
\ primes.push(toCheck)
}
return self
}
getResults () {
return primes.defaultOrder()
}
}