concrete PrimesDemo { @type run () -> () } define PrimesDemo { run () { PrimeTracker tracker <- PrimeTracker.create() ThreadFlag flag <- ThreadFlag.new() Thread thread <- ProcessThread.from(PrimeThread.create(flag, tracker)).start() // Interactive input loop. scoped { TextReader reader <- TextReader.fromBlockReader(BasicInput.stdin()) } in while (!reader.pastEnd()) { $Hidden[tracker, thread]$ \ BasicOutput.stderr() .writeNow("Press [Enter] to toggle start/stop computation thread. Type \"exit\" to exit.\n") String input <- reader.readNextLine() if (reader.pastEnd()) { break } if (input == "") { if (flag.getEnabled()) { \ flag.stop() \ BasicOutput.stderr().writeNow("Stopped.\n") } else { \ flag.start() \ BasicOutput.stderr().writeNow("Started.\n") } } elif (input == "exit") { break } else { \ BasicOutput.stderr().writeNow("Please try again!\n") } } // Wait for the thread to exit, then print the results. \ flag.cancel() \ BasicOutput.stderr().writeNow("Exiting.\n") \ thread.join() traverse (tracker.getResults() -> Int prime) { \ BasicOutput.stdout() .write(prime) .write("\n") .flush() } } }