@@ -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--
171171forgetPipelined
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--
220220promoteToPipelined
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--
244246connectPipelined
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 )
252254connectPipelined csA a b =
253255 connect (forgetPipelined csA a) b
0 commit comments