yajl-enumerator 0.3 → 0.4
raw patch · 2 files changed
+51/−54 lines, 2 filesdep +json-typesdep ~textPVP ok
version bump matches the API change (PVP)
Dependencies added: json-types
Dependency ranges changed: text
API changes (from Hackage documentation)
- Text.JSON.YAJL.Enumerator: EventAttributeName :: Text -> Event
- Text.JSON.YAJL.Enumerator: EventBeginArray :: Event
- Text.JSON.YAJL.Enumerator: EventBeginObject :: Event
- Text.JSON.YAJL.Enumerator: EventBoolean :: Bool -> Event
- Text.JSON.YAJL.Enumerator: EventEndArray :: Event
- Text.JSON.YAJL.Enumerator: EventEndObject :: Event
- Text.JSON.YAJL.Enumerator: EventNull :: Event
- Text.JSON.YAJL.Enumerator: EventNumber :: ByteString -> Event
- Text.JSON.YAJL.Enumerator: EventText :: Text -> Event
- Text.JSON.YAJL.Enumerator: data Event
- Text.JSON.YAJL.Enumerator: instance Eq Event
- Text.JSON.YAJL.Enumerator: instance Show Event
Files
- Text/JSON/YAJL/Enumerator.hs +48/−52
- yajl-enumerator.cabal +3/−2
Text/JSON/YAJL/Enumerator.hs view
@@ -9,10 +9,9 @@ -- ----------------------------------------------------------------------------- module Text.JSON.YAJL.Enumerator- ( Event (..)- + ( -- * Parsing- , parseBytesIO+ parseBytesIO , parseBytesST -- * Generating@@ -28,9 +27,11 @@ import qualified Data.ByteString as B import qualified Data.Text as T import qualified Data.Text.Encoding as TE+import qualified Data.Text.Lazy as TL import qualified Data.Enumerator as E import Data.Enumerator ((>>==)) import qualified Text.JSON.YAJL as Y+import qualified Data.JSON.Types as J import Control.Exception as Exc import Control.Monad.IO.Class (MonadIO, liftIO)@@ -39,21 +40,10 @@ import qualified Data.STRef as ST import qualified Data.IORef as IO -data Event- = EventNull- | EventBoolean Bool- | EventNumber B.ByteString- | EventText T.Text- | EventBeginArray- | EventEndArray- | EventBeginObject- | EventAttributeName T.Text- | EventEndObject- deriving (Show, Eq)- -- Parser {{{ -parseBytesIO :: MonadIO m => E.Enumeratee B.ByteString Event m b+-- | Requires input to be in UTF-8+parseBytesIO :: MonadIO m => E.Enumeratee B.ByteString J.Event m b parseBytesIO s = do (p, eventRef) <- liftIO newParserIO @@ -67,7 +57,8 @@ let complete = withEvents (Y.parseComplete p) eneeParser (liftIO (Y.getBytesConsumed p)) parseChunk complete s -parseBytesST :: E.Enumeratee B.ByteString Event (ST s) b+-- | Requires input to be in UTF-8+parseBytesST :: E.Enumeratee B.ByteString J.Event (ST s) b parseBytesST s = do (p, eventRef) <- lift newParserST @@ -81,7 +72,7 @@ let complete = withEvents (Y.parseComplete p) eneeParser (Y.getBytesConsumed p) parseChunk complete s -newParserIO :: IO (Y.Parser IO, IO.IORef [Event])+newParserIO :: IO (Y.Parser IO, IO.IORef [J.Event]) newParserIO = do p <- Y.newParserIO eventRef <- IO.newIORef []@@ -89,7 +80,7 @@ setCallbacks p addEvent return (p, eventRef) -newParserST :: ST s (Y.Parser (ST s), ST.STRef s [Event])+newParserST :: ST s (Y.Parser (ST s), ST.STRef s [J.Event]) newParserST = do p <- Y.newParserST eventRef <- ST.newSTRef []@@ -97,25 +88,28 @@ setCallbacks p addEvent return (p, eventRef) -setCallbacks :: Monad m => Y.Parser m -> (Event -> m Bool) -> m ()+setCallbacks :: Monad m => Y.Parser m -> (J.Event -> m Bool) -> m () setCallbacks p addEvent = do let set = Y.setCallback p - set Y.parsedBeginArray (addEvent EventBeginArray)- set Y.parsedEndArray (addEvent EventEndArray)- set Y.parsedBeginObject (addEvent EventBeginObject)- set Y.parsedEndObject (addEvent EventEndObject)- set Y.parsedNull (addEvent EventNull)- set Y.parsedBoolean (addEvent . EventBoolean)- set Y.parsedNumber (addEvent . EventNumber)- set Y.parsedAttributeText (addEvent . EventAttributeName)- set Y.parsedText (addEvent . EventText)+ set Y.parsedBeginArray (addEvent J.EventBeginArray)+ set Y.parsedEndArray (addEvent J.EventEndArray)+ set Y.parsedBeginObject (addEvent J.EventBeginObject)+ set Y.parsedEndObject (addEvent J.EventEndObject)+ set Y.parsedNull (addEvent (J.EventAtom J.AtomNull))+ set Y.parsedBoolean (addEvent . J.EventAtom . J.AtomBoolean)+ set Y.parsedAttributeText (addEvent . J.EventAttributeName . TL.fromStrict)+ set Y.parsedText (addEvent . J.EventAtom . J.AtomText . TL.fromStrict)+ + -- this is going to bite me in the ass+ set Y.parsedInteger (addEvent . J.EventAtom . J.AtomNumber . fromInteger)+ set Y.parsedDouble (addEvent . J.EventAtom . J.AtomNumber . toRational) eneeParser :: Monad m => m Integer- -> (B.ByteString -> m ([Event], Y.ParseStatus))- -> m ([Event], Y.ParseStatus)- -> E.Enumeratee B.ByteString Event m b+ -> (B.ByteString -> m ([J.Event], Y.ParseStatus))+ -> m ([J.Event], Y.ParseStatus)+ -> E.Enumeratee B.ByteString J.Event m b eneeParser getBytesConsumed parseChunk parseComplete = E.checkDone (E.continue . step) where step k (E.Chunks xs) = parseLoop k xs step k E.EOF = do@@ -169,26 +163,26 @@ generateTextIO :: MonadIO m => Y.GeneratorConfig- -> E.Enumeratee Event T.Text m b+ -> E.Enumeratee J.Event T.Text m b generateTextIO = generateIO (fmap TE.decodeUtf8 . Y.getBuffer) generateBytesIO :: MonadIO m => Y.GeneratorConfig- -> E.Enumeratee Event B.ByteString m b+ -> E.Enumeratee J.Event B.ByteString m b generateBytesIO = generateIO Y.getBuffer generateTextST :: Y.GeneratorConfig- -> E.Enumeratee Event T.Text (ST s) b+ -> E.Enumeratee J.Event T.Text (ST s) b generateTextST = generateST (fmap TE.decodeUtf8 . Y.getBuffer) generateBytesST :: Y.GeneratorConfig- -> E.Enumeratee Event B.ByteString (ST s) b+ -> E.Enumeratee J.Event B.ByteString (ST s) b generateBytesST = generateST Y.getBuffer generateIO :: (Nullable a, MonadIO m) => (Y.Generator RealWorld -> ST RealWorld a) -> Y.GeneratorConfig- -> E.Enumeratee Event a m b+ -> E.Enumeratee J.Event a m b generateIO getBuf config s = do g <- liftIO $ stToIO $ Y.newGenerator config let takeBuf = liftIO $ stToIO $ do@@ -203,7 +197,7 @@ generateST :: Nullable a => (Y.Generator s -> ST s a) -> Y.GeneratorConfig- -> E.Enumeratee Event a (ST s) b+ -> E.Enumeratee J.Event a (ST s) b generateST getBuf config s = do g <- lift $ Y.newGenerator config let takeBuf = do@@ -216,14 +210,14 @@ eneeGenerator genEvent takeBuf s eneeGenerator :: (Nullable a, Monad m)- => (Event -> m (Maybe Y.GeneratorError))+ => (J.Event -> m (Maybe Y.GeneratorError)) -> m a- -> E.Enumeratee Event a m b+ -> E.Enumeratee J.Event a m b eneeGenerator genEvent takeBuf = E.checkDone (E.continue . step) where step k (E.Chunks []) = E.continue (step k) step k (E.Chunks xs) = parseLoop k xs step k E.EOF = do- maybeError <- lift (genEvent EventNull)+ maybeError <- lift (genEvent (J.EventAtom J.AtomNull)) case maybeError of Just Y.GenerationComplete -> E.yield (E.Continue k) E.EOF _ -> E.throwError (Exc.ErrorCall "yajl-enumerator: Unexpected EOF while generating")@@ -233,7 +227,7 @@ maybeError <- lift (genEvent x) case maybeError of Just Y.GenerationComplete -> checkBuf k xs- (\k' -> E.yield (E.Continue k') (E.Chunks (x:xs)))+ (\k' -> E.yield (E.Continue k') (E.Chunks xs)) Just err -> checkBuf k xs (\_ -> E.throwError err) Nothing -> parseLoop k xs @@ -243,16 +237,18 @@ then next k else k (E.Chunks [buf]) >>== E.checkDoneEx (E.Chunks extra) next -genEventImpl :: Y.Generator s -> Event -> ST s ()+genEventImpl :: Y.Generator s -> J.Event -> ST s () genEventImpl g e = case e of- EventNull -> Y.generateNull g- EventBoolean x -> Y.generateBoolean g x- EventNumber num -> Y.generateNumber g num- EventText text -> Y.generateText g text- EventBeginArray -> Y.generateBeginArray g- EventEndArray -> Y.generateEndArray g- EventBeginObject -> Y.generateBeginObject g- EventAttributeName name -> Y.generateText g name- EventEndObject -> Y.generateEndObject g+ J.EventBeginObject -> Y.generateBeginObject g+ J.EventEndObject -> Y.generateEndObject g+ J.EventBeginArray -> Y.generateBeginArray g+ J.EventEndArray -> Y.generateEndArray g+ J.EventAttributeName name -> Y.generateText g (TL.toStrict name)+ + J.EventAtom atom -> case atom of+ J.AtomNull -> Y.generateNull g+ J.AtomBoolean x -> Y.generateBoolean g x+ J.AtomNumber num -> Y.generateDouble g (fromRational num)+ J.AtomText text -> Y.generateText g (TL.toStrict text) -- }}}
yajl-enumerator.cabal view
@@ -1,5 +1,5 @@ name: yajl-enumerator-version: 0.3+version: 0.4 synopsis: Enumerator-based interface to YAJL, an event-based JSON implementation license: GPL-3 license-file: license.txt@@ -24,10 +24,11 @@ build-depends: base >= 4 && < 5 , bytestring >= 0.9 && < 0.10- , text >= 0.7 && < 0.12+ , text >= 0.8 && < 0.12 , enumerator >= 0.4.3 && < 0.5 , transformers >= 0.2 && < 0.3 , yajl >= 0.3 && < 0.4+ , json-types >= 0.1 && < 0.2 exposed-modules: Text.JSON.YAJL.Enumerator