| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Saison
Description
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.
Constructors
| 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.
Constructors
| TkItem (Tokens (TkArray k e) e) | |
| TkArrayEnd k | |
| TkArrayErr e |
Record tokens.
Constructors
| 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 #
Minimal complete definition
Methods
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 Methods fmap :: (a -> b) -> RecordParser a -> RecordParser b # (<$) :: a -> RecordParser b -> RecordParser a # | |
| Applicative RecordParser Source # | |
Defined in Saison.Decoding.Record Methods 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 #