@@ -37,6 +37,8 @@ module Json
3737 , word32
3838 , word64
3939 , bool
40+ , text
41+ , shortText
4042 -- * Object Construction
4143 , object1
4244 , object2
@@ -50,12 +52,16 @@ module Json
5052 , object10
5153 , object11
5254 , object12
55+ , object13
56+ , object14
57+ , object15
58+ , object16
5359 ) where
5460
5561import Prelude hiding (Bool (True ,False ))
5662
5763import Control.Exception (Exception )
58- import Control.Monad.ST (ST )
64+ import Control.Monad.ST (ST , runST )
5965import Control.Monad.ST.Run (runSmallArrayST )
6066import Data.Bits ((.&.) ,(.|.) ,unsafeShiftR )
6167import Data.Builder.ST (Builder )
@@ -68,6 +74,7 @@ import Data.Text.Short (ShortText)
6874import GHC.Exts (Char (C #),Int (I #),gtWord #,ltWord #,word2Int #,chr #)
6975import GHC.Word (Word8 ,Word16 ,Word32 ,Word64 )
7076import GHC.Int (Int8 ,Int16 ,Int32 ,Int64 )
77+ import Data.Text (Text )
7178
7279import qualified Prelude
7380import qualified Data.Builder.ST as B
@@ -82,6 +89,8 @@ import qualified Data.Bytes.Parser.Utf8 as Utf8
8289import qualified Data.Bytes.Parser.Latin as Latin
8390import qualified Data.ByteString.Short.Internal as BSS
8491import qualified Data.Bytes.Parser.Unsafe as Unsafe
92+ import qualified Data.Text.Short as TS
93+ import qualified Data.List as List
8594import qualified GHC.Word.Compat
8695
8796-- | The JSON syntax tree described by the ABNF in RFC 7159. Notable
@@ -598,6 +607,93 @@ object12 a b c d e f g h i j k l = Object $ runSmallArrayST $ do
598607 PM. writeSmallArray dst 11 l
599608 PM. unsafeFreezeSmallArray dst
600609
610+ -- | Construct a JSON object with thirteen members.
611+ object13 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member
612+ -> Member -> Member -> Member -> Member -> Member -> Value
613+ {-# inline object13 #-}
614+ object13 a b c d e f g h i j k l m = Object $ runSmallArrayST $ do
615+ dst <- PM. newSmallArray 13 a
616+ PM. writeSmallArray dst 1 b
617+ PM. writeSmallArray dst 2 c
618+ PM. writeSmallArray dst 3 d
619+ PM. writeSmallArray dst 4 e
620+ PM. writeSmallArray dst 5 f
621+ PM. writeSmallArray dst 6 g
622+ PM. writeSmallArray dst 7 h
623+ PM. writeSmallArray dst 8 i
624+ PM. writeSmallArray dst 9 j
625+ PM. writeSmallArray dst 10 k
626+ PM. writeSmallArray dst 11 l
627+ PM. writeSmallArray dst 12 m
628+ PM. unsafeFreezeSmallArray dst
629+
630+ -- | Construct a JSON object with fourteen members.
631+ object14 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member
632+ -> Member -> Member -> Member -> Member -> Member -> Member -> Value
633+ {-# inline object14 #-}
634+ object14 a b c d e f g h i j k l m n = Object $ runSmallArrayST $ do
635+ dst <- PM. newSmallArray 14 a
636+ PM. writeSmallArray dst 1 b
637+ PM. writeSmallArray dst 2 c
638+ PM. writeSmallArray dst 3 d
639+ PM. writeSmallArray dst 4 e
640+ PM. writeSmallArray dst 5 f
641+ PM. writeSmallArray dst 6 g
642+ PM. writeSmallArray dst 7 h
643+ PM. writeSmallArray dst 8 i
644+ PM. writeSmallArray dst 9 j
645+ PM. writeSmallArray dst 10 k
646+ PM. writeSmallArray dst 11 l
647+ PM. writeSmallArray dst 12 m
648+ PM. writeSmallArray dst 13 n
649+ PM. unsafeFreezeSmallArray dst
650+
651+ -- | Construct a JSON object with fifteen members.
652+ object15 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member
653+ -> Member -> Member -> Member -> Member -> Member -> Member -> Member -> Value
654+ {-# inline object15 #-}
655+ object15 a b c d e f g h i j k l m n o = Object $ runSmallArrayST $ do
656+ dst <- PM. newSmallArray 14 a
657+ PM. writeSmallArray dst 1 b
658+ PM. writeSmallArray dst 2 c
659+ PM. writeSmallArray dst 3 d
660+ PM. writeSmallArray dst 4 e
661+ PM. writeSmallArray dst 5 f
662+ PM. writeSmallArray dst 6 g
663+ PM. writeSmallArray dst 7 h
664+ PM. writeSmallArray dst 8 i
665+ PM. writeSmallArray dst 9 j
666+ PM. writeSmallArray dst 10 k
667+ PM. writeSmallArray dst 11 l
668+ PM. writeSmallArray dst 12 m
669+ PM. writeSmallArray dst 13 n
670+ PM. writeSmallArray dst 14 o
671+ PM. unsafeFreezeSmallArray dst
672+
673+ -- | Construct a JSON object with sixteen members.
674+ object16 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member
675+ -> Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member
676+ -> Value
677+ {-# inline object16 #-}
678+ object16 a b c d e f g h i j k l m n o p = Object $ runSmallArrayST $ do
679+ dst <- PM. newSmallArray 14 a
680+ PM. writeSmallArray dst 1 b
681+ PM. writeSmallArray dst 2 c
682+ PM. writeSmallArray dst 3 d
683+ PM. writeSmallArray dst 4 e
684+ PM. writeSmallArray dst 5 f
685+ PM. writeSmallArray dst 6 g
686+ PM. writeSmallArray dst 7 h
687+ PM. writeSmallArray dst 8 i
688+ PM. writeSmallArray dst 9 j
689+ PM. writeSmallArray dst 10 k
690+ PM. writeSmallArray dst 11 l
691+ PM. writeSmallArray dst 12 m
692+ PM. writeSmallArray dst 13 n
693+ PM. writeSmallArray dst 14 o
694+ PM. writeSmallArray dst 15 p
695+ PM. unsafeFreezeSmallArray dst
696+
601697word8 :: Word8 -> Json. Value
602698{-# inline word8 #-}
603699word8 = Json. Number . SCI. fromWord8
@@ -634,14 +730,27 @@ int :: Int -> Json.Value
634730{-# inline int #-}
635731int = Json. Number . SCI. fromInt
636732
733+ text :: Text -> Json. Value
734+ {-# inline text #-}
735+ text = Json. String . TS. fromText
736+
737+ shortText :: ShortText -> Json. Value
738+ {-# inline shortText #-}
739+ shortText = String
740+
637741bool :: Prelude. Bool -> Json. Value
638742{-# inline bool #-}
639743bool Prelude. True = True
640744bool _ = False
641745
746+ -- | Typeclass for types that can be encoded as JSON.
642747class ToValue a where
643748 toValue :: a -> Value
644749
750+ -- | Encodes the unit value as JSON @null@.
751+ instance ToValue () where {toValue _ = Null }
752+ instance ToValue Value where {toValue = id }
753+ instance ToValue Scientific where {toValue = Number }
645754instance ToValue Int where {toValue = int}
646755instance ToValue Int8 where {toValue = int8}
647756instance ToValue Int16 where {toValue = int16}
@@ -651,8 +760,24 @@ instance ToValue Word8 where {toValue = word8}
651760instance ToValue Word16 where {toValue = word16}
652761instance ToValue Word32 where {toValue = word32}
653762instance ToValue Word64 where {toValue = word64}
654- instance ToValue ShortText where {toValue = String }
763+ instance ToValue ShortText where {toValue = shortText}
764+ instance ToValue Text where {toValue = text}
655765instance ToValue Prelude. Bool where {toValue = bool}
766+ instance ToValue Word where
767+ toValue = word64 . fromIntegral @ Word @ Word64
768+
769+ instance ToValue a => ToValue [a ] where
770+ toValue ! xs = runST $ do
771+ let len = List. length xs
772+ dst <- PM. newSmallArray len Null
773+ let go ! ix ys = case ys of
774+ [] -> do
775+ dst' <- PM. unsafeFreezeSmallArray dst
776+ pure (Array dst')
777+ z : zs -> do
778+ PM. writeSmallArray dst ix $! toValue z
779+ go (ix + 1 ) zs
780+ go 0 xs
656781
657782instance ToValue a => ToValue (SmallArray a ) where
658783 toValue ! xs = Json. Array $! Contiguous. map' toValue xs
0 commit comments