Advertisement
Guest User

Untitled

a guest
May 1st, 2016
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.36 KB | None | 0 0
  1.  
  2. module Json.Render (
  3. render,
  4. ) where
  5.  
  6. import Json.SimpleJson (JsValue(..))
  7.  
  8. render :: JsValue -> String
  9. render JsNull = "null"
  10. render (JsBool True) = "true"
  11. render (JsBool False) = "false"
  12. render (JsNumber x) = show x
  13. render (JsString x) = show x
  14. render other = renderWithIndent 0 other
  15.  
  16. renderWithIndent :: Int -> JsValue -> String
  17.  
  18. renderWithIndent n (JsArray xs) = "[" ++ "\n"
  19. ++ renderContent (n + 2) xs
  20. ++ indent n "]"
  21. where renderContent n = unlines
  22. . punctuate ","
  23. . map (indent n . renderWithIndent n)
  24.  
  25. renderWithIndent n (JsObject ps) = "{" ++ "\n"
  26. ++ renderContent (n + 2) ps
  27. ++ indent n "}"
  28. where renderContent n = unlines
  29. . punctuate ","
  30. . map (indent n . renderPair n)
  31. renderPair n (k, v) = prefix ++ renderWithIndent n v
  32. where prefix = show k ++ ": "
  33.  
  34. renderWithIndent _ other = render other
  35.  
  36. spaces :: Int -> String
  37. spaces n = replicate n ' '
  38.  
  39. tabs :: Int -> String
  40. tabs = concat . replicate 2 . spaces
  41.  
  42. indent :: Int -> String -> String
  43. indent n s = spaces n ++ s
  44.  
  45. punctuate :: String -> [String] -> [String]
  46. punctuate p [] = []
  47. punctuate p [x] = [x]
  48. punctuate p (x:xs) = (x ++ p) : punctuate p xs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement