@@ -12,6 +12,7 @@ module Servant.Common.Req where
13-------------------------------------------------------------------------------
13-------------------------------------------------------------------------------
14import Control.Applicative (liftA2, liftA3)
14import Control.Applicative (liftA2, liftA3)
15+import Control.Arrow ((&&&))
15import Control.Concurrent
16import Control.Concurrent
16import Control.Monad (join)
17import Control.Monad (join)
17import Control.Monad.IO.Class (MonadIO, liftIO)
18import Control.Monad.IO.Class (MonadIO, liftIO)
@@ -91,6 +92,13 @@ reqFailure (ResponseFailure _ s _) = Just s
91reqFailure (RequestFailure _ s) = Just s
92reqFailure (RequestFailure _ s) = Just s
92reqFailure _ = Nothing
93reqFailure _ = Nothing
95+------------------------------------------------------------------------------
96+-- | Simple filter/accessor like 'reqFailure', but keeping the request tag
97+reqFailure' :: ReqResult tag a -> Maybe (tag,Text)
98+reqFailure' (ResponseFailure tag s _) = Just (tag,s)
99+reqFailure' (RequestFailure tag s) = Just (tag,s)
100+reqFailure' _ = Nothing
95------------------------------------------------------------------------------
103------------------------------------------------------------------------------
96-- | Simple filter/accessor for the raw XHR response
104-- | Simple filter/accessor for the raw XHR response
@@ -394,6 +402,18 @@ evalResponse decode (tag, xhr) =
394 else ResponseFailure tag errMsg xhr
402 else ResponseFailure tag errMsg xhr
395 in respPayld
403 in respPayld
405+------------------------------------------------------------------------------
406+-- | Utility for simultaneously accessing/filtering Success and Failure
407+-- response 'Event's,
408+fanReqResult :: Reflex t => Event t (ReqResult tag a) -> (Event t Text, Event t a)
409+fanReqResult = fmapMaybe reqFailure &&& fmapMaybe reqSuccess
411+------------------------------------------------------------------------------
412+-- | Utility for simultaneously accessing/filtering Success and Failure
413+-- response 'Event's, but keeping the request tag
414+fanReqResult' :: Reflex t => Event t (ReqResult tag a) -> (Event t (tag, Text), Event t (tag, a))
415+fanReqResult' = fmapMaybe reqFailure' &&& fmapMaybe reqSuccess'
398note :: e -> Maybe a -> Either e a
418note :: e -> Maybe a -> Either e a
399note e = maybe (Left e) Right
419note e = maybe (Left e) Right
@@ -407,3 +427,4 @@ builderToText = TE.decodeUtf8 . BL.toStrict . Builder.toLazyByteString
408escape :: T.Text -> T.Text
428escape :: T.Text -> T.Text
409escape = T.pack . N.escapeURIString (not . N.isReserved) . T.unpack . TE.decodeUtf8 . BL.toStrict . Builder.toLazyByteString . toEncodedUrlPiece
429escape = T.pack . N.escapeURIString (not . N.isReserved) . T.unpack . TE.decodeUtf8 . BL.toStrict . Builder.toLazyByteString . toEncodedUrlPiece