Import Upstream version 20180207
[hcoop/debian/mlton.git] / lib / cml / cml-lib / simple-rpc.sml
CommitLineData
7f918cf1
CE
1(* simple-rpc.sig
2 * 2004 Matthew Fluet (mfluet@acm.org)
3 * Ported to MLton threads.
4 *)
5
6(* simple-rpc.sml
7 *
8 * COPYRIGHT (c) 1997 AT&T Labs Research.
9 *
10 * Generators for simple RPC protocols.
11 *)
12
13structure SimpleRPC : SIMPLE_RPC =
14 struct
15
16 type 'a event = 'a CML.event
17
18 fun call reqMB arg =
19 let val replV = SyncVar.iVar()
20 in
21 Mailbox.send(reqMB, (arg, replV))
22 ; SyncVar.iGet replV
23 end
24
25 fun mkRPC f =
26 let
27 val reqMB = Mailbox.mailbox()
28 val entryEvt =
29 CML.wrap
30 (Mailbox.recvEvt reqMB, fn (arg, replV) =>
31 SyncVar.iPut(replV, f arg))
32 in
33 {call = call reqMB, entryEvt = entryEvt}
34 end
35
36 fun mkRPC_In f =
37 let
38 val reqMB = Mailbox.mailbox()
39 val reqEvt = Mailbox.recvEvt reqMB
40 fun entryEvt state =
41 CML.wrap
42 (reqEvt, fn (arg, replV) =>
43 SyncVar.iPut(replV, f(arg, state)))
44 in
45 {call = call reqMB, entryEvt = entryEvt}
46 end
47
48 fun mkRPC_Out f =
49 let
50 val reqMB = Mailbox.mailbox()
51 val reqEvt = Mailbox.recvEvt reqMB
52 val entryEvt =
53 CML.wrap
54 (reqEvt, fn (arg, replV) =>
55 let val (res, state') = f arg
56 in SyncVar.iPut(replV, res); state'
57 end)
58 in
59 {call = call reqMB, entryEvt = entryEvt}
60 end
61
62 fun mkRPC_InOut f =
63 let
64 val reqMB = Mailbox.mailbox()
65 val reqEvt = Mailbox.recvEvt reqMB
66 fun entryEvt state =
67 CML.wrap
68 (reqEvt, fn (arg, replV) =>
69 let val (res, state') = f(arg, state)
70 in SyncVar.iPut(replV, res); state'
71 end)
72 in
73 {call = call reqMB, entryEvt = entryEvt}
74 end
75 end