Skip to content

Commit 8d31814

Browse files
committed
typed-protocols: added PeerPipelined newtype wrapper
1 parent 5ec9a8c commit 8d31814

File tree

10 files changed

+84
-40
lines changed

10 files changed

+84
-40
lines changed

typed-protocols-examples/src/Network/TypedProtocol/Driver/Simple.hs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,12 @@ runPeer tracer codec channel peer =
147147
-- 'MonadSTM' constraint.
148148
--
149149
runPipelinedPeer
150-
:: forall ps (st :: ps) pr failure bytes c m a.
150+
:: forall ps (st :: ps) pr failure bytes m a.
151151
(MonadAsync m, MonadThrow m, Exception failure)
152152
=> Tracer m (TraceSendRecv ps)
153153
-> Codec ps failure m bytes
154154
-> Channel m bytes
155-
-> Peer ps pr ('Pipelined Z c) st m a
155+
-> PeerPipelined ps pr st m a
156156
-> m (a, Maybe bytes)
157157
runPipelinedPeer tracer codec channel peer =
158158
runPipelinedPeerWithDriver driver peer
@@ -214,8 +214,8 @@ runConnectedPeersPipelined :: (MonadAsync m, MonadCatch m,
214214
=> m (Channel m bytes, Channel m bytes)
215215
-> Tracer m (PeerRole, TraceSendRecv ps)
216216
-> Codec ps failure m bytes
217-
-> Peer ps pr ('Pipelined Z c) st m a
218-
-> Peer ps (FlipAgency pr) 'NonPipelined st m b
217+
-> PeerPipelined ps pr st m a
218+
-> Peer ps (FlipAgency pr) 'NonPipelined st m b
219219
-> m (a, b)
220220
runConnectedPeersPipelined createChannels tracer codec client server =
221221
createChannels >>= \(clientChannel, serverChannel) ->
@@ -240,8 +240,8 @@ runConnectedPeersAsymmetric
240240
-> Tracer m (Role, TraceSendRecv ps)
241241
-> Codec ps failure m bytes
242242
-> Codec ps failure m bytes
243-
-> Peer ps pr ('Pipelined Z c) st m a
244-
-> Peer ps (FlipAgency pr) 'NonPipelined st m b
243+
-> PeerPipelined ps pr st m a
244+
-> Peer ps (FlipAgency pr) 'NonPipelined st m b
245245
-> m (a, b)
246246
runConnectedPeersAsymmetric createChannels tracer codec codec' client server =
247247
createChannels >>= \(clientChannel, serverChannel) ->

typed-protocols-examples/src/Network/TypedProtocol/PingPong/Client.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ data PingPongClientIdle (n :: N) c m a where
139139
pingPongClientPeerPipelined
140140
:: Functor m
141141
=> PingPongClientPipelined c m a
142-
-> Client PingPong (Pipelined Z c) StIdle m a
142+
-> ClientPipelined PingPong StIdle m a
143143
pingPongClientPeerPipelined (PingPongClientPipelined peer) =
144-
pingPongClientPeerIdle peer
144+
ClientPipelined $ pingPongClientPeerIdle peer
145145

146146

147147
pingPongClientPeerIdle

typed-protocols-examples/src/Network/TypedProtocol/ReqResp/Client.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ requestOnce server req = (\(resp, _, _) -> resp)
8484
-- | A request-response client designed for running the 'ReqResp' protocol in
8585
-- a pipelined way.
8686
--
87-
data ReqRespClientPipelined req resp c m a where
87+
data ReqRespClientPipelined req resp m a where
8888
-- | A 'PingPongSender', but starting with zero outstanding pipelined
8989
-- responses, and for any internal collect type @c@.
9090
ReqRespClientPipelined ::
9191
ReqRespIdle req resp Z c m a
92-
-> ReqRespClientPipelined req resp c m a
92+
-> ReqRespClientPipelined req resp m a
9393

9494

9595
data ReqRespIdle req resp n c m a where
@@ -117,10 +117,10 @@ data ReqRespIdle req resp n c m a where
117117
--
118118
reqRespClientPeerPipelined
119119
:: Functor m
120-
=> ReqRespClientPipelined req resp c m a
121-
-> Client (ReqResp req resp) (Pipelined Z c) StIdle m a
120+
=> ReqRespClientPipelined req resp m a
121+
-> ClientPipelined (ReqResp req resp) StIdle m a
122122
reqRespClientPeerPipelined (ReqRespClientPipelined peer) =
123-
reqRespClientPeerIdle peer
123+
ClientPipelined $ reqRespClientPeerIdle peer
124124

125125

126126
reqRespClientPeerIdle

typed-protocols-examples/src/Network/TypedProtocol/ReqResp/Examples.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ reqRespClientMap = go []
6868
reqRespClientMapPipelined :: forall req resp m.
6969
Monad m
7070
=> [req]
71-
-> ReqRespClientPipelined req resp resp m [resp]
71+
-> ReqRespClientPipelined req resp m [resp]
7272
reqRespClientMapPipelined reqs0 =
7373
ReqRespClientPipelined (go [] Zero reqs0)
7474
where

typed-protocols-examples/test/Network/TypedProtocol/ReqResp/Tests.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,15 @@ direct (SendMsgReq req kResp) ReqRespServer{recvMsgReq} = do
103103
direct client' server'
104104

105105

106-
directPipelined :: forall req resp c m a b. Monad m
107-
=> ReqRespClientPipelined req resp c m a
108-
-> ReqRespServer req resp m b
106+
directPipelined :: Monad m
107+
=> ReqRespClientPipelined req resp m a
108+
-> ReqRespServer req resp m b
109109
-> m (a, b)
110110
directPipelined (ReqRespClientPipelined client0) server0 =
111111
go EmptyQ client0 server0
112112
where
113-
go :: forall n.
114-
Queue n c
113+
go :: Monad m
114+
=> Queue n c
115115
-> ReqRespIdle req resp n c m a
116116
-> ReqRespServer req resp m b
117117
-> m (a, b)

typed-protocols/src/Network/TypedProtocol/Driver.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,12 @@ runPeerWithDriver Driver{sendMessage, recvMessage, initialDState} =
156156
-- 'MonadAsync' constraint.
157157
--
158158
runPipelinedPeerWithDriver
159-
:: forall ps (st :: ps) pr dstate c m a.
159+
:: forall ps (st :: ps) pr dstate m a.
160160
MonadAsync m
161161
=> Driver ps pr dstate m
162-
-> Peer ps pr ('Pipelined Z c) st m a
162+
-> PeerPipelined ps pr st m a
163163
-> m (a, dstate)
164-
runPipelinedPeerWithDriver driver@Driver{initialDState} peer = do
164+
runPipelinedPeerWithDriver driver@Driver{initialDState} (PeerPipelined peer) = do
165165
receiveQueue <- atomically newTQueue
166166
collectQueue <- atomically newTQueue
167167
a <- runPipelinedPeerReceiverQueue receiveQueue collectQueue driver

typed-protocols/src/Network/TypedProtocol/Peer.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
--
1818
module Network.TypedProtocol.Peer
1919
( Peer (..)
20+
, PeerPipelined (..)
2021
, Receiver (..)
2122
, Outstanding
2223
, N (..)
@@ -254,3 +255,11 @@ data Receiver ps pr st stdone m c where
254255
-> Receiver ps pr st stdone m c
255256

256257
deriving instance Functor m => Functor (Receiver ps pr st stdone m)
258+
259+
-- | A description of a peer that engages in a protocol in a pipelined fashion.
260+
--
261+
data PeerPipelined ps pr (st :: ps) m a where
262+
PeerPipelined :: { runPeerPipelined :: Peer ps pr (Pipelined Z c) st m a }
263+
-> PeerPipelined ps pr st m a
264+
265+
deriving instance Functor m => Functor (PeerPipelined ps pr st m)

typed-protocols/src/Network/TypedProtocol/Peer/Client.hs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
--
1414
module Network.TypedProtocol.Peer.Client
1515
( Client
16+
, ClientPipelined
17+
, TP.PeerPipelined(ClientPipelined, runClientPipelined)
1618
, pattern Effect
1719
, pattern Yield
1820
, pattern Await
@@ -46,6 +48,20 @@ type Client :: forall ps
4648
type Client ps pl st m a = Peer ps AsClient pl st m a
4749

4850

51+
-- | A description of a peer that engages in a protocol in a pipelined fashion.
52+
--
53+
type ClientPipelined ps st m a = TP.PeerPipelined ps AsClient st m a
54+
55+
pattern ClientPipelined :: forall ps st m a.
56+
()
57+
=> forall c.
58+
()
59+
=> Client ps (Pipelined Z c) st m a
60+
-> ClientPipelined ps st m a
61+
pattern ClientPipelined { runClientPipelined } = TP.PeerPipelined runClientPipelined
62+
63+
{-# COMPLETE ClientPipelined #-}
64+
4965
-- | Client role pattern for 'TP.Effect'.
5066
--
5167
pattern Effect :: forall ps pl st m a.

typed-protocols/src/Network/TypedProtocol/Peer/Server.hs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
--
1414
module Network.TypedProtocol.Peer.Server
1515
( Server
16+
, ServerPipelined
17+
, TP.PeerPipelined(ServerPipelined, runServerPipelined)
1618
, pattern Effect
1719
, pattern Yield
1820
, pattern Await
@@ -46,6 +48,21 @@ type Server :: forall ps
4648
type Server ps pl st m a = Peer ps AsServer pl st m a
4749

4850

51+
-- | A description of a peer that engages in a protocol in a pipelined fashion.
52+
--
53+
type ServerPipelined ps st m a = TP.PeerPipelined ps AsServer st m a
54+
55+
pattern ServerPipelined :: forall ps st m a.
56+
()
57+
=> forall c.
58+
()
59+
=> Server ps (Pipelined Z c) st m a
60+
-> ServerPipelined ps st m a
61+
pattern ServerPipelined { runServerPipelined } = TP.PeerPipelined runServerPipelined
62+
63+
{-# COMPLETE ServerPipelined #-}
64+
65+
4966
-- | Server role pattern for 'TP.Effect'.
5067
--
5168
pattern Effect :: forall ps pl st m a.

typed-protocols/src/Network/TypedProtocol/Proofs.hs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -169,19 +169,19 @@ enqueue a (ConsQ b q) = ConsQ b (enqueue a q)
169169
-- us extra expressiveness or to break the protocol state machine.
170170
--
171171
forgetPipelined
172-
:: forall ps (pr :: PeerRole) (st :: ps) c m a.
172+
:: forall ps (pr :: PeerRole) (st :: ps) m a.
173173
Functor m
174174
=> [Bool]
175175
-- ^ interleaving choices for pipelining allowed by
176176
-- `Collect` and `CollectSTM` primitive. False values or `[]` give no
177177
-- pipelining. For the 'CollectSTM' primitive, the stm action must not
178178
-- block otherwise even if the choice is to pipeline more (a 'True' value),
179179
-- we'll actually collect a result.
180-
-> Peer ps pr (Pipelined Z c) st m a
180+
-> PeerPipelined ps pr st m a
181181
-> Peer ps pr NonPipelined st m a
182-
forgetPipelined = goSender EmptyQ
182+
forgetPipelined cs0 (PeerPipelined peer) = goSender EmptyQ cs0 peer
183183
where
184-
goSender :: forall st' n.
184+
goSender :: forall st' n c.
185185
Queue n c
186186
-> [Bool]
187187
-> Peer ps pr ('Pipelined n c) st' m a
@@ -196,7 +196,7 @@ forgetPipelined = goSender EmptyQ
196196
goSender (ConsQ x q) (_:cs) (Collect _ k) = goSender q cs (k x)
197197
goSender (ConsQ x q) cs@[] (Collect _ k) = goSender q cs (k x)
198198

199-
goReceiver :: forall stCurrent stNext n.
199+
goReceiver :: forall stCurrent stNext n c.
200200
Queue n c
201201
-> [Bool]
202202
-> Peer ps pr ('Pipelined (S n) c) stNext m a
@@ -218,17 +218,19 @@ forgetPipelined = goSender EmptyQ
218218
-- using `connectPipelined` function.
219219
--
220220
promoteToPipelined
221-
:: forall ps (pr :: PeerRole) st c m a.
221+
:: forall ps (pr :: PeerRole) st m a.
222222
Functor m
223-
=> Peer ps pr 'NonPipelined st m a
224-
-> Peer ps pr ('Pipelined Z c) st m a
225-
promoteToPipelined (Effect k) = Effect
226-
$ promoteToPipelined <$> k
227-
promoteToPipelined (Yield refl msg k) = Yield refl msg
228-
$ promoteToPipelined k
229-
promoteToPipelined (Await refl k) = Await refl
230-
$ promoteToPipelined . k
231-
promoteToPipelined (Done refl k) = Done refl k
223+
=> Peer ps pr NonPipelined st m a
224+
-> PeerPipelined ps pr st m a
225+
promoteToPipelined p = PeerPipelined (go p)
226+
where
227+
go :: forall st' c.
228+
Peer ps pr NonPipelined st' m a
229+
-> Peer ps pr (Pipelined Z c) st' m a
230+
go (Effect k) = Effect $ go <$> k
231+
go (Yield refl msg k) = Yield refl msg (go k)
232+
go (Await refl k) = Await refl (go . k)
233+
go (Done refl k) = Done refl k
232234

233235

234236
-- | Analogous to 'connect' but also for pipelined peers.
@@ -243,11 +245,11 @@ promoteToPipelined (Done refl k) = Done refl k
243245
--
244246
connectPipelined
245247
:: forall ps (pr :: PeerRole)
246-
(st :: ps) c m a b.
248+
(st :: ps) m a b.
247249
(Monad m, SingI pr)
248250
=> [Bool]
249-
-> Peer ps pr ('Pipelined Z c) st m a
250-
-> Peer ps (FlipAgency pr) NonPipelined st m b
251+
-> PeerPipelined ps pr st m a
252+
-> Peer ps (FlipAgency pr) NonPipelined st m b
251253
-> m (a, b, TerminalStates ps)
252254
connectPipelined csA a b =
253255
connect (forgetPipelined csA a) b

0 commit comments

Comments
 (0)