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 +0/−52
- attoparsec-enumerator.cabal +40/−15
- lib/Data/Attoparsec/Enumerator.hs +53/−0
− 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)