{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Aeson.AutoType.Pretty() where
import qualified Data.HashMap.Strict as Hash
import Data.HashMap.Strict(HashMap)
import Data.Aeson
import qualified Data.Text as Text
import Data.Text (Text)
import Data.Set as Set(Set, toList)
import Data.Scientific
import Data.Vector as V(Vector, toList)
import Text.PrettyPrint.GenericPretty
import Text.PrettyPrint
formatPair :: (Out a, Out b) => (a, b) -> Doc
formatPair (a, b) = nest 1 (doc a <+> ": " <+> doc b <+> ",")
instance Out Scientific where
doc = doc . show
docPrec _ = doc
instance (Out a) => Out (Vector a) where
doc (V.toList -> v) = "<" <+> doc v <+> ">"
docPrec _ = doc
instance Out Value
instance (Out a) => Out (Set a) where
doc (Set.toList -> s) = "{" <+> doc s <+> "}"
docPrec _ = doc
instance (Out a, Out b) => Out (HashMap a b) where
doc (Hash.toList -> dict) = foldl ($$) "{" (map formatPair dict) $$ nest 1 "}"
docPrec _ = doc
instance Out Text where
doc = text . Text.unpack
docPrec _ = doc