snaplet-wordpress-0.1.1.0: src/Snap/Snaplet/Wordpress/Utils.hs
{-# LANGUAGE OverloadedStrings #-}
module Snap.Snaplet.Wordpress.Utils where
import Control.Concurrent as CC
import qualified Control.Concurrent.Async as CC
import Data.Aeson (FromJSON, ToJSON)
import qualified Data.Aeson as J
import Data.Maybe
import Data.Monoid
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TL
import qualified Snap as SNAP
readSafe :: Read a => Text -> Maybe a
readSafe = fmap fst . listToMaybe . reads . T.unpack
tshow :: Show a => a -> Text
tshow = T.pack . show
terror :: Text -> a
terror = error . T.unpack
(=<<<) :: Monad r => (a -> r (Maybe b)) -> r (Maybe a) -> r (Maybe b)
f =<<< g = maybe (return Nothing) f =<< g
decode :: (FromJSON a) => Text -> Maybe a
decode = J.decodeStrict . T.encodeUtf8
encode :: (ToJSON a) => a -> Text
encode = TL.toStrict . TL.decodeUtf8 . J.encode
decodeJsonErr :: FromJSON a => Text -> a
decodeJsonErr res = case decode res of
Nothing -> terror $ "Unparsable JSON: " <> res
Just val -> val
decodeJson :: FromJSON a => Text -> Maybe a
decodeJson res = decode res
-- * -- IO Utilities -- * --
performOnJust :: (o -> IO ()) -> Maybe o -> IO ()
performOnJust = maybe (return ())
retryUnless :: IO (Maybe a) -> IO a
retryUnless action =
do ma <- action
case ma of
Just r -> return r
Nothing -> do CC.threadDelay 100000
retryUnless action
errorUnless :: Text -> IO (Maybe a) -> IO a
errorUnless msg action =
do ma <- action
case ma of
Just a -> return a
Nothing -> error $ T.unpack msg
concurrently :: [IO a] -> IO [a]
concurrently [] = return []
concurrently [a] =
do res <- a
return [res]
concurrently (a:as) =
do (r1, rs) <- CC.concurrently a (concurrently as)
return (r1:rs)
rqURI :: SNAP.Request -> Text
rqURI = T.decodeUtf8 . SNAP.rqURI