{-# language BangPatterns #-}
{-# language BinaryLiterals #-}
{-# language BlockArguments #-}
{-# language DerivingStrategies #-}
{-# language DeriveAnyClass #-}
{-# language LambdaCase #-}
{-# language MagicHash #-}
{-# language NamedFieldPuns #-}
{-# language PatternSynonyms #-}
{-# language TypeApplications #-}
{-# language UnboxedSums #-}
{-# language UnboxedTuples #-}
module Json
(
Value(..)
, Member(..)
, SyntaxException(..)
, decode
, encode
, pattern (:->)
, object1
, object2
, object3
, object4
, object5
, object6
, object7
, object8
) where
import Prelude hiding (Bool(True,False))
import Control.Exception (Exception)
import Control.Monad.ST (ST)
import Data.Bits ((.&.),(.|.),unsafeShiftR)
import Data.Builder.ST (Builder)
import Data.Bytes.Parser (Parser)
import Data.Bytes.Types (Bytes(..))
import Data.Char (ord)
import Data.Chunks (Chunks(ChunksNil,ChunksCons))
import Data.Number.Scientific (Scientific)
import Data.Primitive (ByteArray,MutableByteArray)
import Data.Text.Short (ShortText)
import GHC.Exts (SmallArray#,Char(C#),Int(I#),gtWord#,ltWord#,word2Int#,chr#)
import GHC.Exts (sizeofSmallArray#,indexSmallArray#)
import GHC.Word (Word8(W8#),Word16(W16#))
import qualified Prelude
import qualified Data.Builder.ST as B
import qualified Data.Bytes.Builder as BLDR
import qualified Data.Bytes.Parser as P
import qualified Data.Chunks as Chunks
import qualified Data.Text.Short.Unsafe as TS
import qualified Data.Number.Scientific as SCI
import qualified Data.Primitive as PM
import qualified Data.Bytes.Parser.Utf8 as Utf8
import qualified Data.Bytes.Parser.Latin as Latin
import qualified Data.ByteString.Short.Internal as BSS
import qualified Data.Bytes.Parser.Unsafe as Unsafe
data Value
= Object !(Chunks Member)
| Array !(Chunks Value)
| String {-# UNPACK #-} !ShortText
| Number {-# UNPACK #-} !Scientific
| Null
| True
| False
deriving stock (Value -> Value -> Bool
(Value -> Value -> Bool) -> (Value -> Value -> Bool) -> Eq Value
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Value -> Value -> Bool
$c/= :: Value -> Value -> Bool
== :: Value -> Value -> Bool
$c== :: Value -> Value -> Bool
Eq,Int -> Value -> ShowS
[Value] -> ShowS
Value -> String
(Int -> Value -> ShowS)
-> (Value -> String) -> ([Value] -> ShowS) -> Show Value
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Value] -> ShowS
$cshowList :: [Value] -> ShowS
show :: Value -> String
$cshow :: Value -> String
showsPrec :: Int -> Value -> ShowS
$cshowsPrec :: Int -> Value -> ShowS
Show)
data SyntaxException
= EmptyInput
| ExpectedColon
| ExpectedCommaOrRightBracket
| ExpectedFalse
| ExpectedNull
| ExpectedQuote
| ExpectedQuoteOrRightBrace
| ExpectedTrue
| IncompleteArray
| IncompleteEscapeSequence
| IncompleteObject
| IncompleteString
| InvalidEscapeSequence
| InvalidLeader
| InvalidNumber
| LeadingZero
| UnexpectedLeftovers
deriving stock (SyntaxException -> SyntaxException -> Bool
(SyntaxException -> SyntaxException -> Bool)
-> (SyntaxException -> SyntaxException -> Bool)
-> Eq SyntaxException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SyntaxException -> SyntaxException -> Bool
$c/= :: SyntaxException -> SyntaxException -> Bool
== :: SyntaxException -> SyntaxException -> Bool
$c== :: SyntaxException -> SyntaxException -> Bool
Eq,Int -> SyntaxException -> ShowS
[SyntaxException] -> ShowS
SyntaxException -> String
(Int -> SyntaxException -> ShowS)
-> (SyntaxException -> String)
-> ([SyntaxException] -> ShowS)
-> Show SyntaxException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SyntaxException] -> ShowS
$cshowList :: [SyntaxException] -> ShowS
show :: SyntaxException -> String
$cshow :: SyntaxException -> String
showsPrec :: Int -> SyntaxException -> ShowS
$cshowsPrec :: Int -> SyntaxException -> ShowS
Show)
deriving anyclass (Show SyntaxException
Typeable SyntaxException
Typeable SyntaxException
-> Show SyntaxException
-> (SyntaxException -> SomeException)
-> (SomeException -> Maybe SyntaxException)
-> (SyntaxException -> String)
-> Exception SyntaxException
SomeException -> Maybe SyntaxException
SyntaxException -> String
SyntaxException -> SomeException
forall e.
Typeable e
-> Show e
-> (e -> SomeException)
-> (SomeException -> Maybe e)
-> (e -> String)
-> Exception e
displayException :: SyntaxException -> String
$cdisplayException :: SyntaxException -> String
fromException :: SomeException -> Maybe SyntaxException
$cfromException :: SomeException -> Maybe SyntaxException
toException :: SyntaxException -> SomeException
$ctoException :: SyntaxException -> SomeException
$cp2Exception :: Show SyntaxException
$cp1Exception :: Typeable SyntaxException
Exception)
data Member = Member
{ Member -> ShortText
key :: {-# UNPACK #-} !ShortText
, Member -> Value
value :: !Value
} deriving stock (Member -> Member -> Bool
(Member -> Member -> Bool)
-> (Member -> Member -> Bool) -> Eq Member
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Member -> Member -> Bool
$c/= :: Member -> Member -> Bool
== :: Member -> Member -> Bool
$c== :: Member -> Member -> Bool
Eq,Int -> Member -> ShowS
[Member] -> ShowS
Member -> String
(Int -> Member -> ShowS)
-> (Member -> String) -> ([Member] -> ShowS) -> Show Member
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Member] -> ShowS
$cshowList :: [Member] -> ShowS
show :: Member -> String
$cshow :: Member -> String
showsPrec :: Int -> Member -> ShowS
$cshowsPrec :: Int -> Member -> ShowS
Show)
emptyArrayValue :: Value
{-# noinline emptyArrayValue #-}
emptyArrayValue :: Value
emptyArrayValue = Chunks Value -> Value
Array Chunks Value
forall a. Chunks a
ChunksNil
emptyObjectValue :: Value
{-# noinline emptyObjectValue #-}
emptyObjectValue :: Value
emptyObjectValue = Chunks Member -> Value
Object Chunks Member
forall a. Chunks a
ChunksNil
isSpace :: Word8 -> Prelude.Bool
isSpace :: Word8 -> Bool
isSpace Word8
w =
Word8
w Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Word8
c2w Char
' '
Bool -> Bool -> Bool
|| Word8
w Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Word8
c2w Char
'\t'
Bool -> Bool -> Bool
|| Word8
w Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Word8
c2w Char
'\r'
Bool -> Bool -> Bool
|| Word8
w Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> Word8
c2w Char
'\n'
decode :: Bytes -> Either SyntaxException Value
decode :: Bytes -> Either SyntaxException Value
decode = (forall s. Parser SyntaxException s Value)
-> Bytes -> Either SyntaxException Value
forall e a. (forall s. Parser e s a) -> Bytes -> Either e a
P.parseBytesEither do
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
Value
result <- SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
EmptyInput Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Char -> Parser SyntaxException s Value
forall s. Char -> Parser SyntaxException s Value
parser
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Parser SyntaxException s ()
forall e s. e -> Parser e s ()
P.endOfInput SyntaxException
UnexpectedLeftovers
Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure Value
result
encode :: Value -> BLDR.Builder
encode :: Value -> Builder
encode = \case
Value
True -> Char -> Char -> Char -> Char -> Builder
BLDR.ascii4 Char
't' Char
'r' Char
'u' Char
'e'
Value
False -> Char -> Char -> Char -> Char -> Char -> Builder
BLDR.ascii5 Char
'f' Char
'a' Char
'l' Char
's' Char
'e'
Value
Null -> Char -> Char -> Char -> Char -> Builder
BLDR.ascii4 Char
'n' Char
'u' Char
'l' Char
'l'
String ShortText
s -> ShortText -> Builder
BLDR.shortTextJsonString ShortText
s
Number Scientific
n -> Scientific -> Builder
SCI.builderUtf8 Scientific
n
Array Chunks Value
ys -> case Chunks Value -> (# (# #) | (# SmallArray# Value, Chunks Value #) #)
forall a. Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
unconsNonempty Chunks Value
ys of
(# (# #) | #) -> Char -> Char -> Builder
BLDR.ascii2 Char
'[' Char
']'
(# | (# SmallArray# Value
x, Chunks Value
xs #) #) ->
Char -> Builder
BLDR.ascii Char
'['
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Value -> Builder
encode (case SmallArray# Value -> Int# -> (# Value #)
forall a. SmallArray# a -> Int# -> (# a #)
indexSmallArray# SmallArray# Value
x Int#
0# of {(# Value
z #) -> Value
z})
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
(Value -> Builder -> Builder)
-> Builder -> SmallArray Value -> Builder
forall a b. (a -> b -> b) -> b -> SmallArray a -> b
foldrTail
( \Value
v Builder
b -> Char -> Builder
BLDR.ascii Char
',' Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Value -> Builder
encode Value
v Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
b
)
( (Value -> Builder -> Builder) -> Builder -> Chunks Value -> Builder
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
( \Value
v Builder
b -> Char -> Builder
BLDR.ascii Char
',' Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Value -> Builder
encode Value
v Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
b
) (Char -> Builder
BLDR.ascii Char
']') Chunks Value
xs
)
(SmallArray# Value -> SmallArray Value
forall a. SmallArray# a -> SmallArray a
PM.SmallArray SmallArray# Value
x)
Object Chunks Member
ys -> case Chunks Member
-> (# (# #) | (# SmallArray# Member, Chunks Member #) #)
forall a. Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
unconsNonempty Chunks Member
ys of
(# (# #) | #) -> Char -> Char -> Builder
BLDR.ascii2 Char
'{' Char
'}'
(# | (# SmallArray# Member
x,Chunks Member
xs #) #) ->
Char -> Builder
BLDR.ascii Char
'{'
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Member -> Builder
encodeMember (case SmallArray# Member -> Int# -> (# Member #)
forall a. SmallArray# a -> Int# -> (# a #)
indexSmallArray# SmallArray# Member
x Int#
0# of {(# Member
z #) -> Member
z})
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
(Member -> Builder -> Builder)
-> Builder -> SmallArray Member -> Builder
forall a b. (a -> b -> b) -> b -> SmallArray a -> b
foldrTail
( \Member
mbr Builder
b -> Char -> Builder
BLDR.ascii Char
',' Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Member -> Builder
encodeMember Member
mbr Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
b
)
( (Member -> Builder -> Builder)
-> Builder -> Chunks Member -> Builder
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
( \Member
mbr Builder
b -> Char -> Builder
BLDR.ascii Char
',' Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Member -> Builder
encodeMember Member
mbr Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
b
) (Char -> Builder
BLDR.ascii Char
'}') Chunks Member
xs
)
(SmallArray# Member -> SmallArray Member
forall a. SmallArray# a -> SmallArray a
PM.SmallArray SmallArray# Member
x)
encodeMember :: Member -> BLDR.Builder
encodeMember :: Member -> Builder
encodeMember Member{ShortText
key :: ShortText
key :: Member -> ShortText
key,Value
value :: Value
value :: Member -> Value
value} =
ShortText -> Builder
BLDR.shortTextJsonString ShortText
key
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Char -> Builder
BLDR.ascii Char
':'
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Value -> Builder
encode Value
value
foldrTail :: (a -> b -> b) -> b -> PM.SmallArray a -> b
{-# inline foldrTail #-}
foldrTail :: (a -> b -> b) -> b -> SmallArray a -> b
foldrTail a -> b -> b
f b
z !SmallArray a
ary = Int -> b
go Int
1 where
!sz :: Int
sz = SmallArray a -> Int
forall a. SmallArray a -> Int
PM.sizeofSmallArray SmallArray a
ary
go :: Int -> b
go Int
i
| Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
sz = b
z
| (# a
x #) <- SmallArray a -> Int -> (# a #)
forall a. SmallArray a -> Int -> (# a #)
PM.indexSmallArray## SmallArray a
ary Int
i
= a -> b -> b
f a
x (Int -> b
go (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1))
unconsNonempty :: Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
{-# inline unconsNonempty #-}
unconsNonempty :: Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
unconsNonempty = Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
forall a. Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
go where
go :: Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
go Chunks a
ChunksNil = (# (# #) | #)
go (ChunksCons (PM.SmallArray SmallArray# a
x) Chunks a
xs) = case SmallArray# a -> Int#
forall a. SmallArray# a -> Int#
sizeofSmallArray# SmallArray# a
x of
Int#
0# -> Chunks a -> (# (# #) | (# SmallArray# a, Chunks a #) #)
go Chunks a
xs
Int#
_ -> (# | (# SmallArray# a
x, Chunks a
xs #) #)
parser :: Char -> Parser SyntaxException s Value
parser :: Char -> Parser SyntaxException s Value
parser = \case
Char
'{' -> Parser SyntaxException s Value
forall s. Parser SyntaxException s Value
objectTrailedByBrace
Char
'[' -> Parser SyntaxException s Value
forall s. Parser SyntaxException s Value
arrayTrailedByBracket
Char
't' -> do
SyntaxException
-> Char -> Char -> Char -> Parser SyntaxException s ()
forall e s. e -> Char -> Char -> Char -> Parser e s ()
Latin.char3 SyntaxException
ExpectedTrue Char
'r' Char
'u' Char
'e'
Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure Value
True
Char
'f' -> do
SyntaxException
-> Char -> Char -> Char -> Char -> Parser SyntaxException s ()
forall e s. e -> Char -> Char -> Char -> Char -> Parser e s ()
Latin.char4 SyntaxException
ExpectedFalse Char
'a' Char
'l' Char
's' Char
'e'
Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure Value
False
Char
'n' -> do
SyntaxException
-> Char -> Char -> Char -> Parser SyntaxException s ()
forall e s. e -> Char -> Char -> Char -> Parser e s ()
Latin.char3 SyntaxException
ExpectedNull Char
'u' Char
'l' Char
'l'
Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure Value
Null
Char
'"' -> do
Int
start <- Parser SyntaxException s Int
forall e s. Parser e s Int
Unsafe.cursor
(ShortText -> Value) -> Int -> Parser SyntaxException s Value
forall a s. (ShortText -> a) -> Int -> Parser SyntaxException s a
string ShortText -> Value
String Int
start
Char
'-' -> (Scientific -> Value)
-> Parser SyntaxException s Scientific
-> Parser SyntaxException s Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Scientific -> Value
Number (SyntaxException -> Parser SyntaxException s Scientific
forall e s. e -> Parser e s Scientific
SCI.parserNegatedUtf8Bytes SyntaxException
InvalidNumber)
Char
'0' -> (Char -> Bool) -> Parser SyntaxException s Bool
forall e s. (Char -> Bool) -> Parser e s Bool
Latin.trySatisfy (\Char
c -> Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'0' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'9') Parser SyntaxException s Bool
-> (Bool -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Bool
Prelude.True -> SyntaxException -> Parser SyntaxException s Value
forall e s a. e -> Parser e s a
P.fail SyntaxException
LeadingZero
Bool
Prelude.False -> (Scientific -> Value)
-> Parser SyntaxException s Scientific
-> Parser SyntaxException s Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Scientific -> Value
Number (SyntaxException -> Int -> Parser SyntaxException s Scientific
forall e s. e -> Int -> Parser e s Scientific
SCI.parserTrailingUtf8Bytes SyntaxException
InvalidNumber Int
0)
Char
c | Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'1' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'9' ->
(Scientific -> Value)
-> Parser SyntaxException s Scientific
-> Parser SyntaxException s Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Scientific -> Value
Number (SyntaxException -> Int -> Parser SyntaxException s Scientific
forall e s. e -> Int -> Parser e s Scientific
SCI.parserTrailingUtf8Bytes SyntaxException
InvalidNumber (Char -> Int
ord Char
c Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
48))
Char
_ -> SyntaxException -> Parser SyntaxException s Value
forall e s a. e -> Parser e s a
P.fail SyntaxException
InvalidLeader
objectTrailedByBrace :: Parser SyntaxException s Value
objectTrailedByBrace :: Parser SyntaxException s Value
objectTrailedByBrace = do
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteObject Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Char
'}' -> Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure Value
emptyObjectValue
Char
'"' -> do
Int
start <- Parser SyntaxException s Int
forall e s. Parser e s Int
Unsafe.cursor
!ShortText
theKey <- (ShortText -> ShortText)
-> Int -> Parser SyntaxException s ShortText
forall a s. (ShortText -> a) -> Int -> Parser SyntaxException s a
string ShortText -> ShortText
forall a. a -> a
id Int
start
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Char -> Parser SyntaxException s ()
forall e s. e -> Char -> Parser e s ()
Latin.char SyntaxException
ExpectedColon Char
':'
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
Value
val <- SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteObject Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Char -> Parser SyntaxException s Value
forall s. Char -> Parser SyntaxException s Value
parser
let !mbr :: Member
mbr = ShortText -> Value -> Member
Member ShortText
theKey Value
val
!Builder s Member
b0 <- ST s (Builder s Member)
-> Parser SyntaxException s (Builder s Member)
forall s a e. ST s a -> Parser e s a
P.effect ST s (Builder s Member)
forall s a. ST s (Builder s a)
B.new
Builder s Member
b1 <- ST s (Builder s Member)
-> Parser SyntaxException s (Builder s Member)
forall s a e. ST s a -> Parser e s a
P.effect (Member -> Builder s Member -> ST s (Builder s Member)
forall a s. a -> Builder s a -> ST s (Builder s a)
B.push Member
mbr Builder s Member
b0)
Builder s Member -> Parser SyntaxException s Value
forall s. Builder s Member -> Parser SyntaxException s Value
objectStep Builder s Member
b1
Char
_ -> SyntaxException -> Parser SyntaxException s Value
forall e s a. e -> Parser e s a
P.fail SyntaxException
ExpectedQuoteOrRightBrace
objectStep :: Builder s Member -> Parser SyntaxException s Value
objectStep :: Builder s Member -> Parser SyntaxException s Value
objectStep !Builder s Member
b = do
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteObject Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Char
',' -> do
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Char -> Parser SyntaxException s ()
forall e s. e -> Char -> Parser e s ()
Latin.char SyntaxException
ExpectedQuote Char
'"'
Int
start <- Parser SyntaxException s Int
forall e s. Parser e s Int
Unsafe.cursor
!ShortText
theKey <- (ShortText -> ShortText)
-> Int -> Parser SyntaxException s ShortText
forall a s. (ShortText -> a) -> Int -> Parser SyntaxException s a
string ShortText -> ShortText
forall a. a -> a
id Int
start
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Char -> Parser SyntaxException s ()
forall e s. e -> Char -> Parser e s ()
Latin.char SyntaxException
ExpectedColon Char
':'
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
Value
val <- SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteObject Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Char -> Parser SyntaxException s Value
forall s. Char -> Parser SyntaxException s Value
parser
let !mbr :: Member
mbr = ShortText -> Value -> Member
Member ShortText
theKey Value
val
ST s (Builder s Member)
-> Parser SyntaxException s (Builder s Member)
forall s a e. ST s a -> Parser e s a
P.effect (Member -> Builder s Member -> ST s (Builder s Member)
forall a s. a -> Builder s a -> ST s (Builder s a)
B.push Member
mbr Builder s Member
b) Parser SyntaxException s (Builder s Member)
-> (Builder s Member -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Builder s Member -> Parser SyntaxException s Value
forall s. Builder s Member -> Parser SyntaxException s Value
objectStep
Char
'}' -> do
!Chunks Member
r <- ST s (Chunks Member) -> Parser SyntaxException s (Chunks Member)
forall s a e. ST s a -> Parser e s a
P.effect (Builder s Member -> ST s (Chunks Member)
forall s a. Builder s a -> ST s (Chunks a)
B.freeze Builder s Member
b)
Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Chunks Member -> Value
Object Chunks Member
r)
Char
_ -> SyntaxException -> Parser SyntaxException s Value
forall e s a. e -> Parser e s a
P.fail SyntaxException
ExpectedCommaOrRightBracket
arrayTrailedByBracket :: Parser SyntaxException s Value
arrayTrailedByBracket :: Parser SyntaxException s Value
arrayTrailedByBracket = do
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteArray Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Char
']' -> Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure Value
emptyArrayValue
Char
c -> do
!Builder s Value
b0 <- ST s (Builder s Value)
-> Parser SyntaxException s (Builder s Value)
forall s a e. ST s a -> Parser e s a
P.effect ST s (Builder s Value)
forall s a. ST s (Builder s a)
B.new
Value
val <- Char -> Parser SyntaxException s Value
forall s. Char -> Parser SyntaxException s Value
parser Char
c
Builder s Value
b1 <- ST s (Builder s Value)
-> Parser SyntaxException s (Builder s Value)
forall s a e. ST s a -> Parser e s a
P.effect (Value -> Builder s Value -> ST s (Builder s Value)
forall a s. a -> Builder s a -> ST s (Builder s a)
B.push Value
val Builder s Value
b0)
Builder s Value -> Parser SyntaxException s Value
forall s. Builder s Value -> Parser SyntaxException s Value
arrayStep Builder s Value
b1
arrayStep :: Builder s Value -> Parser SyntaxException s Value
arrayStep :: Builder s Value -> Parser SyntaxException s Value
arrayStep !Builder s Value
b = do
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteArray Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Char
',' -> do
(Word8 -> Bool) -> Parser SyntaxException s ()
forall e s. (Word8 -> Bool) -> Parser e s ()
P.skipWhile Word8 -> Bool
isSpace
Value
val <- SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteArray Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Char -> Parser SyntaxException s Value
forall s. Char -> Parser SyntaxException s Value
parser
ST s (Builder s Value)
-> Parser SyntaxException s (Builder s Value)
forall s a e. ST s a -> Parser e s a
P.effect (Value -> Builder s Value -> ST s (Builder s Value)
forall a s. a -> Builder s a -> ST s (Builder s a)
B.push Value
val Builder s Value
b) Parser SyntaxException s (Builder s Value)
-> (Builder s Value -> Parser SyntaxException s Value)
-> Parser SyntaxException s Value
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Builder s Value -> Parser SyntaxException s Value
forall s. Builder s Value -> Parser SyntaxException s Value
arrayStep
Char
']' -> do
!Chunks Value
r <- ST s (Chunks Value) -> Parser SyntaxException s (Chunks Value)
forall s a e. ST s a -> Parser e s a
P.effect (Builder s Value -> ST s (Chunks Value)
forall s a. Builder s a -> ST s (Chunks a)
B.freeze Builder s Value
b)
Value -> Parser SyntaxException s Value
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Chunks Value -> Value
Array Chunks Value
r)
Char
_ -> SyntaxException -> Parser SyntaxException s Value
forall e s a. e -> Parser e s a
P.fail SyntaxException
ExpectedCommaOrRightBracket
c2w :: Char -> Word8
c2w :: Char -> Word8
c2w = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8) -> (Char -> Int) -> Char -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ord
string :: (ShortText -> a) -> Int -> Parser SyntaxException s a
{-# inline string #-}
string :: (ShortText -> a) -> Int -> Parser SyntaxException s a
string ShortText -> a
wrap !Int
start = Int -> Parser SyntaxException s a
forall s. Int -> Parser SyntaxException s a
go Int
1 where
go :: Int -> Parser SyntaxException s a
go !Int
canMemcpy = do
SyntaxException -> Parser SyntaxException s Word8
forall e s. e -> Parser e s Word8
P.any SyntaxException
IncompleteString Parser SyntaxException s Word8
-> (Word8 -> Parser SyntaxException s a)
-> Parser SyntaxException s a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Word8
92 -> SyntaxException -> Parser SyntaxException s Word8
forall e s. e -> Parser e s Word8
P.any SyntaxException
InvalidEscapeSequence Parser SyntaxException s Word8
-> Parser SyntaxException s a -> Parser SyntaxException s a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Int -> Parser SyntaxException s a
go Int
0
Word8
34 -> do
!Int
pos <- Parser SyntaxException s Int
forall e s. Parser e s Int
Unsafe.cursor
case Int
canMemcpy of
Int
1 -> do
ByteArray
src <- Parser SyntaxException s ByteArray
forall e s. Parser e s ByteArray
Unsafe.expose
ByteArray
str <- ST s ByteArray -> Parser SyntaxException s ByteArray
forall s a e. ST s a -> Parser e s a
P.effect (ST s ByteArray -> Parser SyntaxException s ByteArray)
-> ST s ByteArray -> Parser SyntaxException s ByteArray
forall a b. (a -> b) -> a -> b
$ do
let end :: Int
end = Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
let len :: Int
len = Int
end Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
start
MutableByteArray s
dst <- Int -> ST s (MutableByteArray (PrimState (ST s)))
forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
PM.newByteArray Int
len
MutableByteArray (PrimState (ST s))
-> Int -> ByteArray -> Int -> Int -> ST s ()
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> ByteArray -> Int -> Int -> m ()
PM.copyByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
0 ByteArray
src Int
start Int
len
MutableByteArray (PrimState (ST s)) -> ST s ByteArray
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m) -> m ByteArray
PM.unsafeFreezeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst
a -> Parser SyntaxException s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShortText -> a
wrap (ShortByteString -> ShortText
TS.fromShortByteStringUnsafe (ByteArray -> ShortByteString
byteArrayToShortByteString ByteArray
str)))
Int
_ -> do
Int -> Parser SyntaxException s ()
forall e s. Int -> Parser e s ()
Unsafe.unconsume (Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
start)
let end :: Int
end = Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
let maxLen :: Int
maxLen = Int
end Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
start
(ShortText -> a) -> Int -> Parser SyntaxException s a
forall a s. (ShortText -> a) -> Int -> Parser SyntaxException s a
copyAndEscape ShortText -> a
wrap Int
maxLen
W8# Word#
w -> Int -> Parser SyntaxException s a
go (Int
canMemcpy Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int# -> Int
I# (Word# -> Word# -> Int#
ltWord# Word#
w Word#
128##) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int# -> Int
I# (Word# -> Word# -> Int#
gtWord# Word#
w Word#
31##))
copyAndEscape :: (ShortText -> a) -> Int -> Parser SyntaxException s a
{-# inline copyAndEscape #-}
copyAndEscape :: (ShortText -> a) -> Int -> Parser SyntaxException s a
copyAndEscape ShortText -> a
wrap !Int
maxLen = do
!MutableByteArray s
dst <- ST s (MutableByteArray s)
-> Parser SyntaxException s (MutableByteArray s)
forall s a e. ST s a -> Parser e s a
P.effect (Int -> ST s (MutableByteArray (PrimState (ST s)))
forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
PM.newByteArray Int
maxLen)
let go :: Int -> Parser SyntaxException s a
go !Int
ix = SyntaxException -> Parser SyntaxException s Char#
forall e s. e -> Parser e s Char#
Utf8.any# SyntaxException
IncompleteString Parser SyntaxException s Char#
-> (Char# -> Parser SyntaxException s a)
-> Parser SyntaxException s a
forall s e a.
Parser s e Char# -> (Char# -> Parser s e a) -> Parser s e a
`P.bindFromCharToLifted` \Char#
c -> case Char#
c of
Char#
'\\'# -> SyntaxException -> Parser SyntaxException s Char
forall e s. e -> Parser e s Char
Latin.any SyntaxException
IncompleteEscapeSequence Parser SyntaxException s Char
-> (Char -> Parser SyntaxException s a)
-> Parser SyntaxException s a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Char
'"' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'"'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
'\\' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'\\'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
't' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'\t'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
'n' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'\n'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
'r' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'\r'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
'/' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'/'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
'b' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'\b'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
'f' -> do
ST s () -> Parser SyntaxException s ()
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix (Char -> Word8
c2w Char
'\f'))
Int -> Parser SyntaxException s a
go (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
Char
'u' -> do
Word16
w <- SyntaxException -> Parser SyntaxException s Word16
forall e s. e -> Parser e s Word16
Latin.hexFixedWord16 SyntaxException
InvalidEscapeSequence
if Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
>= Word16
0xD800 Bool -> Bool -> Bool
&& Word16
w Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
< Word16
0xDFFF
then Int -> Parser SyntaxException s a
go (Int -> Parser SyntaxException s a)
-> Parser SyntaxException s Int -> Parser SyntaxException s a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ST s Int -> Parser SyntaxException s Int
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray s -> Int -> Char -> ST s Int
forall s. MutableByteArray s -> Int -> Char -> ST s Int
encodeUtf8Char MutableByteArray s
dst Int
ix Char
'\xFFFD')
else Int -> Parser SyntaxException s a
go (Int -> Parser SyntaxException s a)
-> Parser SyntaxException s Int -> Parser SyntaxException s a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ST s Int -> Parser SyntaxException s Int
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray s -> Int -> Char -> ST s Int
forall s. MutableByteArray s -> Int -> Char -> ST s Int
encodeUtf8Char MutableByteArray s
dst Int
ix (Word16 -> Char
w16ToChar Word16
w))
Char
_ -> SyntaxException -> Parser SyntaxException s a
forall e s a. e -> Parser e s a
P.fail SyntaxException
InvalidEscapeSequence
Char#
'"'# -> do
ByteArray
str <- ST s ByteArray -> Parser SyntaxException s ByteArray
forall s a e. ST s a -> Parser e s a
P.effect
(MutableByteArray s -> ST s ByteArray
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m) -> m ByteArray
PM.unsafeFreezeByteArray (MutableByteArray s -> ST s ByteArray)
-> ST s (MutableByteArray s) -> ST s ByteArray
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MutableByteArray (PrimState (ST s))
-> Int -> ST s (MutableByteArray (PrimState (ST s)))
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> m (MutableByteArray (PrimState m))
PM.resizeMutableByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
dst Int
ix)
a -> Parser SyntaxException s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShortText -> a
wrap (ShortByteString -> ShortText
TS.fromShortByteStringUnsafe (ByteArray -> ShortByteString
byteArrayToShortByteString ByteArray
str)))
Char#
_ -> Int -> Parser SyntaxException s a
go (Int -> Parser SyntaxException s a)
-> Parser SyntaxException s Int -> Parser SyntaxException s a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ST s Int -> Parser SyntaxException s Int
forall s a e. ST s a -> Parser e s a
P.effect (MutableByteArray s -> Int -> Char -> ST s Int
forall s. MutableByteArray s -> Int -> Char -> ST s Int
encodeUtf8Char MutableByteArray s
dst Int
ix (Char# -> Char
C# Char#
c))
Int -> Parser SyntaxException s a
go Int
0
encodeUtf8Char :: MutableByteArray s -> Int -> Char -> ST s Int
encodeUtf8Char :: MutableByteArray s -> Int -> Char -> ST s Int
encodeUtf8Char !MutableByteArray s
marr !Int
ix !Char
c
| Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
< Char
'\128' = do
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr Int
ix (Char -> Word8
c2w Char
c)
Int -> ST s Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
| Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
< Char
'\x0800' = do
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr Int
ix
(Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftR (Char -> Int
ord Char
c) Int
6 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
0b11000000))
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
(Word8
0b10000000 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word8
0b00111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Char -> Int
ord Char
c))))
Int -> ST s Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
| Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\xffff' = do
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr Int
ix
(Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftR (Char -> Int
ord Char
c) Int
12 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
0b11100000))
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
(Word8
0b10000000 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word8
0b00111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftR (Char -> Int
ord Char
c) Int
6))))
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
(Word8
0b10000000 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word8
0b00111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Char -> Int
ord Char
c))))
Int -> ST s Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
| Bool
otherwise = do
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr Int
ix
(Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftR (Char -> Int
ord Char
c) Int
18 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
0b11110000))
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
(Word8
0b10000000 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word8
0b00111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftR (Char -> Int
ord Char
c) Int
12))))
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
(Word8
0b10000000 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word8
0b00111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Int -> Int -> Int
forall a. Bits a => a -> Int -> a
unsafeShiftR (Char -> Int
ord Char
c) Int
6))))
MutableByteArray (PrimState (ST s)) -> Int -> Word8 -> ST s ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
PM.writeByteArray MutableByteArray s
MutableByteArray (PrimState (ST s))
marr (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
(Word8
0b10000000 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word8
0b00111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int @Word8 (Char -> Int
ord Char
c))))
Int -> ST s Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int
ix Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4)
byteArrayToShortByteString :: ByteArray -> BSS.ShortByteString
byteArrayToShortByteString :: ByteArray -> ShortByteString
byteArrayToShortByteString (PM.ByteArray ByteArray#
x) = ByteArray# -> ShortByteString
BSS.SBS ByteArray#
x
w16ToChar :: Word16 -> Char
w16ToChar :: Word16 -> Char
w16ToChar (W16# Word#
w) = Char# -> Char
C# (Int# -> Char#
chr# (Word# -> Int#
word2Int# Word#
w))
pattern (:->) :: ShortText -> Value -> Member
pattern key $b:-> :: ShortText -> Value -> Member
$m:-> :: forall r. Member -> (ShortText -> Value -> r) -> (Void# -> r) -> r
:-> value = Member{key,value}
object1 :: Member -> Value
{-# inline object1 #-}
object1 :: Member -> Value
object1 Member
a = Chunks Member -> Value
Object (Member -> Chunks Member
forall a. a -> Chunks a
Chunks.singleton Member
a)
object2 :: Member -> Member -> Value
{-# inline object2 #-}
object2 :: Member -> Member -> Value
object2 Member
a Member
b = Chunks Member -> Value
Object (Member -> Member -> Chunks Member
forall a. a -> a -> Chunks a
Chunks.doubleton Member
a Member
b)
object3 :: Member -> Member -> Member -> Value
{-# inline object3 #-}
object3 :: Member -> Member -> Member -> Value
object3 Member
a Member
b Member
c = Chunks Member -> Value
Object (Member -> Member -> Member -> Chunks Member
forall a. a -> a -> a -> Chunks a
Chunks.tripleton Member
a Member
b Member
c)
object4 :: Member -> Member -> Member -> Member -> Value
{-# inline object4 #-}
object4 :: Member -> Member -> Member -> Member -> Value
object4 Member
a Member
b Member
c Member
d = Chunks Member -> Value
Object (Member -> Member -> Member -> Member -> Chunks Member
forall a. a -> a -> a -> a -> Chunks a
Chunks.quadrupleton Member
a Member
b Member
c Member
d)
object5 :: Member -> Member -> Member -> Member -> Member -> Value
{-# inline object5 #-}
object5 :: Member -> Member -> Member -> Member -> Member -> Value
object5 Member
a Member
b Member
c Member
d Member
e = Chunks Member -> Value
Object (Member -> Member -> Member -> Member -> Member -> Chunks Member
forall a. a -> a -> a -> a -> a -> Chunks a
Chunks.quintupleton Member
a Member
b Member
c Member
d Member
e)
object6 :: Member -> Member -> Member -> Member -> Member -> Member -> Value
{-# inline object6 #-}
object6 :: Member -> Member -> Member -> Member -> Member -> Member -> Value
object6 Member
a Member
b Member
c Member
d Member
e Member
f = Chunks Member -> Value
Object (Member
-> Member -> Member -> Member -> Member -> Member -> Chunks Member
forall a. a -> a -> a -> a -> a -> a -> Chunks a
Chunks.sextupleton Member
a Member
b Member
c Member
d Member
e Member
f)
object7 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Value
{-# inline object7 #-}
object7 :: Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Value
object7 Member
a Member
b Member
c Member
d Member
e Member
f Member
g = Chunks Member -> Value
Object (Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Chunks Member
forall a. a -> a -> a -> a -> a -> a -> a -> Chunks a
Chunks.septupleton Member
a Member
b Member
c Member
d Member
e Member
f Member
g)
object8 :: Member -> Member -> Member -> Member -> Member -> Member -> Member -> Member -> Value
{-# inline object8 #-}
object8 :: Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Value
object8 Member
a Member
b Member
c Member
d Member
e Member
f Member
g Member
h = Chunks Member -> Value
Object (Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Member
-> Chunks Member
forall a. a -> a -> a -> a -> a -> a -> a -> a -> Chunks a
Chunks.octupleton Member
a Member
b Member
c Member
d Member
e Member
f Member
g Member
h)