is_prime := n -> { 0.1.sleep // wow, what an inefficient algorithm, oh no d := 1 ().loop(() -> { &d = (d, 1).sum if d.lt(n) { if n.modulo(d).eq(0) (false) } else (true) }) } find_primes := start_at -> { () -> (().loop(() -> { out := if start_at.is_prime (start_at) &start_at = (start_at, 1).sum out })) } primes_count := 0 background_thread := {() -> 2.find_primes.take(20).map(p -> { &primes_count = (primes_count, 1).sum, p }).as_list }.thread // Show status to the user while the background thread works ().loop(() -> { 0.2.sleep (" Found ", primes_count, " primes...\r").concat.print if background_thread.thread_finished (()) }) ("\nPrimes: ", background_thread.thread_await).concat.println