{-# LANGUAGE OverloadedStrings #-} import Data.List (intersperse) import Data.Map (toList) import Data.Monoid import Text.JSON.AttoJSON import qualified Data.ByteString as S -- wrap, as in line-wrapping main :: IO () main = mapM_ S.putStr . ($[]) . f . either err id . parseJSON =<< S.getContents where f (JSArray a) = t"[" . cat (intersperse (t"\n,") (map (t . showJSON) a)) . t"]" f (JSObject o) = t"{" . cat (intersperse (t"\n,") (map g . toList $ o)) . t"}" f _ = error "impossible by decodeStrict post-condition" g (key, val) = t key . t ":" . (t . showJSON) val err s = error $ "JSON decoding: " ++ s t x = (x:) cat = appEndo . mconcat . map Endo