@@ -5,10 +5,12 @@ module Reflex.Dom.Xhr where
55import Control.Lens
66import Control.Monad
77import Control.Monad.IO.Class
8+import Data.Aeson
89import Data.Default
910import Data.Map (Map)
1011import qualified Data.Map as Map
1112import Data.Maybe
13+import Data.String.Conv
1214import Data.Text (Text)
1315import qualified Data.Text as T
1416import GHCJS.Foreign
@@ -51,7 +53,7 @@ newXMLHttpRequest req cb = do
5153 xhr <- xmlHttpRequestNew
5254 let c = _xhrRequest_config req
5355 xmlHttpRequestOpen
54− xhr
56+ xhr
5557 (_xhrRequest_method req)
5658 (_xhrRequest_url req)
5759 True
@@ -74,4 +76,19 @@ performRequestAsync :: MonadWidget t m => Event t XhrRequest -> m (Event t XhrRe
7476performRequestAsync req = performEventAsync $ ffor req $ \r cb -> do
7577 liftIO $ newXMLHttpRequest r cb
7678 return ()
79+
80+getAndDecode :: (FromJSON a, MonadWidget t m) => Event t String -> m (Event t (Maybe a))
81+getAndDecode url = do
82+ r <- performRequestAsync $ fmap (\x -> XhrRequest "GET" x def) url
83+ return $ fmap decodeXhrResponse r
84+
85+decodeText :: FromJSON a => Text -> Maybe a
86+decodeText = decode . toS
87+
88+decodeJSString :: FromJSON a => JSString -> Maybe a
89+decodeJSString = decodeText . fromJSString
90+
91+decodeXhrResponse :: FromJSON a => XhrResponse -> Maybe a
92+decodeXhrResponse = join . fmap decodeJSString . _xhrResponse_body
93+
7794#endif