1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
type ('z,'i) in_channel =
| In of (('z,'i) out_channel -> 'z)
and ('z,'o) out_channel =
| Out of ('o -> ('z,'o) in_channel -> 'z)
type ('z,'i,'o) ans = ('z,'i) in_channel -> ('z,'o) out_channel -> 'z
type ('a,'z,'i,'o) proc = ('a -> ('z,'i,'o) ans) -> ('z,'i,'o) ans
let send o k in_ch (Out sendd) =
sendd o (In(fun out_ch -> k () in_ch out_ch))
let recv k (In recv) out_ch =
recv (Out(fun v in_ch -> k v in_ch out_ch))
let exit_k x _ _ = x
let (<|>>) p1 p2 _ in_ch out_ch =
p2 exit_k
(In(fun m_ch -> p1 exit_k in_ch m_ch))
out_ch
let rec stdin_ch =
In (fun (Out send) -> send (read_line ()) stdin_ch)
let rec stdout_ch =
Out (fun str (In recv) -> print_endline str; recv stdout_ch)
let run p = p exit_k stdin_ch stdout_ch
|