json-bytes-builder 0.2.1 → 0.2.1.1
raw patch · 6 files changed
+185/−144 lines, 6 filesdep ~base
Dependency ranges changed: base
Files
- json-bytes-builder.cabal +4/−4
- library/JSONBytesBuilder/BoundedPrims.hs +0/−72
- library/JSONBytesBuilder/Builder.hs +43/−2
- library/JSONBytesBuilder/Builders.hs +0/−66
- library/JSONBytesBuilder/ByteString/BoundedPrims.hs +72/−0
- library/JSONBytesBuilder/ByteString/Builders.hs +66/−0
json-bytes-builder.cabal view
@@ -1,7 +1,7 @@ name: json-bytes-builder version:- 0.2.1+ 0.2.1.1 synopsis: Direct-to-bytes JSON Builder description:@@ -45,8 +45,8 @@ Haskell2010 other-modules: JSONBytesBuilder.Prelude- JSONBytesBuilder.BoundedPrims- JSONBytesBuilder.Builders+ JSONBytesBuilder.ByteString.BoundedPrims+ JSONBytesBuilder.ByteString.Builders exposed-modules: JSONBytesBuilder.Builder JSONBytesBuilder.Interpreters.ByteStringBuilder@@ -58,5 +58,5 @@ bytestring == 0.10.*, semigroups >= 0.16 && < 0.20, base-prelude < 2,- base >= 4.6 && < 5+ base >= 4.7 && < 5
− library/JSONBytesBuilder/BoundedPrims.hs
@@ -1,72 +0,0 @@-module JSONBytesBuilder.BoundedPrims-where--import JSONBytesBuilder.Prelude-import Data.ByteString.Builder.Prim---{-# INLINE null #-}-null :: BoundedPrim ()-null =- ascii4 ('n', ('u', ('l', 'l')))--{-# INLINE boolean #-}-boolean :: BoundedPrim Bool-boolean =- condB id (ascii4 ('t', ('r', ('u', 'e')))) (ascii5 ('f', ('a', ('l', ('s', 'e')))))--{-# INLINE emptyArray #-}-emptyArray :: BoundedPrim ()-emptyArray =- ascii2 ('[', ']')--{-# INLINE emptyObject #-}-emptyObject :: BoundedPrim ()-emptyObject =- ascii2 ('{', '}')--{-# INLINE stringEncodedByte #-}-stringEncodedByte :: BoundedPrim Word8-stringEncodedByte =- condB (== (fromIntegral . ord) '\\') (ascii2 ('\\', '\\')) $- condB (== (fromIntegral . ord) '\"') (ascii2 ('\\', '"')) $- condB (>= (fromIntegral . ord) '\x20') (liftFixedToBounded word8) $- condB (== (fromIntegral . ord) '\n') (ascii2 ('\\', 'n')) $- condB (== (fromIntegral . ord) '\r') (ascii2 ('\\', 'r')) $- condB (== (fromIntegral . ord) '\t') (ascii2 ('\\', 't')) $- hexEncodedByte--{-# INLINE hexEncodedByte #-}-hexEncodedByte :: BoundedPrim Word8-hexEncodedByte =- liftFixedToBounded ((\c -> ('\\', ('u', fromIntegral c))) >$< char8 >*< char8 >*< word16HexFixed)--{-# INLINE ascii2 #-}-ascii2 :: (Char, Char) -> BoundedPrim a-ascii2 cs =- liftFixedToBounded $- const cs >$< char8 >*< char8--{-# INLINE ascii4 #-}-ascii4 :: (Char, (Char, (Char, Char))) -> BoundedPrim a-ascii4 cs =- liftFixedToBounded $- const cs >$< char8 >*< char8 >*< char8 >*< char8--{-# INLINE ascii5 #-}-ascii5 :: (Char, (Char, (Char, (Char, Char)))) -> BoundedPrim a-ascii5 cs =- liftFixedToBounded $- const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8--{-# INLINE ascii6 #-}-ascii6 :: (Char, (Char, (Char, (Char, (Char, Char))))) -> BoundedPrim a-ascii6 cs =- liftFixedToBounded $ - const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8--{-# INLINE ascii8 #-}-ascii8 :: (Char, (Char, (Char, (Char, (Char, (Char, (Char, Char))))))) -> BoundedPrim a-ascii8 cs =- liftFixedToBounded $- const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8
library/JSONBytesBuilder/Builder.hs view
@@ -1,5 +1,8 @@+-- |+-- DSL for construction of JSON. module JSONBytesBuilder.Builder (+ -- ** JSON builders JSON, null, boolean,@@ -10,8 +13,10 @@ string, object, array,+ -- ** Object builders Object, row,+ -- ** Array builders Array, element, )@@ -19,12 +24,16 @@ import JSONBytesBuilder.Prelude hiding (null) import qualified Data.ByteString.Builder as A-import qualified JSONBytesBuilder.Builders as E+import qualified JSONBytesBuilder.ByteString.Builders as E +-- |+-- Builder of any JSON value. newtype JSON = JSON A.Builder +-- |+-- Builder of a JSON Object value. newtype Object = Object (Maybe A.Builder) @@ -44,6 +53,8 @@ Object Nothing -> id +-- |+-- Builder of a JSON Array value. newtype Array = Array (Maybe A.Builder) @@ -63,56 +74,86 @@ Array Nothing -> id +-- |+-- JSON Null literal. {-# INLINE null #-} null :: JSON null = JSON (inline E.null) +-- |+-- JSON Boolean literal from 'Bool'. {-# INLINE boolean #-} boolean :: Bool -> JSON boolean = JSON . inline E.boolean +-- |+-- JSON Number literal from 'Int'. {-# INLINE number_int #-} number_int :: Int -> JSON number_int = JSON . inline A.intDec +-- |+-- JSON Number literal from 'Integer'. {-# INLINE number_integer #-} number_integer :: Integer -> JSON number_integer = JSON . inline A.integerDec +-- |+-- JSON Number literal from 'Double'. {-# INLINE number_double #-} number_double :: Double -> JSON number_double = JSON . inline A.doubleDec +-- |+-- JSON Number literal from 'Scientific'. {-# INLINE number_scientific #-} number_scientific :: Scientific -> JSON number_scientific = JSON . inline E.scientific +-- |+-- JSON String literal from 'Text'. {-# INLINE string #-} string :: Text -> JSON string = JSON . inline E.string +-- |+-- JSON Object literal from the 'Object' builder. {-# INLINE object #-} object :: Object -> JSON object (Object x) = JSON (maybe E.emptyObject (inline E.inCurlies) x) +-- |+-- JSON Array literal from the 'Array' builder. {-# INLINE array #-} array :: Array -> JSON array (Array x) =- JSON (maybe E.emptyArray (inline E.inCurlies) x)+ JSON (maybe E.emptyArray (inline E.inSquarelies) x) +-- |+-- Object builder from a key-value pair,+-- where value is an already encoded JSON literal.+-- +-- Use the 'Object' 'Monoid' instance+-- to construct multi-row objects. {-# INLINE row #-} row :: Text -> JSON -> Object row key (JSON value) = Object (Just (inline E.row key value)) +-- |+-- Array builder from an element,+-- which is an already encoded JSON literal.+-- +-- Use the 'Array' 'Monoid' instance+-- to construct multi-element arrays. {-# INLINE element #-} element :: JSON -> Array element (JSON value) =
− library/JSONBytesBuilder/Builders.hs
@@ -1,66 +0,0 @@-module JSONBytesBuilder.Builders-where--import JSONBytesBuilder.Prelude hiding (length, null)-import Data.ByteString.Builder-import qualified JSONBytesBuilder.BoundedPrims as A-import qualified Data.ByteString.Builder.Prim as A-import qualified Data.Text.Encoding as B-import qualified Data.Scientific as C-import qualified Data.ByteString.Builder.Scientific as D---{-# INLINABLE null #-}-null :: Builder-null =- A.primBounded A.null ()--{-# INLINABLE boolean #-}-boolean :: Bool -> Builder-boolean =- A.primBounded A.boolean--{-# INLINABLE string #-}-string :: Text -> Builder-string x =- char8 '"' <> B.encodeUtf8BuilderEscaped A.stringEncodedByte x <> char8 '"'--{-# INLINABLE scientific #-}-scientific :: Scientific -> Builder-scientific n =- if e < 0- then D.scientificBuilder n- else integerDec (C.coefficient n * 10 ^ e)- where- e =- C.base10Exponent n--{-# INLINABLE inCurlies #-}-inCurlies :: Builder -> Builder-inCurlies x =- char8 '{' <> x <> char8 '}'--{-# INLINABLE row #-}-row :: Text -> Builder -> Builder-row key value =- string key <> char8 ':' <> value--{-# INLINABLE inSquarlies #-}-inSquarlies :: Builder -> Builder-inSquarlies x =- char8 '[' <> x <> char8 ']'--{-# INLINABLE commaSeparated #-}-commaSeparated :: Builder -> Builder -> Builder-commaSeparated left right =- left <> char8 ',' <> right--{-# INLINABLE emptyObject #-}-emptyObject :: Builder-emptyObject =- A.primBounded A.emptyObject ()--{-# INLINABLE emptyArray #-}-emptyArray :: Builder-emptyArray =- A.primBounded A.emptyArray ()
+ library/JSONBytesBuilder/ByteString/BoundedPrims.hs view
@@ -0,0 +1,72 @@+module JSONBytesBuilder.ByteString.BoundedPrims+where++import JSONBytesBuilder.Prelude+import Data.ByteString.Builder.Prim+++{-# INLINE null #-}+null :: BoundedPrim ()+null =+ ascii4 ('n', ('u', ('l', 'l')))++{-# INLINE boolean #-}+boolean :: BoundedPrim Bool+boolean =+ condB id (ascii4 ('t', ('r', ('u', 'e')))) (ascii5 ('f', ('a', ('l', ('s', 'e')))))++{-# INLINE emptyArray #-}+emptyArray :: BoundedPrim ()+emptyArray =+ ascii2 ('[', ']')++{-# INLINE emptyObject #-}+emptyObject :: BoundedPrim ()+emptyObject =+ ascii2 ('{', '}')++{-# INLINE stringEncodedByte #-}+stringEncodedByte :: BoundedPrim Word8+stringEncodedByte =+ condB (== (fromIntegral . ord) '\\') (ascii2 ('\\', '\\')) $+ condB (== (fromIntegral . ord) '\"') (ascii2 ('\\', '"')) $+ condB (>= (fromIntegral . ord) '\x20') (liftFixedToBounded word8) $+ condB (== (fromIntegral . ord) '\n') (ascii2 ('\\', 'n')) $+ condB (== (fromIntegral . ord) '\r') (ascii2 ('\\', 'r')) $+ condB (== (fromIntegral . ord) '\t') (ascii2 ('\\', 't')) $+ hexEncodedByte++{-# INLINE hexEncodedByte #-}+hexEncodedByte :: BoundedPrim Word8+hexEncodedByte =+ liftFixedToBounded ((\c -> ('\\', ('u', fromIntegral c))) >$< char8 >*< char8 >*< word16HexFixed)++{-# INLINE ascii2 #-}+ascii2 :: (Char, Char) -> BoundedPrim a+ascii2 cs =+ liftFixedToBounded $+ const cs >$< char8 >*< char8++{-# INLINE ascii4 #-}+ascii4 :: (Char, (Char, (Char, Char))) -> BoundedPrim a+ascii4 cs =+ liftFixedToBounded $+ const cs >$< char8 >*< char8 >*< char8 >*< char8++{-# INLINE ascii5 #-}+ascii5 :: (Char, (Char, (Char, (Char, Char)))) -> BoundedPrim a+ascii5 cs =+ liftFixedToBounded $+ const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8++{-# INLINE ascii6 #-}+ascii6 :: (Char, (Char, (Char, (Char, (Char, Char))))) -> BoundedPrim a+ascii6 cs =+ liftFixedToBounded $ + const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8++{-# INLINE ascii8 #-}+ascii8 :: (Char, (Char, (Char, (Char, (Char, (Char, (Char, Char))))))) -> BoundedPrim a+ascii8 cs =+ liftFixedToBounded $+ const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8
+ library/JSONBytesBuilder/ByteString/Builders.hs view
@@ -0,0 +1,66 @@+module JSONBytesBuilder.ByteString.Builders+where++import JSONBytesBuilder.Prelude hiding (length, null)+import Data.ByteString.Builder+import qualified JSONBytesBuilder.ByteString.BoundedPrims as A+import qualified Data.ByteString.Builder.Prim as A+import qualified Data.Text.Encoding as B+import qualified Data.Scientific as C+import qualified Data.ByteString.Builder.Scientific as D+++{-# INLINABLE null #-}+null :: Builder+null =+ A.primBounded A.null ()++{-# INLINABLE boolean #-}+boolean :: Bool -> Builder+boolean =+ A.primBounded A.boolean++{-# INLINABLE string #-}+string :: Text -> Builder+string x =+ char8 '"' <> B.encodeUtf8BuilderEscaped A.stringEncodedByte x <> char8 '"'++{-# INLINABLE scientific #-}+scientific :: Scientific -> Builder+scientific n =+ if e < 0+ then D.scientificBuilder n+ else integerDec (C.coefficient n * 10 ^ e)+ where+ e =+ C.base10Exponent n++{-# INLINABLE inCurlies #-}+inCurlies :: Builder -> Builder+inCurlies x =+ char8 '{' <> x <> char8 '}'++{-# INLINABLE row #-}+row :: Text -> Builder -> Builder+row key value =+ string key <> char8 ':' <> value++{-# INLINABLE inSquarelies #-}+inSquarelies :: Builder -> Builder+inSquarelies x =+ char8 '[' <> x <> char8 ']'++{-# INLINABLE commaSeparated #-}+commaSeparated :: Builder -> Builder -> Builder+commaSeparated left right =+ left <> char8 ',' <> right++{-# INLINABLE emptyObject #-}+emptyObject :: Builder+emptyObject =+ A.primBounded A.emptyObject ()++{-# INLINABLE emptyArray #-}+emptyArray :: Builder+emptyArray =+ A.primBounded A.emptyArray ()