@@ -37,28 +37,32 @@ import Servant.API.BasicAuth
3737
3838
3939
40−data ReqResult a = ResponseSuccess a XhrResponse
41− | ResponseFailure Text XhrResponse
42− | RequestFailure Text
40+data ReqResult tag a = ResponseSuccess tag a XhrResponse
41+ | ResponseFailure tag Text XhrResponse
42+ | RequestFailure tag Text
4343
44−instance Functor ReqResult where
45− fmap f (ResponseSuccess a xhr) = ResponseSuccess (f a) xhr
46− fmap _ (ResponseFailure r x) = ResponseFailure r x
47− fmap _ (RequestFailure r) = RequestFailure r
44+instance Functor (ReqResult tag) where
45+ fmap f (ResponseSuccess tag a xhr) = ResponseSuccess tag (f a) xhr
46+ fmap _ (ResponseFailure tag r x) = ResponseFailure tag r x
47+ fmap _ (RequestFailure tag r) = RequestFailure tag r
4848
49−reqSuccess :: ReqResult a -> Maybe a
50−reqSuccess (ResponseSuccess x _) = Just x
51−reqSuccess _ = Nothing
49+reqSuccess :: ReqResult tag a -> Maybe a
50+reqSuccess (ResponseSuccess _ x _) = Just x
51+reqSuccess _ = Nothing
5252
53−reqFailure :: ReqResult a -> Maybe Text
54−reqFailure (ResponseFailure s _) = Just s
55−reqFailure (RequestFailure s) = Just s
56−reqFailure _ = Nothing
53+reqSuccess' :: ReqResult tag a -> Maybe (tag,a)
54+reqSuccess' (ResponseSuccess tag x _) = Just (tag,x)
55+reqSuccess' _ = Nothing
5756
58−response :: ReqResult a -> Maybe XhrResponse
59−response (ResponseSuccess _ x) = Just x
60−response (ResponseFailure _ x) = Just x
61−response _ = Nothing
57+reqFailure :: ReqResult tag a -> Maybe Text
58+reqFailure (ResponseFailure _ s _) = Just s
59+reqFailure (RequestFailure _ s) = Just s
60+reqFailure _ = Nothing
61+
62+response :: ReqResult tag a -> Maybe XhrResponse
63+response (ResponseSuccess _ _ x) = Just x
64+response (ResponseFailure _ _ x) = Just x
65+response _ = Nothing
6266
6367
6468-------------------------------------------------------------------------------
@@ -285,38 +289,39 @@ bytesToPayload :: BL.ByteString -> XhrPayload
285289bytesToPayload = TE.decodeUtf8 . BL.toStrict
286290
287291
288−performRequestNoBody :: forall t m tag.(SupportsServantReflex t m)
289− => Text
290− -> Req t
291− -> Dynamic t BaseUrl
292− -> Event t tag -> m (Event t (tag, ReqResult NoContent))
293−performRequestNoBody reqMeth req reqHost trigger = do
294− (resp, badReq) <- performRequest reqMeth req reqHost trigger
295− let decodeResp = const $ Right NoContent
296− return $ leftmost [ fmap (second (evalResponse decodeResp)) resp,
297− fmap (second RequestFailure) badReq]
298−
299−
300−
301−performRequestCT
302− :: (SupportsServantReflex t m,
303− MimeUnrender ct a)
304− => Proxy ct
305− -> Text
306− -> Req t
307− -> Dynamic t BaseUrl
308− -> Event t tag
309− -> m (Event t (tag, ReqResult a))
310−performRequestCT ct reqMeth req reqHost trigger = do
311− (resp, badReq) <- performRequest reqMeth req reqHost trigger
312− let decodeResp x = first T.pack .
313− mimeUnrender ct .
314− BL.fromStrict .
315− TE.encodeUtf8 =<< note "No body text"
316− (_xhrResponse_responseText x)
317−
318− return $ leftmost [fmap (second (evalResponse decodeResp)) resp,
319− fmap (second RequestFailure) badReq]
292+-- performRequestNoBody :: forall t m tag.(SupportsServantReflex t m)
293+-- => Text
294+-- -> Req t
295+-- -> Dynamic t BaseUrl
296+-- -> Event t tag -> m (Event t (ReqResult tag NoContent))
297+-- performRequestNoBody reqMeth req reqHost trigger = do
298+-- (resp, badReq) <- performRequest reqMeth req reqHost trigger
299+-- let decodeResp = const $ Right NoContent
300+-- return $ leftmost [ fmap (evalResponse decodeResp) resp
301+-- , fmap (uncurry RequestFailure) badReq
302+-- ]
303+
304+
305+-- performRequestCT
306+-- :: (SupportsServantReflex t m,
307+-- MimeUnrender ct a)
308+-- => Proxy ct
309+-- -> Text
310+-- -> Req t
311+-- -> Dynamic t BaseUrl
312+-- -> Event t tag
313+-- -> m (Event t (ReqResult tag a))
314+-- performRequestCT ct reqMeth req reqHost trigger = do
315+-- (resp, badReq) <- performRequest reqMeth req reqHost trigger
316+-- let decodeResp x = first T.pack .
317+-- mimeUnrender ct .
318+-- BL.fromStrict .
319+-- TE.encodeUtf8 =<< note "No body text"
320+-- (_xhrResponse_responseText x)
321+
322+-- return $ leftmost [fmap (evalResponse decodeResp) resp
323+-- , fmap (uncurry RequestFailure) badReq
324+-- ]
320325
321326
322327performRequestsCT
@@ -327,7 +332,7 @@ performRequestsCT
327332 -> Dynamic t (f (Req t))
328333 -> Dynamic t BaseUrl
329334 -> Event t tag
330− -> m (Event t (tag, f (ReqResult a)))
335+ -> m (Event t (f (ReqResult tag a)))
331336performRequestsCT ct reqMeth reqs reqHost trigger = do
332337 resps <- performRequests reqMeth reqs reqHost trigger
333338 let decodeResp x = first T.pack .
@@ -335,11 +340,12 @@ performRequestsCT ct reqMeth reqs reqHost trigger = do
335340 BL.fromStrict .
336341 TE.encodeUtf8 =<< note "No body text"
337342 (_xhrResponse_responseText x)
338− return $ ffor resps $ \(t, rs) ->
339− (t, ffor rs $ \r -> case r of
340− Left e -> RequestFailure e
341− Right g -> evalResponse decodeResp g
343+ return $ fmap
344+ (\(t,rs) -> ffor rs $ \r -> case r of
345+ Left e -> RequestFailure t e
346+ Right g -> evalResponse decodeResp (t,g)
342347 )
348+ resps
343349
344350
345351performRequestsNoBody
@@ -349,30 +355,32 @@ performRequestsNoBody
349355 -> Dynamic t (f (Req t))
350356 -> Dynamic t BaseUrl
351357 -> Event t tag
352− -> m (Event t (tag, f (ReqResult NoContent)))
358+ -> m (Event t (f (ReqResult tag NoContent)))
353359performRequestsNoBody reqMeth reqs reqHost trigger = do
354360 resps <- performRequests reqMeth reqs reqHost trigger
355361 let decodeResp = const $ Right NoContent
356− return $ ffor resps $ \(t, rs) ->
357− (t, ffor rs $ \r -> case r of
358− Left e -> RequestFailure e
359− Right g -> evalResponse decodeResp g
360− )
361−
362+ return $ ffor resps $ \(tag,rs) -> ffor rs $ \r -> case r of
363+ Left e -> RequestFailure tag e
364+ Right g -> evalResponse decodeResp (tag,g)
362365
363366
364367------------------------------------------------------------------------------
365−evalResponse :: (XhrResponse -> Either Text a) -> XhrResponse -> ReqResult a
366−evalResponse decode xhr =
368+evalResponse
369+ :: (XhrResponse -> Either Text a)
370+ -> (tag, XhrResponse)
371+ -> ReqResult tag a
372+evalResponse decode (tag, xhr) =
367373 let okStatus = _xhrResponse_status xhr < 400
368374 errMsg = fromMaybe
369375 ("Empty response with error code " <>
370376 T.pack (show $ _xhrResponse_status xhr))
371377 (_xhrResponse_responseText xhr)
372378 respPayld = if okStatus
373− then either (flip ResponseFailure xhr)
374− (flip ResponseSuccess xhr) (decode xhr)
375− else ResponseFailure errMsg xhr
379+ then either
380+ (\e -> ResponseFailure tag e xhr)
381+ (\v -> ResponseSuccess tag v xhr)
382+ (decode xhr)
383+ else ResponseFailure tag errMsg xhr
376384 in respPayld
377385
378386