module Data.Aeson.OneLine
( renderValue
, renderObject
, renderArray
) where
import qualified Data.Aeson.Text as Aeson
import qualified Data.Aeson.Types as Aeson
import qualified Data.Aeson.KeyMap as Aeson.KeyMap
import qualified Data.Foldable as Foldable
import Data.Function (on)
import Data.List (sortBy)
import Prelude hiding ((+))
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.Lazy as LText
import qualified Data.Text.Lazy.Builder as LText
(+) :: Text -> Text -> Text
+ :: Text -> Text -> Text
(+) = Text -> Text -> Text
Text.append
commaSeparate :: [Text] -> Text
commaSeparate :: [Text] -> Text
commaSeparate = Text -> [Text] -> Text
Text.intercalate (String -> Text
Text.pack String
", ")
renderValue :: Aeson.Value -> Text
renderValue :: Value -> Text
renderValue Value
val =
case Value
val of
Aeson.Object Object
x -> Object -> Text
renderObject Object
x
Aeson.Array Array
x -> Array -> Text
renderArray Array
x
Value
x -> Value -> Text
renderTerse Value
x
renderTerse :: Aeson.Value -> Text
renderTerse :: Value -> Text
renderTerse =
Text -> Text
LText.toStrict (Text -> Text) -> (Value -> Text) -> Value -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
LText.toLazyText (Builder -> Text) -> (Value -> Builder) -> Value -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Builder
forall a. ToJSON a => a -> Builder
Aeson.encodeToTextBuilder
renderObject :: Aeson.Object -> Text
renderObject :: Object -> Text
renderObject Object
obj =
String -> Text
Text.pack String
"{" Text -> Text -> Text
+ Text
x Text -> Text -> Text
+ String -> Text
Text.pack String
"}"
where
x :: Text
x :: Text
x = [Text] -> Text
commaSeparate ((Key, Value) -> Text
f ((Key, Value) -> Text) -> [(Key, Value)] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object -> [(Key, Value)]
objectToListAsc Object
obj)
f :: (Aeson.Key, Aeson.Value) -> Text
f :: (Key, Value) -> Text
f (Key
k, Value
v) = Value -> Text
renderTerse (Key -> Value
forall a. ToJSON a => a -> Value
Aeson.toJSON Key
k) Text -> Text -> Text
+
String -> Text
Text.pack String
": " Text -> Text -> Text
+ Value -> Text
renderValue Value
v
renderArray :: Aeson.Array -> Text
renderArray :: Array -> Text
renderArray Array
arr =
String -> Text
Text.pack String
"[" Text -> Text -> Text
+ Text
x Text -> Text -> Text
+ String -> Text
Text.pack String
"]"
where
x :: Text
x = [Text] -> Text
commaSeparate (Value -> Text
renderValue (Value -> Text) -> [Value] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Array -> [Value]
forall (t :: * -> *) a. Foldable t => t a -> [a]
Foldable.toList Array
arr)
objectToListAsc :: Aeson.Object -> [(Aeson.Key, Aeson.Value)]
objectToListAsc :: Object -> [(Key, Value)]
objectToListAsc = ((Key, Value) -> (Key, Value) -> Ordering)
-> [(Key, Value)] -> [(Key, Value)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (Key -> Key -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Key -> Key -> Ordering)
-> ((Key, Value) -> Key)
-> (Key, Value)
-> (Key, Value)
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (Key, Value) -> Key
forall a b. (a, b) -> a
fst) ([(Key, Value)] -> [(Key, Value)])
-> (Object -> [(Key, Value)]) -> Object -> [(Key, Value)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Object -> [(Key, Value)]
forall v. KeyMap v -> [(Key, v)]
Aeson.KeyMap.toList