mirror of
https://github.com/c-cube/moonpool.git
synced 2025-12-06 03:05:30 -05:00
32 lines
879 B
OCaml
32 lines
879 B
OCaml
let ( let@ ) = ( @@ )
|
|
|
|
let generate' chan =
|
|
for i = 2 to Int.max_int do
|
|
Moonpool.Chan.push chan i;
|
|
Thread.yield ()
|
|
done
|
|
|
|
let filter' in_chan out_chan prime =
|
|
let rec loop () =
|
|
let n = Moonpool.Chan.pop_await in_chan in
|
|
if n mod prime <> 0 then Moonpool.Chan.push out_chan n;
|
|
loop ()
|
|
in
|
|
loop ()
|
|
|
|
let () =
|
|
let@ runner = Moonpool.Ws_pool.with_ () in
|
|
let@ () = Moonpool.Ws_pool.run_wait_block runner in
|
|
let primes = ref @@ Moonpool.Chan.create () in
|
|
Moonpool.run_async runner
|
|
(let chan = !primes in
|
|
fun () -> generate' chan);
|
|
for _i = 1 to 10 do
|
|
let prime = Moonpool.Chan.pop_await !primes in
|
|
Format.printf "%d\n@?" prime;
|
|
let filtered_chan = Moonpool.Chan.create () in
|
|
Moonpool.run_async runner
|
|
(let in_chan = !primes in
|
|
fun () -> filter' in_chan filtered_chan prime);
|
|
primes := filtered_chan
|
|
done
|