json-syntax 0.2.4.0 → 0.2.5.0
raw patch · 3 files changed
+138/−4 lines, 3 files
Files
- CHANGELOG.md +9/−1
- json-syntax.cabal +2/−1
- src/Json.hs +127/−2
CHANGELOG.md view
@@ -1,6 +1,14 @@ # Revision history for json-syntax -## 0.2.4.0 -- 2023-??-??+## 0.2.5.0 -- 2023-07-25++* Add `object(13|14|15|16|17)`.+* Add `ToValue` instances for `Word`, `Text`, `Value`,+ `Scientific`, list (i.e. `[]`), the unit type (i.e. `()`),+* Add `text` and `shortText` for value construction.+ ++## 0.2.4.0 -- 2023-06-27 * Add typeclass `ToValue` for encoding. * Add functions `int`, `(int|word)(8|16|32|64)`, `bool` for constructing
json-syntax.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: json-syntax-version: 0.2.4.0+version: 0.2.5.0 synopsis: High-performance JSON parser and encoder description: This library parses JSON into a @Value@ type that is consistent with the@@ -46,6 +46,7 @@ , text-short >=0.1.3 && <0.2 , word-compat >=0.0.3 , zigzag >=0.0.1+ , text >=1.2 hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall -O2
src/Json.hs view
@@ -37,6 +37,8 @@ , word32 , word64 , bool+ , text+ , shortText -- * Object Construction , object1 , object2@@ -50,12 +52,16 @@ , object10 , object11 , object12+ , object13+ , object14+ , object15+ , object16 ) where import Prelude hiding (Bool(True,False)) import Control.Exception (Exception)-import Control.Monad.ST (ST)+import Control.Monad.ST (ST,runST) import Control.Monad.ST.Run (runSmallArrayST) import Data.Bits ((.&.),(.|.),unsafeShiftR) import Data.Builder.ST (Builder)@@ -68,6 +74,7 @@ import GHC.Exts (Char(C#),Int(I#),gtWord#,ltWord#,word2Int#,chr#) import GHC.Word (Word8,Word16,Word32,Word64) import GHC.Int (Int8,Int16,Int32,Int64)+import Data.Text (Text) import qualified Prelude import qualified Data.Builder.ST as B@@ -82,6 +89,8 @@ import qualified Data.Bytes.Parser.Latin as Latin import qualified Data.ByteString.Short.Internal as BSS import qualified Data.Bytes.Parser.Unsafe as Unsafe+import qualified Data.Text.Short as TS+import qualified Data.List as List import qualified GHC.Word.Compat -- | The JSON syntax tree described by the ABNF in RFC 7159. Notable@@ -598,6 +607,93 @@ PM.writeSmallArray dst 11 l PM.unsafeFreezeSmallArray dst +-- | Construct a JSON object with thirteen members.+object13 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member+ -> Member -> Member -> Member -> Member -> Member -> Value+{-# inline object13 #-}+object13 a b c d e f g h i j k l m = Object $ runSmallArrayST $ do+ dst <- PM.newSmallArray 13 a+ PM.writeSmallArray dst 1 b+ PM.writeSmallArray dst 2 c+ PM.writeSmallArray dst 3 d+ PM.writeSmallArray dst 4 e+ PM.writeSmallArray dst 5 f+ PM.writeSmallArray dst 6 g+ PM.writeSmallArray dst 7 h+ PM.writeSmallArray dst 8 i+ PM.writeSmallArray dst 9 j+ PM.writeSmallArray dst 10 k+ PM.writeSmallArray dst 11 l+ PM.writeSmallArray dst 12 m+ PM.unsafeFreezeSmallArray dst++-- | Construct a JSON object with fourteen members.+object14 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member+ -> Member -> Member -> Member -> Member -> Member -> Member -> Value+{-# inline object14 #-}+object14 a b c d e f g h i j k l m n = Object $ runSmallArrayST $ do+ dst <- PM.newSmallArray 14 a+ PM.writeSmallArray dst 1 b+ PM.writeSmallArray dst 2 c+ PM.writeSmallArray dst 3 d+ PM.writeSmallArray dst 4 e+ PM.writeSmallArray dst 5 f+ PM.writeSmallArray dst 6 g+ PM.writeSmallArray dst 7 h+ PM.writeSmallArray dst 8 i+ PM.writeSmallArray dst 9 j+ PM.writeSmallArray dst 10 k+ PM.writeSmallArray dst 11 l+ PM.writeSmallArray dst 12 m+ PM.writeSmallArray dst 13 n+ PM.unsafeFreezeSmallArray dst++-- | Construct a JSON object with fifteen members.+object15 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member+ -> Member -> Member -> Member -> Member -> Member -> Member -> Member -> Value+{-# inline object15 #-}+object15 a b c d e f g h i j k l m n o = Object $ runSmallArrayST $ do+ dst <- PM.newSmallArray 14 a+ PM.writeSmallArray dst 1 b+ PM.writeSmallArray dst 2 c+ PM.writeSmallArray dst 3 d+ PM.writeSmallArray dst 4 e+ PM.writeSmallArray dst 5 f+ PM.writeSmallArray dst 6 g+ PM.writeSmallArray dst 7 h+ PM.writeSmallArray dst 8 i+ PM.writeSmallArray dst 9 j+ PM.writeSmallArray dst 10 k+ PM.writeSmallArray dst 11 l+ PM.writeSmallArray dst 12 m+ PM.writeSmallArray dst 13 n+ PM.writeSmallArray dst 14 o+ PM.unsafeFreezeSmallArray dst++-- | Construct a JSON object with sixteen members.+object16 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member+ -> Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member+ -> Value+{-# inline object16 #-}+object16 a b c d e f g h i j k l m n o p = Object $ runSmallArrayST $ do+ dst <- PM.newSmallArray 14 a+ PM.writeSmallArray dst 1 b+ PM.writeSmallArray dst 2 c+ PM.writeSmallArray dst 3 d+ PM.writeSmallArray dst 4 e+ PM.writeSmallArray dst 5 f+ PM.writeSmallArray dst 6 g+ PM.writeSmallArray dst 7 h+ PM.writeSmallArray dst 8 i+ PM.writeSmallArray dst 9 j+ PM.writeSmallArray dst 10 k+ PM.writeSmallArray dst 11 l+ PM.writeSmallArray dst 12 m+ PM.writeSmallArray dst 13 n+ PM.writeSmallArray dst 14 o+ PM.writeSmallArray dst 15 p+ PM.unsafeFreezeSmallArray dst+ word8 :: Word8 -> Json.Value {-# inline word8 #-} word8 = Json.Number . SCI.fromWord8@@ -634,14 +730,27 @@ {-# inline int #-} int = Json.Number . SCI.fromInt +text :: Text -> Json.Value+{-# inline text #-}+text = Json.String . TS.fromText++shortText :: ShortText -> Json.Value+{-# inline shortText #-}+shortText = String+ bool :: Prelude.Bool -> Json.Value {-# inline bool #-} bool Prelude.True = True bool _ = False +-- | Typeclass for types that can be encoded as JSON. class ToValue a where toValue :: a -> Value +-- | Encodes the unit value as JSON @null@.+instance ToValue () where {toValue _ = Null}+instance ToValue Value where {toValue = id}+instance ToValue Scientific where {toValue = Number} instance ToValue Int where {toValue = int} instance ToValue Int8 where {toValue = int8} instance ToValue Int16 where {toValue = int16}@@ -651,8 +760,24 @@ instance ToValue Word16 where {toValue = word16} instance ToValue Word32 where {toValue = word32} instance ToValue Word64 where {toValue = word64}-instance ToValue ShortText where {toValue = String}+instance ToValue ShortText where {toValue = shortText}+instance ToValue Text where {toValue = text} instance ToValue Prelude.Bool where {toValue = bool}+instance ToValue Word where+ toValue = word64 . fromIntegral @Word @Word64++instance ToValue a => ToValue [a] where+ toValue !xs = runST $ do+ let len = List.length xs+ dst <- PM.newSmallArray len Null+ let go !ix ys = case ys of+ [] -> do+ dst' <- PM.unsafeFreezeSmallArray dst+ pure (Array dst')+ z : zs -> do+ PM.writeSmallArray dst ix $! toValue z+ go (ix + 1) zs+ go 0 xs instance ToValue a => ToValue (SmallArray a) where toValue !xs = Json.Array $! Contiguous.map' toValue xs