Safe Haskell | None |
---|---|
Language | Haskell2010 |
Stream Aeson, fruity, spicy, well carbonated.
Saison represents JSON document as well-formed token stream.
This approach is potentially faster than document model (i.e. representing
document as an ADT) used in aeson
. Also the approach is more
flexible, as more structure is preseved, especially key-value
pairs in records are not ordered.
Saison is proof-of-concept package at the moment.
The tokens aren't exactly as in JSON, but in similar grammar. There are no commas, but each item in arrays is prepended with zero-width marker (to differentiate from the end):
VALUE = LITERAL | TEXT | NUMBER | "[" ARRAY | "{" RECORD LITERAL = "null" | "true" | "false" TEXT = ... NUMBER = ... ARRAY = ITEM VALUE ARRAY | "]" ITEM = epsilon RECORD = KEY VALUE RECORD | "}" KEY = TEXT
Haskell types reflect this grammar:
Synopsis
- data Tokens k e
- = TkLit !Lit k
- | TkText !Text k
- | TkNumber !Scientific k
- | TkArrayOpen (TkArray k e)
- | TkRecordOpen (TkRecord k e)
- | TkErr e
- data Lit
- data TkArray k e
- = TkItem (Tokens (TkArray k e) e)
- | TkArrayEnd k
- | TkArrayErr e
- data TkRecord k e
- = TkPair !Text (Tokens (TkRecord k e) e)
- | TkRecordEnd k
- | TkRecordErr e
- toValue :: Tokens b Void -> Value
- fromValue :: Value -> Tokens () a
- eitherDecodeStrict :: FromTokens a => ByteString -> Either String a
- class FromTokens a where
- fromTokens :: Tokens k String -> Result String k a
- fromTokensList :: Tokens k String -> Result String k [a]
- skipValue :: Tokens k e -> Result e k ()
- data RecordParser a
- runRecordParser :: RecordParser a -> Tokens k String -> Result String k a
- requiredField :: Text -> (forall k. Tokens k String -> Result String k a) -> RecordParser a
- optionalField :: Text -> (forall k. Tokens k String -> Result String k a) -> RecordParser (Maybe a)
- skippedField :: Text -> RecordParser (a -> a)
- (<.:>) :: FromTokens a => RecordParser (a -> b) -> Text -> RecordParser b
- (<.:?>) :: FromTokens a => RecordParser (Maybe a -> b) -> Text -> RecordParser b
Types
Tokens.
Note: Lit
exists to make Tokens
have only 6 constructors.
This may or may not have impact on performance.
TkLit !Lit k | |
TkText !Text k | |
TkNumber !Scientific k | |
TkArrayOpen (TkArray k e) | |
TkRecordOpen (TkRecord k e) | |
TkErr e |
Literals. null
, true
, false
.
Array tokens.
TkItem (Tokens (TkArray k e) e) | |
TkArrayEnd k | |
TkArrayErr e |
Record tokens.
TkPair !Text (Tokens (TkRecord k e) e) | |
TkRecordEnd k | |
TkRecordErr e |
Conversion to/from Value
Parsing
eitherDecodeStrict :: FromTokens a => ByteString -> Either String a Source #
Parse a value from strict ByteString
.
class FromTokens a where Source #
fromTokens :: Tokens k String -> Result String k a Source #
fromTokensList :: Tokens k String -> Result String k [a] Source #
Instances
FromTokens Char Source # | |
FromTokens Void Source # | |
FromTokens Text Source # | |
FromTokens Value Source # | |
Defined in Saison.Decoding.Class | |
FromTokens Laureate Source # | |
FromTokens SomeValue Source # | |
FromTokens a => FromTokens [a] Source # | |
Defined in Saison.Decoding.Class | |
FromTokens a => FromTokens (Laureates a) Source # | This instance differs from
|
Record
data RecordParser a Source #
Instances
Functor RecordParser Source # | |
Defined in Saison.Decoding.Record fmap :: (a -> b) -> RecordParser a -> RecordParser b # (<$) :: a -> RecordParser b -> RecordParser a # | |
Applicative RecordParser Source # | |
Defined in Saison.Decoding.Record pure :: a -> RecordParser a # (<*>) :: RecordParser (a -> b) -> RecordParser a -> RecordParser b # liftA2 :: (a -> b -> c) -> RecordParser a -> RecordParser b -> RecordParser c # (*>) :: RecordParser a -> RecordParser b -> RecordParser b # (<*) :: RecordParser a -> RecordParser b -> RecordParser a # |
runRecordParser :: RecordParser a -> Tokens k String -> Result String k a Source #
requiredField :: Text -> (forall k. Tokens k String -> Result String k a) -> RecordParser a Source #
optionalField :: Text -> (forall k. Tokens k String -> Result String k a) -> RecordParser (Maybe a) Source #
skippedField :: Text -> RecordParser (a -> a) Source #
(<.:>) :: FromTokens a => RecordParser (a -> b) -> Text -> RecordParser b infixl 4 Source #
requiredField
using FromTokens
parser.
(<.:?>) :: FromTokens a => RecordParser (Maybe a -> b) -> Text -> RecordParser b infixl 4 Source #