@@ -30,6 +30,7 @@ import Network.TypedProtocol.Core
3030import Network.TypedProtocol.Driver
3131import Network.TypedProtocol.Peer
3232
33+ import Control.DeepSeq (NFData , force )
3334import Control.Monad.Class.MonadAsync
3435import Control.Monad.Class.MonadThrow
3536import Control.Tracer (Tracer (.. ), contramap , traceWith )
@@ -72,7 +73,11 @@ instance Show (AnyMessage ps) => Show (TraceSendRecv ps) where
7273
7374
7475driverSimple :: forall ps pr failure bytes m .
75- (MonadThrow m , Exception failure )
76+ ( MonadEvaluate m
77+ , MonadThrow m
78+ , Exception failure
79+ , NFData failure
80+ )
7681 => Tracer m (TraceSendRecv ps )
7782 -> Codec ps failure m bytes
7883 -> Channel m bytes
@@ -119,7 +124,12 @@ driverSimple tracer Codec{encode, decode} channel@Channel{send} =
119124--
120125runPeer
121126 :: forall ps (st :: ps ) pr failure bytes m a .
122- (MonadThrow m , Exception failure )
127+ ( MonadEvaluate m
128+ , MonadThrow m
129+ , Exception failure
130+ , NFData failure
131+ , NFData a
132+ )
123133 => Tracer m (TraceSendRecv ps )
124134 -> Codec ps failure m bytes
125135 -> Channel m bytes
@@ -140,7 +150,13 @@ runPeer tracer codec channel peer =
140150--
141151runPipelinedPeer
142152 :: forall ps (st :: ps ) pr failure bytes m a .
143- (MonadAsync m , MonadThrow m , Exception failure )
153+ ( MonadAsync m
154+ , MonadEvaluate m
155+ , MonadThrow m
156+ , Exception failure
157+ , NFData failure
158+ , NFData a
159+ )
144160 => Tracer m (TraceSendRecv ps )
145161 -> Codec ps failure m bytes
146162 -> Channel m bytes
@@ -159,7 +175,10 @@ runPipelinedPeer tracer codec channel peer =
159175-- | Run a codec incremental decoder 'DecodeStep' against a channel. It also
160176-- takes any extra input data and returns any unused trailing data.
161177--
162- runDecoderWithChannel :: Monad m
178+ runDecoderWithChannel :: ( Monad m
179+ , MonadEvaluate m
180+ , NFData failure
181+ )
163182 => Channel m bytes
164183 -> Maybe bytes
165184 -> DecodeStep bytes failure m a
@@ -168,7 +187,7 @@ runDecoderWithChannel :: Monad m
168187runDecoderWithChannel Channel {recv} = go
169188 where
170189 go _ (DecodeDone x trailing) = return (Right (x, trailing))
171- go _ (DecodeFail failure) = return ( Left failure)
190+ go _ (DecodeFail failure) = Left <$> evaluate (force failure)
172191 go Nothing (DecodePartial k) = recv >>= k >>= go Nothing
173192 go (Just trailing) (DecodePartial k) = k (Just trailing) >>= go Nothing
174193
@@ -183,8 +202,14 @@ data Role = Client | Server
183202-- The first argument is expected to create two channels that are connected,
184203-- for example 'createConnectedChannels'.
185204--
186- runConnectedPeers :: (MonadAsync m , MonadCatch m ,
187- Exception failure )
205+ runConnectedPeers :: ( MonadAsync m
206+ , MonadCatch m
207+ , MonadEvaluate m
208+ , Exception failure
209+ , NFData failure
210+ , NFData a
211+ , NFData b
212+ )
188213 => m (Channel m bytes , Channel m bytes )
189214 -> Tracer m (Role , TraceSendRecv ps )
190215 -> Codec ps failure m bytes
@@ -201,8 +226,14 @@ runConnectedPeers createChannels tracer codec client server =
201226 tracerClient = contramap ((,) Client ) tracer
202227 tracerServer = contramap ((,) Server ) tracer
203228
204- runConnectedPeersPipelined :: (MonadAsync m , MonadCatch m ,
205- Exception failure )
229+ runConnectedPeersPipelined :: ( MonadAsync m
230+ , MonadCatch m
231+ , MonadEvaluate m
232+ , Exception failure
233+ , NFData failure
234+ , NFData a
235+ , NFData b
236+ )
206237 => m (Channel m bytes , Channel m bytes )
207238 -> Tracer m (PeerRole , TraceSendRecv ps )
208239 -> Codec ps failure m bytes
@@ -225,8 +256,12 @@ runConnectedPeersPipelined createChannels tracer codec client server =
225256--
226257runConnectedPeersAsymmetric
227258 :: ( MonadAsync m
259+ , MonadEvaluate m
228260 , MonadMask m
229261 , Exception failure
262+ , NFData failure
263+ , NFData a
264+ , NFData b
230265 )
231266 => m (Channel m bytes , Channel m bytes )
232267 -> Tracer m (Role , TraceSendRecv ps )
0 commit comments