Import Upstream version 20180207
[hcoop/debian/mlton.git] / lib / cml / tests / primes.sml
CommitLineData
7f918cf1
CE
1
2structure Main =
3struct
4 open CML
5
6 val print = TextIO.print
7
8 fun makeNatStream c =
9 let
10 val ch = channel ()
11 fun count i = (send(ch, i)
12 ; count(i+1))
13 val _ = spawn (fn () =>
14 (print (concat ["makeNatStream: ",
15 tidToString (getTid ()),
16 "\n"])
17 ; count c))
18 in
19 ch
20 end
21
22 fun makeFilter (p, inCh) =
23 let
24 val outCh = channel ()
25 fun loop () =
26 let
27 val i = sync (recvEvt inCh)
28 in
29 if ((i mod p) <> 0)
30 then sync (sendEvt (outCh, i))
31 else ()
32 ; loop ()
33 end
34 val _ = spawn loop
35 in
36 outCh
37 end
38
39 fun makePrimes () =
40 let
41 val primes = channel ()
42 fun head ch =
43 let val p = recv ch
44 in
45 send(primes, p)
46 ; head (makeFilter (p, ch))
47 end
48 val _ = spawn (fn () =>
49 (print (concat ["makePrimes: ",
50 tidToString (getTid ()),
51 "\n"])
52 ; head (makeNatStream 2)))
53 in
54 primes
55 end
56
57 fun makeNatPrinter ch n =
58 let
59 fun loop i =
60 if i > n then RunCML.shutdown OS.Process.success
61 else let
62 val m = recv ch
63 val m' = Int.toString m
64 fun loop' j =
65 if j > m then ()
66 else (print (m' ^ "\n")
67 ; loop' (j + 1))
68 in
69 loop' m
70 ; loop (i + 1)
71 end
72 val _ = spawn (fn () =>
73 (print (concat ["makeNatPrinter: ",
74 tidToString (getTid ()),
75 "\n"])
76 ; loop 0))
77 in
78 ()
79 end
80
81 fun doit' n =
82 RunCML.doit
83 (fn () =>
84 let
85 val ch = makePrimes ()
86 val _ = makeNatPrinter ch n
87 in
88 ()
89 end,
90 SOME (Time.fromMilliseconds 10))
91
92 fun doit n =
93 let
94 val x = doit' n
95 in
96 x
97 end
98end