packages feed

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 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