packages feed

json-tools-0.4.0: json-wrap.hs

{-# LANGUAGE OverloadedStrings #-}
import Data.List (intersperse)
import Data.Monoid
import Data.Aeson
import Data.Maybe
import qualified Data.HashMap.Strict as HM
import qualified Data.Vector as V
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as L8

-- wrap, as in line-wrapping

main :: IO ()
main = mapM_ L.putStr . ($["\n"]) . f . fromMaybe err . decode' =<< L.getContents
  where f (Array a)   = t"[" . cat (intersperse (t"\n,") (map j . V.toList $ a)) . t"]"
        f (Object o)  = t"{" . cat (intersperse (t"\n,") (map g . HM.toList $ o)) . t"}"
        f _           = error "impossible by decodeStrict post-condition"
        g (key, val)  = t (encode key) . t(L8.pack ":") . j val
        j             = t . encode
        err           = error "JSON decoding"
        t x           = (x:)
        cat           = appEndo . mconcat . map Endo