packages feed

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 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 ()