@@ -5,10 +5,12 @@ module Reflex.Dom.Xhr where
5import Control.Lens
5import Control.Lens
6import Control.Monad
6import Control.Monad
7import Control.Monad.IO.Class
7import Control.Monad.IO.Class
8import Data.Default
9import Data.Default
9import Data.Map (Map)
10import Data.Map (Map)
10import qualified Data.Map as Map
11import qualified Data.Map as Map
11import Data.Maybe
12import Data.Maybe
13+import Data.String.Conv
12import Data.Text (Text)
14import Data.Text (Text)
13import qualified Data.Text as T
15import qualified Data.Text as T
14import GHCJS.Foreign
16import GHCJS.Foreign
@@ -51,7 +53,7 @@ newXMLHttpRequest req cb = do
51 xhr <- xmlHttpRequestNew
53 xhr <- xmlHttpRequestNew
52 let c = _xhrRequest_config req
54 let c = _xhrRequest_config req
53 xmlHttpRequestOpen
55 xmlHttpRequestOpen
55 (_xhrRequest_method req)
57 (_xhrRequest_method req)
56 (_xhrRequest_url req)
58 (_xhrRequest_url req)
@@ -74,4 +76,19 @@ performRequestAsync :: MonadWidget t m => Event t XhrRequest -> m (Event t XhrRe
74performRequestAsync req = performEventAsync $ ffor req $ \r cb -> do
76performRequestAsync req = performEventAsync $ ffor req $ \r cb -> do
75 liftIO $ newXMLHttpRequest r cb
77 liftIO $ newXMLHttpRequest r cb
80+getAndDecode :: (FromJSON a, MonadWidget t m) => Event t String -> m (Event t (Maybe a))
82+ r <- performRequestAsync $ fmap (\x -> XhrRequest "GET" x def) url
83+ return $ fmap decodeXhrResponse r
85+decodeText :: FromJSON a => Text -> Maybe a
86+decodeText = decode . toS
88+decodeJSString :: FromJSON a => JSString -> Maybe a
89+decodeJSString = decodeText . fromJSString
91+decodeXhrResponse :: FromJSON a => XhrResponse -> Maybe a
92+decodeXhrResponse = join . fmap decodeJSString . _xhrResponse_body