summaryrefslogtreecommitdiff
path: root/Utility
diff options
context:
space:
mode:
Diffstat (limited to 'Utility')
-rw-r--r--Utility/JSONStream.hs44
1 files changed, 44 insertions, 0 deletions
diff --git a/Utility/JSONStream.hs b/Utility/JSONStream.hs
new file mode 100644
index 000000000..af3766948
--- /dev/null
+++ b/Utility/JSONStream.hs
@@ -0,0 +1,44 @@
+{- 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 = take (length s - 1) 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