From bfafa7dbc3325749358538a95cbb4831db66b03c Mon Sep 17 00:00:00 2001 From: Alex AUVOLAT Date: Wed, 12 Mar 2014 10:11:12 +0100 Subject: First commit --- src/primes.ml | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/primes.ml (limited to 'src/primes.ml') diff --git a/src/primes.ml b/src/primes.ml new file mode 100644 index 0000000..0911f31 --- /dev/null +++ b/src/primes.ml @@ -0,0 +1,42 @@ +module Primes (K : Kahn.S) = struct + module K = K + module Lib = Kahn.Lib(K) + open K + open Lib + + let integers nmax (qo : int out_port) : unit process = + let rec loop n = + if n > nmax then + put (-1) qo + else + (put n qo) >>= (fun () -> loop (n+1)) + in + loop 2 + + let filter n (qi : int in_port) (qo : int out_port) : unit process = + let rec loop () = + (get qi) >>= (fun v -> + if v <> -1 then + (if v mod n = 0 then return () else put v qo) >>= loop + else + put v qo) + in loop() + + let rec primes (qi : int in_port) : unit process = + (get qi) >>= (fun v -> + if v <> -1 then begin + Format.printf "%d@." v; + (delay new_channel ()) >>= + (fun (qi2, qo2) -> doco [ filter v qi qo2 ; primes qi2 ]) + end else return ()) + + let main : unit process = + (delay new_channel ()) >>= + (fun (q_in, q_out) -> doco [ integers 5000 q_out ; primes q_in ]) + +end + +module P = Primes(Kahn.Seq) + +let () = P.K.run P.main + -- cgit v1.2.3