module Database.CouchDB.ViewServer.Parse
(
MonadParser(..)
, parseJSON
, parseJSONList
, (.:)
, (.:?)
, (.=)
, object
, Value(..)
) where
import Data.Aeson.Types hiding (typeMismatch, parseJSON, (.:), (.:?))
import qualified Data.Aeson.Types as JT
import Data.Text (Text)
import Data.Monoid
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Writer (WriterT)
class (Monad m) => MonadParser m where
liftParser :: Parser a -> m a
instance MonadParser Parser where
liftParser = id
instance (Monoid w, MonadParser m) => MonadParser (WriterT w m) where
liftParser = lift . liftParser
parseJSON :: (MonadParser m, FromJSON a) => Value -> m a
parseJSON value = liftParser $ JT.parseJSON value
parseJSONList :: (MonadParser m, FromJSON a) => [Value] -> m [a]
parseJSONList = mapM parseJSON
(.:) :: (MonadParser m, FromJSON a) => Object -> Text -> m a
doc .: key = liftParser $ doc JT..: key
(.:?) :: (MonadParser m, FromJSON a) => Object -> Text -> m (Maybe a)
doc .:? key = liftParser $ doc JT..:? key