packages feed

zeolite-lang-0.22.0.0: example/primes/prime-tracker.0rx

define PrimeTracker {
  @value Vector<Int> primes
  @value Int nextPossible

  create () {
    return PrimeTracker{ Vector<Int>.new(), 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) {
      \ BasicOutput.stderr()
          .write("\r")
          .write(toCheck)
          .flush()
      \ primes.push(toCheck)
    }
    return self
  }

  getResults () {
    return primes.defaultOrder()
  }
}