{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
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

instance Failure String Parser where
  failure = fail

instance Failure String Result where
  failure = Error

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