J'ai choisi de centrer cette question autour des objets JSON et wl-pprint-annotated (here is the paper behind that library) parce qu'ils le rendre facile d'avoir un MVCE, mais mon problème est pas vraiment autour jolie impression seulement objets JSON et Je suis flexible pour quelle jolie bibliothèque j'utilise.objets JavaScript Jolie impression
Tenir compte du type de données objet JavaScript simplifié suivant:
data Object = Object [(String, Object)]
| String String
Comment puis-je définir une fonction assez d'impression qui enveloppe sa sortie à plusieurs lignes de la manière habituelle? Ce que je veux dire par là est: la sortie joliment imprimée devrait, autant que possible, tenir sur une ligne. Quand ce n'est pas possible, je m'attends à ce que les objets les plus externes commencent à ajouter des nouvelles lignes avant les lignes internes.
Voici une tentative à l'aide wl-pprint-annotated:
{-# LANGUAGE OverloadedString #-}
import Text.PrettyPrint.Annotated.WL
prettyObject :: Object -> Doc a
prettyObject (String str) = "\"" <> text str <> "\""
prettyObject (Object fields) = Union ("{" <+> hsep fields' <+> "}")
("{" <#> indent 2 (vsep fields') <#> "}")
where
fields' :: [Doc a]
fields' = punctuate "," [ text key <> ":" <+> prettyObject val
| (key,val) <- fields ]
Maintenant, certains cas de test.
ghci> o1 = Object [("key1", String "val1")]
ghci> o2 = Object [("key2", String "val2"), ("looooooooooong key3", String "loooooooooooong val3"),("key4", String "val4")]
ghci> o3 = Object [("key5", String "val5"), ("key6", o2), ("key7", String "val7")]
ghci> prettyObject o1
{ key1: "val1" }
ghci> prettyObject o2
{
key2: "val2",
looooooooooong key3: "loooooooooooong val3",
key4: "val4"
}
ghci> prettyObject o3
{ key5: { key1: "val1" }, key6: {
key2: "val2",
looooooooooong key3: "loooooooooooong val3",
key4: "val4"
}, key7: "val7" }
Je voudrais la dernière sortie à la place être
{
key5: { key1: "val1" },
key6: {
key2: "val2",
looooooooooong key3: "loooooooooooong val3",
key4: "val4"
},
key7: "val7"
}
Je suis à la recherche d'une solution qui correspond en quelque sorte avec l'une des bibliothèques jolie impression existantes dans Haskell (en réalité, je suis joli-impression beaucoup plus qu'un simple sous-ensemble de JSON).
Je suis pas à la recherche d'une solution qui définit un prettyObject :: Object -> String
- le point de l'ensemble de cette approche est que le rendu du Doc
dépend de l'endroit où il est dans la grande image de ce qui est assez imprimé.
Merci beaucoup! C'est vraiment une réponse/explication étonnante. – Alec