on develop help sign in
add getAndDecode
commitee086c7a01a77dfb52a64e6a61bb3e80bdb3913f authorali abrar <aliabrar@gmail.com> dateSun 1 Mar 2015, 21:16 (12 years ago) parenta6a7bc5
3 files changed+23−3
default.nix+2−1 reflex-dom.cabal+3−1 src/Reflex/Dom/Xhr.hs+18−1
default.nix+2−1
@@ -1,6 +1,6 @@
11{ mkDerivation, dependent-map, ghcjs-dom, lens
22, mtl, reflex, safe, text, these
3−, transformers, data-default, semigroups
3+, transformers, data-default, semigroups, string-conv
44}:
55
66mkDerivation {
@@ -19,6 +19,7 @@ mkDerivation {
1919 text
2020 data-default
2121 semigroups
22+ string-conv
2223 ];
2324 license = null;
2425}
reflex-dom.cabal+3−1
@@ -33,7 +33,9 @@ library
3333 if impl(ghcjs)
3434 cpp-options: -D__GHCJS__
3535 build-depends:
36− ghcjs-base
36+ aeson,
37+ ghcjs-base,
38+ string-conv
3739
3840 exposed-modules:
3941 Reflex.Dom
src/Reflex/Dom/Xhr.hs+18−1
@@ -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