Skip to content

Commit ac3de16

Browse files
committed
Release 0.2.5.0
1 parent 77c8665 commit ac3de16

File tree

3 files changed

+138
-4
lines changed

3 files changed

+138
-4
lines changed

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
# Revision history for json-syntax
22

3-
## 0.2.4.0 -- 2023-??-??
3+
## 0.2.5.0 -- 2023-07-25
4+
5+
* Add `object(13|14|15|16|17)`.
6+
* Add `ToValue` instances for `Word`, `Text`, `Value`,
7+
`Scientific`, list (i.e. `[]`), the unit type (i.e. `()`),
8+
* Add `text` and `shortText` for value construction.
9+
10+
11+
## 0.2.4.0 -- 2023-06-27
412

513
* Add typeclass `ToValue` for encoding.
614
* Add functions `int`, `(int|word)(8|16|32|64)`, `bool` for constructing

json-syntax.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 2.2
22
name: json-syntax
3-
version: 0.2.4.0
3+
version: 0.2.5.0
44
synopsis: High-performance JSON parser and encoder
55
description:
66
This library parses JSON into a @Value@ type that is consistent with the
@@ -46,6 +46,7 @@ library
4646
, text-short >=0.1.3 && <0.2
4747
, word-compat >=0.0.3
4848
, zigzag >=0.0.1
49+
, text >=1.2
4950
hs-source-dirs: src
5051
default-language: Haskell2010
5152
ghc-options: -Wall -O2

src/Json.hs

Lines changed: 127 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5561
import Prelude hiding (Bool(True,False))
5662

5763
import Control.Exception (Exception)
58-
import Control.Monad.ST (ST)
64+
import Control.Monad.ST (ST,runST)
5965
import Control.Monad.ST.Run (runSmallArrayST)
6066
import Data.Bits ((.&.),(.|.),unsafeShiftR)
6167
import Data.Builder.ST (Builder)
@@ -68,6 +74,7 @@ import Data.Text.Short (ShortText)
6874
import GHC.Exts (Char(C#),Int(I#),gtWord#,ltWord#,word2Int#,chr#)
6975
import GHC.Word (Word8,Word16,Word32,Word64)
7076
import GHC.Int (Int8,Int16,Int32,Int64)
77+
import Data.Text (Text)
7178

7279
import qualified Prelude
7380
import qualified Data.Builder.ST as B
@@ -82,6 +89,8 @@ import qualified Data.Bytes.Parser.Utf8 as Utf8
8289
import qualified Data.Bytes.Parser.Latin as Latin
8390
import qualified Data.ByteString.Short.Internal as BSS
8491
import qualified Data.Bytes.Parser.Unsafe as Unsafe
92+
import qualified Data.Text.Short as TS
93+
import qualified Data.List as List
8594
import 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+
601697
word8 :: Word8 -> Json.Value
602698
{-# inline word8 #-}
603699
word8 = Json.Number . SCI.fromWord8
@@ -634,14 +730,27 @@ int :: Int -> Json.Value
634730
{-# inline int #-}
635731
int = 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+
637741
bool :: Prelude.Bool -> Json.Value
638742
{-# inline bool #-}
639743
bool Prelude.True = True
640744
bool _ = False
641745

746+
-- | Typeclass for types that can be encoded as JSON.
642747
class 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}
645754
instance ToValue Int where {toValue = int}
646755
instance ToValue Int8 where {toValue = int8}
647756
instance ToValue Int16 where {toValue = int16}
@@ -651,8 +760,24 @@ instance ToValue Word8 where {toValue = word8}
651760
instance ToValue Word16 where {toValue = word16}
652761
instance ToValue Word32 where {toValue = word32}
653762
instance 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}
655765
instance 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

657782
instance ToValue a => ToValue (SmallArray a) where
658783
toValue !xs = Json.Array $! Contiguous.map' toValue xs

0 commit comments

Comments
 (0)