{-# LANGUAGE FlexibleContexts #-}
module Data.Aeson.Toolkit where

import           Data.Text (Text)
import qualified Data.ByteString.Lazy as L
import           Control.Failure
import           Data.Aeson as Aeson
import           Data.Aeson.Types

decode :: (FromJSON a, Failure String m) => L.ByteString -> m a
decode = either failure return . eitherDecode

decode' :: (FromJSON a, Failure String m) => L.ByteString -> m a
decode' = either failure return . eitherDecode'

(.:) :: (Failure String m, FromJSON a) => Object -> Text -> m a
o .: k = (either failure return . parseEither (Aeson..: k)) o