@@ -22,12 +22,16 @@ import Control.Lens
2222import Control.Monad hiding (forM)
2323import Control.Monad.IO.Class
2424import Data.Aeson
25+import Data.Aeson.Encode
26+import qualified Data.Text.Lazy as LT
27+import qualified Data.Text.Lazy.Builder as B
2528import qualified Data.ByteString.Lazy as BL
2629import Data.Default
2730import Data.Map (Map)
2831import qualified Data.Map as Map
2932import Data.Maybe
3033import Data.Text (Text)
34+import qualified Data.Text as T
3135import Data.Text.Encoding
3236import Data.Traversable
3337import Reflex
@@ -117,6 +121,15 @@ getAndDecode url = do
117121 r <- performRequestAsync $ fmap (\x -> XhrRequest "GET" x def) url
118122 return $ fmap decodeXhrResponse r
119123
124+-- | Create a "POST" request from an URL and thing with a JSON representation
125+postJson :: (ToJSON a) => String -> a -> XhrRequest
126+postJson url a =
127+ XhrRequest "POST" url $ def { _xhrRequestConfig_headers = headerUrlEnc
128+ , _xhrRequestConfig_sendData = Just body
129+ }
130+ where headerUrlEnc = "Content-type" =: "application/json"
131+ body = LT.unpack . B.toLazyText . encodeToTextBuilder $ a
132+
120133getMay :: MonadWidget t m => (Event t a -> m (Event t b)) -> Event t (Maybe a) -> m (Event t (Maybe b))
121134getMay f e = do
122135 e' <- f (fmapMaybe id e)