module DebugPrint.Aeson
  ( debugPrintRecordToAeson
  , debugPrintValueToAeson
  ) where

import Prelude

import Data.Aeson qualified as Aeson
import Data.Aeson.Key qualified as Key
import Data.Aeson.KeyMap qualified as KeyMap
import Data.Bifunctor (bimap)
import Data.Map.Strict qualified as Map
import DebugPrint.Class
import DebugPrint.Types

debugPrintRecordToAeson :: ToDebugPrintRecord a => a -> Aeson.Object
debugPrintRecordToAeson :: forall a. ToDebugPrintRecord a => a -> Object
debugPrintRecordToAeson a
a =
  let DebugPrintRecord Map Text DebugPrintValue
m = a -> DebugPrintRecord
forall a. ToDebugPrintRecord a => a -> DebugPrintRecord
toDebugPrintRecord a
a
  in  [(Key, Value)] -> Object
forall v. [(Key, v)] -> KeyMap v
KeyMap.fromList
        ([(Key, Value)] -> Object) -> [(Key, Value)] -> Object
forall a b. (a -> b) -> a -> b
$ (Text -> Key)
-> (DebugPrintValue -> Value)
-> (Text, DebugPrintValue)
-> (Key, Value)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap Text -> Key
Key.fromText DebugPrintValue -> Value
forall a. ToDebugPrintValue a => a -> Value
debugPrintValueToAeson
          ((Text, DebugPrintValue) -> (Key, Value))
-> [(Text, DebugPrintValue)] -> [(Key, Value)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map Text DebugPrintValue -> [(Text, DebugPrintValue)]
forall k a. Map k a -> [(k, a)]
Map.toList Map Text DebugPrintValue
m

debugPrintValueToAeson :: ToDebugPrintValue a => a -> Aeson.Value
debugPrintValueToAeson :: forall a. ToDebugPrintValue a => a -> Value
debugPrintValueToAeson a
a = case a -> DebugPrintValue
forall a. ToDebugPrintValue a => a -> DebugPrintValue
toDebugPrintValue a
a of
  DebugPrintValueInt Integer
x -> Scientific -> Value
Aeson.Number (Scientific -> Value) -> Scientific -> Value
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
x
  DebugPrintValueText Text
x -> Text -> Value
Aeson.String Text
x
  DebugPrintValueBool Bool
x -> Bool -> Value
Aeson.Bool Bool
x
  DebugPrintValueVector Vector DebugPrintValue
x -> Array -> Value
Aeson.Array (Array -> Value) -> Array -> Value
forall a b. (a -> b) -> a -> b
$ (DebugPrintValue -> Value) -> Vector DebugPrintValue -> Array
forall a b. (a -> b) -> Vector a -> Vector b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DebugPrintValue -> Value
forall a. ToDebugPrintValue a => a -> Value
debugPrintValueToAeson Vector DebugPrintValue
x
  DebugPrintValueRecord DebugPrintRecord
x -> Object -> Value
Aeson.Object (Object -> Value) -> Object -> Value
forall a b. (a -> b) -> a -> b
$ DebugPrintRecord -> Object
forall a. ToDebugPrintRecord a => a -> Object
debugPrintRecordToAeson DebugPrintRecord
x