packages feed

attoparsec-enumerator 0.2.0.4 → 0.2.0.5

raw patch · 3 files changed

+93/−67 lines, 3 filesdep ~attoparsecdep ~basedep ~bytestringPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: attoparsec, base, bytestring

API changes (from Hackage documentation)

Files

− Data/Attoparsec/Enumerator.hs
@@ -1,52 +0,0 @@--------------------------------------------------------------------------------- |--- Module: Data.Attoparsec.Enumerator--- Copyright: 2010 John Millikin--- License: MIT------ Maintainer: jmillikin@gmail.com--- Portability: portable----------------------------------------------------------------------------------{-# LANGUAGE DeriveDataTypeable #-}-module Data.Attoparsec.Enumerator-	( ParseError (..)-	, iterParser-	) where-import Control.Exception (Exception)-import Data.Typeable (Typeable)-import qualified Data.Attoparsec as A-import qualified Data.ByteString as B-import qualified Data.Enumerator as E---- | The context and message from a 'A.Fail' value.-data ParseError = ParseError-	{ errorContexts :: [String]-	, errorMessage :: String-	}-	deriving (Show, Typeable)--instance Exception ParseError---- | Convert an Attoparsec 'A.Parser' into an 'E.Iteratee'. The parser will--- be streamed bytes until it returns 'A.Done' or 'A.Fail'.------ If parsing fails, the iteratee's error value will contain a 'ParseError'.-iterParser :: Monad m => A.Parser a -> E.Iteratee B.ByteString m a-iterParser p = E.continue (step (A.parse p)) where-	step parse (E.Chunks xs) = parseLoop parse (notEmpty xs)-	step parse E.EOF = case A.feed (parse B.empty) B.empty of-		A.Done _ a -> E.yield a E.EOF-		A.Partial _ -> err [] "iterParser: divergent parser"-		A.Fail _ ctx msg -> err ctx msg-	-	parseLoop parse [] = E.continue (step parse)-	parseLoop parse (x:xs) = case parse x of-		A.Done extra a -> E.yield a $ if B.null extra-			then E.Chunks xs-			else E.Chunks (extra:xs)-		A.Partial parse' -> parseLoop parse' xs-		A.Fail _ ctx msg -> err ctx msg-	-	err ctx msg = E.throwError (ParseError ctx msg)-	notEmpty = filter (not . B.null)
attoparsec-enumerator.cabal view
@@ -1,33 +1,58 @@ name: attoparsec-enumerator-version: 0.2.0.4-synopsis: Convert an Attoparsec parser into an iteratee+version: 0.2.0.5 license: MIT license-file: license.txt author: John Millikin <jmillikin@gmail.com>-maintainer: jmillikin@gmail.com-copyright: Copyright (c) John Millikin 2010+maintainer: John Millikin <jmillikin@gmail.com> build-type: Simple-cabal-version: >=1.6+cabal-version: >= 1.6 category: Text, Parsing, Enumerator stability: experimental+homepage: https://john-millikin.com/software/attoparsec-enumerator/ bug-reports: mailto:jmillikin@gmail.com-homepage: http://john-millikin.com/software/attoparsec-enumerator/-tested-with: GHC==6.12.1 +synopsis: Pass input from an enumerator to an Attoparsec parser.+description:+  This library allows an Attoparsec parser to receive input incrementally+  from an enumerator. This could be used for parsing large files, or+  implementing binary network protocols.+  .+  > (-# LANGUAGE OverloadedStrings #-)+  >+  > import Control.Applicative+  > import Data.Attoparsec+  > import Data.Attoparsec.Enumerator+  > import Data.Enumerator+  > import Data.Enumerator.Binary (enumHandle)+  > import Data.Enumerator.List+  > import System.IO+  >+  > parser = string "foo" <|> string "bar"+  >+  > main = do+  >     xy <- run_ (enumHandle 1 stdin $$ do+  >         x <- iterParser parser+  >         y <- iterParser parser+  >         return (x, y))+  >     print xy++ source-repository head   type: bazaar-  location: http://john-millikin.com/software/attoparsec-enumerator/+  location: https://john-millikin.com/branches/attoparsec-enumerator/0.2/ -library-  if true-    ghc-options: -Wall+source-repository this+  type: bazaar+  location: https://john-millikin.com/branches/attoparsec-enumerator/0.2/+  tag: attoparsec-enumerator_0.2.0.5 -  if impl(ghc >= 6.11)-    ghc-options: -fno-warn-unused-do-bind+library+  hs-source-dirs: lib+  ghc-options: -Wall -O2    build-depends:-      base >= 3 && < 5-    , attoparsec >= 0.8 && < 0.10+      base >= 4.0 && < 5.0+    , attoparsec >= 0.8 && < 0.11     , bytestring >= 0.9 && < 0.10     , enumerator >= 0.4 && < 0.5 
+ lib/Data/Attoparsec/Enumerator.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE DeriveDataTypeable #-}++-- |+-- Module: Data.Attoparsec.Enumerator+-- Copyright: 2010 John Millikin+-- License: MIT+--+-- Maintainer: jmillikin@gmail.com+-- Portability: portable+module Data.Attoparsec.Enumerator+	( ParseError (..)+	, iterParser+	) where++import           Control.Exception (Exception)+import           Data.Typeable (Typeable)+import qualified Data.ByteString as B++import qualified Data.Attoparsec as A+import qualified Data.Enumerator as E++-- | The context and message from a 'A.Fail' value.+data ParseError = ParseError+	{ errorContexts :: [String]+	, errorMessage :: String+	}+	deriving (Show, Typeable)++instance Exception ParseError++-- | Convert an Attoparsec 'A.Parser' into an 'E.Iteratee'. The parser will+-- be streamed bytes until it returns 'A.Done' or 'A.Fail'.+--+-- If parsing fails, a 'ParseError' will be thrown with 'E.throwError'. Use+-- 'E.catchError' to catch it.+iterParser :: Monad m => A.Parser a -> E.Iteratee B.ByteString m a+iterParser p = E.continue (step (A.parse p)) where+	step parse (E.Chunks xs) = parseLoop parse (notEmpty xs)+	step parse E.EOF = case A.feed (parse B.empty) B.empty of+		A.Done _ a -> E.yield a E.EOF+		A.Partial _ -> err [] "iterParser: divergent parser"+		A.Fail _ ctx msg -> err ctx msg+	+	parseLoop parse [] = E.continue (step parse)+	parseLoop parse (x:xs) = case parse x of+		A.Done extra a -> E.yield a $ if B.null extra+			then E.Chunks xs+			else E.Chunks (extra:xs)+		A.Partial parse' -> parseLoop parse' xs+		A.Fail _ ctx msg -> err ctx msg+	+	err ctx msg = E.throwError (ParseError ctx msg)+	notEmpty = filter (not . B.null)