88{-# language NamedFieldPuns #-}
99{-# language PatternSynonyms #-}
1010{-# language TypeApplications #-}
11+ {-# language UnboxedSums #-}
1112{-# language UnboxedTuples #-}
1213
1314module Json
@@ -20,6 +21,15 @@ module Json
2021 , encode
2122 -- * Infix Synonyms
2223 , pattern (:->)
24+ -- * Construction
25+ , object1
26+ , object2
27+ , object3
28+ , object4
29+ , object5
30+ , object6
31+ , object7
32+ , object8
2333 ) where
2434
2535import Prelude hiding (Bool (True ,False ))
@@ -35,13 +45,15 @@ import Data.Chunks (Chunks(ChunksNil,ChunksCons))
3545import Data.Number.Scientific (Scientific )
3646import Data.Primitive (ByteArray ,MutableByteArray )
3747import Data.Text.Short (ShortText )
38- import GHC.Exts (Char (C #),Int (I #),gtWord #,ltWord #,word2Int #,chr #)
48+ import GHC.Exts (SmallArray #,Char (C #),Int (I #),gtWord #,ltWord #,word2Int #,chr #)
49+ import GHC.Exts (sizeofSmallArray #,indexSmallArray #)
3950import GHC.Word (Word8 (W8 #),Word16 (W16 #))
4051
4152import qualified Prelude
4253import qualified Data.Builder.ST as B
4354import qualified Data.Bytes.Builder as BLDR
4455import qualified Data.Bytes.Parser as P
56+ import qualified Data.Chunks as Chunks
4557import qualified Data.Text.Short.Unsafe as TS
4658import qualified Data.Number.Scientific as SCI
4759import qualified Data.Primitive as PM
@@ -139,11 +151,11 @@ encode = \case
139151 String s -> BLDR. shortTextJsonString s
140152 Number n -> SCI. builderUtf8 n
141153 Array ys -> case unconsNonempty ys of
142- Nothing -> BLDR. ascii2 ' [' ' ]'
143- Just (x,xs ) ->
154+ ( # ( # # ) | # ) -> BLDR. ascii2 ' [' ' ]'
155+ ( # | ( # x, xs # ) # ) ->
144156 BLDR. ascii ' ['
145157 <>
146- encode (PM. indexSmallArray x 0 )
158+ encode (case indexSmallArray# x 0 # of {( # z # ) -> z} )
147159 <>
148160 foldrTail
149161 ( \ v b -> BLDR. ascii ' ,' <> encode v <> b
@@ -152,13 +164,13 @@ encode = \case
152164 ( \ v b -> BLDR. ascii ' ,' <> encode v <> b
153165 ) (BLDR. ascii ' ]' ) xs
154166 )
155- x
167+ ( PM. SmallArray x)
156168 Object ys -> case unconsNonempty ys of
157- Nothing -> BLDR. ascii2 ' {' ' }'
158- Just ( x,xs) ->
169+ ( # ( # # ) | # ) -> BLDR. ascii2 ' {' ' }'
170+ ( # | ( # x,xs # ) # ) ->
159171 BLDR. ascii ' {'
160172 <>
161- encodeMember (PM. indexSmallArray x 0 )
173+ encodeMember (case indexSmallArray# x 0 # of {( # z # ) -> z} )
162174 <>
163175 foldrTail
164176 ( \ mbr b -> BLDR. ascii ' ,' <> encodeMember mbr <> b
@@ -167,7 +179,7 @@ encode = \case
167179 ( \ mbr b -> BLDR. ascii ' ,' <> encodeMember mbr <> b
168180 ) (BLDR. ascii ' }' ) xs
169181 )
170- x
182+ ( PM. SmallArray x)
171183
172184encodeMember :: Member -> BLDR. Builder
173185encodeMember Member {key,value} =
@@ -187,13 +199,13 @@ foldrTail f z !ary = go 1 where
187199 = f x (go (i+ 1 ))
188200
189201-- Get the first non-empty SmallArray from the Chunks.
190- unconsNonempty :: Chunks a -> Maybe ( PM. SmallArray a , Chunks a )
202+ unconsNonempty :: Chunks a -> ( # ( # # ) | ( # SmallArray # a , Chunks a # ) # )
191203{-# inline unconsNonempty #-}
192204unconsNonempty = go where
193- go ChunksNil = Nothing
194- go (ChunksCons x xs) = case PM. sizeofSmallArray x of
195- 0 -> go xs
196- _ -> Just (x,xs )
205+ go ChunksNil = ( # ( # # ) | # )
206+ go (ChunksCons ( PM. SmallArray x) xs) = case sizeofSmallArray# x of
207+ 0 # -> go xs
208+ _ -> ( # | ( # x, xs # ) # )
197209
198210-- Precondition: skip over all space before calling this.
199211-- It will not skip leading space for you. It does
@@ -418,3 +430,43 @@ w16ToChar (W16# w) = C# (chr# (word2Int# w))
418430-- | Infix pattern synonym for 'Member'.
419431pattern (:->) :: ShortText -> Value -> Member
420432pattern key :-> value = Member {key,value}
433+
434+ -- | Construct a JSON object with one member.
435+ object1 :: Member -> Value
436+ {-# inline object1 #-}
437+ object1 a = Object (Chunks. singleton a)
438+
439+ -- | Construct a JSON object with two members.
440+ object2 :: Member -> Member -> Value
441+ {-# inline object2 #-}
442+ object2 a b = Object (Chunks. doubleton a b)
443+
444+ -- | Construct a JSON object with three members.
445+ object3 :: Member -> Member -> Member -> Value
446+ {-# inline object3 #-}
447+ object3 a b c = Object (Chunks. tripleton a b c)
448+
449+ -- | Construct a JSON object with four members.
450+ object4 :: Member -> Member -> Member -> Member -> Value
451+ {-# inline object4 #-}
452+ object4 a b c d = Object (Chunks. quadrupleton a b c d)
453+
454+ -- | Construct a JSON object with five members.
455+ object5 :: Member -> Member -> Member -> Member -> Member -> Value
456+ {-# inline object5 #-}
457+ object5 a b c d e = Object (Chunks. quintupleton a b c d e)
458+
459+ -- | Construct a JSON object with six members.
460+ object6 :: Member -> Member -> Member -> Member -> Member -> Member -> Value
461+ {-# inline object6 #-}
462+ object6 a b c d e f = Object (Chunks. sextupleton a b c d e f)
463+
464+ -- | Construct a JSON object with seven members.
465+ object7 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Value
466+ {-# inline object7 #-}
467+ object7 a b c d e f g = Object (Chunks. septupleton a b c d e f g)
468+
469+ -- | Construct a JSON object with eight members.
470+ object8 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member -> Value
471+ {-# inline object8 #-}
472+ object8 a b c d e f g h = Object (Chunks. octupleton a b c d e f g h)
0 commit comments