44 lines
906 B
Haskell
44 lines
906 B
Haskell
{- Streaming JSON output.
|
|
-
|
|
- Copyright 2011 Joey Hess <joey@kitenet.net>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Utility.JSONStream (
|
|
start,
|
|
add,
|
|
end
|
|
) where
|
|
|
|
import Text.JSON
|
|
|
|
{- Text.JSON does not support building up a larger JSON document piece by
|
|
piece as a stream. To support streaming, a hack. The JSObject is converted
|
|
to a string with its final "}" is left off, allowing it to be added to
|
|
later. -}
|
|
start :: JSON a => [(String, a)] -> String
|
|
start l
|
|
| last s == endchar = init s
|
|
| otherwise = bad s
|
|
where
|
|
s = encodeStrict $ toJSObject l
|
|
|
|
add :: JSON a => [(String, a)] -> String
|
|
add l
|
|
| head s == startchar = ',' : drop 1 s
|
|
| otherwise = bad s
|
|
where
|
|
s = start l
|
|
|
|
end :: String
|
|
end = [endchar, '\n']
|
|
|
|
startchar :: Char
|
|
startchar = '{'
|
|
|
|
endchar :: Char
|
|
endchar = '}'
|
|
|
|
bad :: String -> a
|
|
bad s = error $ "Text.JSON returned unexpected string: " ++ s
|