{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS -Wno-orphans #-}
module TextShow.Data.Aeson where

import Data.Aeson (Value(..))
import qualified Data.Aeson.Key as K
import qualified Data.Aeson.KeyMap as KM

import Prelude ()
import Prelude.Compat

import TextShow ( TextShow(..), TextShow1(..)
                , fromText, showbParen, showbPrec1, showtToShowb, singleton )
import TextShow.Data.Scientific ()
import TextShow.Data.Vector ()
import TextShow.Utils (showbUnaryListWith)

instance TextShow K.Key where
    showb :: Key -> Builder
showb = (Key -> Text) -> Key -> Builder
forall a. (a -> Text) -> a -> Builder
showtToShowb Key -> Text
forall a. TextShow a => a -> Text
showt
    showt :: Key -> Text
showt = Text -> Text
forall a. TextShow a => a -> Text
showt (Text -> Text) -> (Key -> Text) -> Key -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Key -> Text
K.toText

instance TextShow Value where
    showbPrec :: Int -> Value -> Builder
showbPrec Int
_ Value
Null = Text -> Builder
fromText Text
"Null"
    showbPrec Int
d (Bool Bool
b) = Bool -> Builder -> Builder
showbParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10)
        (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Bool " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Bool -> Builder
forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Bool
b
    showbPrec Int
d (Number Scientific
s) = Bool -> Builder -> Builder
showbParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10)
        (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Number " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Scientific -> Builder
forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Scientific
s
    showbPrec Int
d (String Text
s) = Bool -> Builder -> Builder
showbParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10)
        (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"String " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Text -> Builder
forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Text
s
    showbPrec Int
d (Array Array
xs) = Bool -> Builder -> Builder
showbParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10)
        (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Array " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Array -> Builder
forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Array
xs
    showbPrec Int
d (Object Object
xs) = Bool -> Builder -> Builder
showbParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10)
        (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Object (fromList "
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> [(Key, Value)] -> Builder
forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 (Object -> [(Key, Value)]
forall v. KeyMap v -> [(Key, v)]
KM.toAscList Object
xs)
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Char -> Builder
singleton Char
')'

instance TextShow v => TextShow (KM.KeyMap v) where
    showbPrec :: Int -> KeyMap v -> Builder
showbPrec = Int -> KeyMap v -> Builder
forall (f :: * -> *) a.
(TextShow1 f, TextShow a) =>
Int -> f a -> Builder
showbPrec1

instance TextShow1 KM.KeyMap where
    liftShowbPrec :: forall a.
(Int -> a -> Builder)
-> ([a] -> Builder) -> Int -> KeyMap a -> Builder
liftShowbPrec Int -> a -> Builder
sp [a] -> Builder
sl Int
d KeyMap a
xs =
      ([(Key, a)] -> Builder) -> Int -> [(Key, a)] -> Builder
forall a. ([a] -> Builder) -> Int -> [a] -> Builder
showbUnaryListWith ((Int -> a -> Builder) -> ([a] -> Builder) -> [(Key, a)] -> Builder
forall a.
(Int -> a -> Builder) -> ([a] -> Builder) -> [(Key, a)] -> Builder
forall (f :: * -> *) a.
TextShow1 f =>
(Int -> a -> Builder) -> ([a] -> Builder) -> [f a] -> Builder
liftShowbList Int -> a -> Builder
sp [a] -> Builder
sl) Int
d (KeyMap a -> [(Key, a)]
forall v. KeyMap v -> [(Key, v)]
KM.toAscList KeyMap a
xs)