diff options
Diffstat (limited to 'server/src/Network/QueryResponse.hs')
-rw-r--r-- | server/src/Network/QueryResponse.hs | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/server/src/Network/QueryResponse.hs b/server/src/Network/QueryResponse.hs index ea87abe4..69cc6f50 100644 --- a/server/src/Network/QueryResponse.hs +++ b/server/src/Network/QueryResponse.hs | |||
@@ -188,17 +188,16 @@ partitionTransport parse encodex tr = | |||
188 | -- Note: If you add a handler to one of the branches before applying a | 188 | -- Note: If you add a handler to one of the branches before applying a |
189 | -- 'mergeTransports' combinator, then this handler may not block or return | 189 | -- 'mergeTransports' combinator, then this handler may not block or return |
190 | -- Nothing. | 190 | -- Nothing. |
191 | addHandler :: (err -> IO ()) -> (addr -> x -> IO (Maybe (x -> x))) -> TransportA err addr x y -> TransportA err addr x y | 191 | addHandler :: (addr -> x -> IO (Maybe (x -> x))) -> TransportA err addr x y -> TransportA err addr x y |
192 | addHandler onParseError f tr = tr | 192 | addHandler f tr = tr |
193 | { awaitMessage = \kont -> fix $ \eat -> awaitMessage tr $ \case | 193 | { awaitMessage = \kont -> fix $ \eat -> awaitMessage tr $ \case |
194 | Arrival addr x -> f addr x >>= maybe (join $ atomically eat) (kont . Arrival addr . ($ x)) | 194 | Arrival addr x -> f addr x >>= maybe (join $ atomically eat) (kont . Arrival addr . ($ x)) |
195 | ParseError e -> onParseError e >> kont (ParseError e) | 195 | m -> kont m |
196 | Terminated -> kont Terminated | ||
197 | } | 196 | } |
198 | 197 | ||
199 | -- | Modify a 'Transport' to invoke an action upon every received packet. | 198 | -- | Modify a 'Transport' to invoke an action upon every received packet. |
200 | onInbound :: (addr -> x -> IO ()) -> Transport err addr x -> Transport err addr x | 199 | onInbound :: (addr -> x -> IO ()) -> Transport err addr x -> Transport err addr x |
201 | onInbound f tr = addHandler (const $ return ()) (\addr x -> f addr x >> return (Just id)) tr | 200 | onInbound f tr = addHandler (\addr x -> f addr x >> return (Just id)) tr |
202 | 201 | ||
203 | -- * Using a query\/response client. | 202 | -- * Using a query\/response client. |
204 | 203 | ||
@@ -208,19 +207,20 @@ onInbound f tr = addHandler (const $ return ()) (\addr x -> f addr x >> return ( | |||
208 | -- Example usage: | 207 | -- Example usage: |
209 | -- | 208 | -- |
210 | -- > -- Start client. | 209 | -- > -- Start client. |
211 | -- > quitServer <- forkListener "listener" (clientNet client) | 210 | -- > quitServer <- forkListener "listener" (\_ -> return()) (clientNet client) |
212 | -- > -- Send a query q, recieve a response r. | 211 | -- > -- Send a query q, recieve a response r. |
213 | -- > r <- sendQuery client method q | 212 | -- > r <- sendQuery client method q |
214 | -- > -- Quit client. | 213 | -- > -- Quit client. |
215 | -- > quitServer | 214 | -- > quitServer |
216 | forkListener :: String -> Transport err addr x -> IO (IO ()) | 215 | forkListener :: String -> (err -> IO ()) -> Transport err addr x -> IO (IO ()) |
217 | forkListener name client = do | 216 | forkListener name onParseError client = do |
218 | setActive client True | 217 | setActive client True |
219 | thread_id <- forkIO $ do | 218 | thread_id <- forkIO $ do |
220 | myThreadId >>= flip labelThread ("listener."++name) | 219 | myThreadId >>= flip labelThread ("listener."++name) |
221 | fix $ \loop -> join $ atomically $ awaitMessage client $ \case | 220 | fix $ \loop -> join $ atomically $ awaitMessage client $ \case |
222 | Terminated -> return () | 221 | Terminated -> return () |
223 | _ -> loop | 222 | ParseError e -> onParseError e >> loop |
223 | _ -> loop | ||
224 | dput XMisc $ "Listener died: " ++ name | 224 | dput XMisc $ "Listener died: " ++ name |
225 | return $ do | 225 | return $ do |
226 | setActive client False | 226 | setActive client False |