cassava-conduit 0.3.4 → 0.3.5
raw patch · 4 files changed
+100/−90 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- cassava-conduit.cabal +8/−3
- quickcheck/Main.hs +4/−2
- src/Data/Csv/Conduit.hs +56/−55
- src/LocalPrelude.hs +32/−30
cassava-conduit.cabal view
@@ -1,5 +1,5 @@ name: cassava-conduit-version: 0.3.4+version: 0.3.5 license: BSD3 license-file: etc/LICENCE.md author: Dom De Re@@ -56,8 +56,13 @@ main-is: Main.hs hs-source-dirs: quickcheck build-depends: base >= 4 && < 5- , QuickCheck == 2.9.*- , cassava-conduit+ , bytestring == 0.10.*+ , cassava == 0.4.*+ , conduit == 1.2.*+ , conduit-extra == 1.1.*+ , QuickCheck == 2.9.*+ , text == 1.2.*+ , cassava-conduit benchmark benchmarks default-language: Haskell2010
quickcheck/Main.hs view
@@ -1,5 +1,7 @@ module Main where +import qualified Test.Data.Csv.Conduit+ import Control.Monad import System.Exit@@ -7,5 +9,5 @@ main :: IO () main = hSetBuffering stdout LineBuffering >> mapM id- [- ] >>= \rs -> when (not . all id $ rs) exitFailure+ [ Test.Data.Csv.Conduit.tests+ ] >>= \rs -> when (not . all id $ rs) exitFailure
src/Data/Csv/Conduit.hs view
@@ -10,44 +10,45 @@ -- ------------------------------------------------------------------- module Data.Csv.Conduit (- -- * Types- CsvParseError(..)- , CsvStreamHaltParseError(..)- , CsvStreamRecordParseError(..)- -- * Conduits- , fromCsv- , fromCsvLiftError- , fromNamedCsv- , fromNamedCsvLiftError- , fromCsvStreamError- , fromNamedCsvStreamError- , toCsv- ) where+ -- * Types+ CsvParseError(..)+ , CsvStreamHaltParseError(..)+ , CsvStreamRecordParseError(..)+ -- * Conduits+ , fromCsv+ , fromCsvLiftError+ , fromNamedCsv+ , fromNamedCsvLiftError+ , fromCsvStreamError+ , fromNamedCsvStreamError+ , toCsv+ ) where import LocalPrelude -import Control.Monad.Trans ( MonadTrans(..) )-import Control.Monad.Error.Class ( MonadError(..) )-import Data.Bifunctor ( first )+import Control.Monad.Trans (MonadTrans(..))+import Control.Monad.Error.Class (MonadError(..))+import Data.Bifunctor (first) import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL-import Data.Conduit ( Conduit, await, yield )-import Data.Conduit.List ( map, mapM )-import Data.Csv ( FromNamedRecord, FromRecord, ToRecord, DecodeOptions, EncodeOptions, HasHeader, encodeWith )-import Data.Csv.Incremental ( HeaderParser(..), Parser(..), decodeByNameWith, decodeWith )-import Data.Foldable ( mapM_ )+import Data.Conduit (Conduit, await, yield)+import Data.Conduit.List (map, mapM)+import Data.Csv (FromNamedRecord, FromRecord, ToRecord, DecodeOptions, EncodeOptions, HasHeader, encodeWith)+import Data.Csv.Incremental (HeaderParser(..), Parser(..), decodeByNameWith, decodeWith)+import Data.Foldable (mapM_) import qualified Data.Text as T data CsvParseError =- CsvParseError BS.ByteString T.Text- | IncrementalError T.Text- deriving (Show, Eq)+ CsvParseError BS.ByteString T.Text+ | IncrementalError T.Text+ deriving (Show, Eq) -- | When you want to include errors in the stream, this error type represents errors that halt the stream. -- They do not appear inside the conduit and will instead get returned from running the conduit. ---data CsvStreamHaltParseError = HaltingCsvParseError BS.ByteString T.Text -- ^ the remaining bytestring that was read in but not parsed yet, and the stringy error msg describing the fail.- deriving (Show, Eq)+data CsvStreamHaltParseError =+ HaltingCsvParseError BS.ByteString T.Text -- ^ the remaining bytestring that was read in but not parsed yet, and the stringy error msg describing the fail.+ deriving (Show, Eq) -- | When you want to include errors in the stream, these are the errors that can be included in the stream, -- they are usually problems restricted to individual records, and streaming can resume from the next record@@ -116,45 +117,45 @@ streamParser :: (MonadError e m) => (CsvStreamHaltParseError -> e) -> Parser a -> Conduit BS.ByteString m (Either CsvStreamRecordParseError a) streamParser f (Fail rest errMsg) = {-# SCC streamParser_Fail_p #-} lift . throwError . f $ HaltingCsvParseError rest (T.pack errMsg) streamParser f (Many rs p) = {-# SCC streamParser_Many_p #-} do- -- send the results down the stream..- mapM_ (yield . first (CsvStreamRecordParseError . T.pack)) rs- -- wait for more..- more <- await- maybe (return ()) (streamParser f . p) more+ -- send the results down the stream..+ mapM_ (yield . first (CsvStreamRecordParseError . T.pack)) rs+ -- wait for more..+ more <- await+ maybe (return ()) (streamParser f . p) more streamParser _ (Done rs) = {-# SCC streamParser_Done_p #-} mapM_ (yield . first (CsvStreamRecordParseError . T.pack)) rs terminatingStreamHeaderParser- :: (Monad m, MonadError e m)- => (CsvParseError -> e)- -> HeaderParser (Parser a)- -> Conduit BS.ByteString m a+ :: (Monad m, MonadError e m)+ => (CsvParseError -> e)+ -> HeaderParser (Parser a)+ -> Conduit BS.ByteString m a terminatingStreamHeaderParser f (FailH rest errMsg) = {-# SCC terminatingStreamHeaderParser_FailH_p #-} lift . throwError . f . CsvParseError rest . T.pack $ errMsg terminatingStreamHeaderParser f (PartialH p) = {-# SCC terminatingStreamHeaderParser_PartialH_p #-} await >>= maybe (return ()) (terminatingStreamHeaderParser f . p) terminatingStreamHeaderParser f (DoneH _ p) = {-# SCC terminatingStreamHeaderParser_DoneH_p #-} terminatingStreamParser f p terminatingStreamParser- :: (Monad m, MonadError e m)- => (CsvParseError -> e)- -> Parser a- -> Conduit BS.ByteString m a+ :: (Monad m, MonadError e m)+ => (CsvParseError -> e)+ -> Parser a+ -> Conduit BS.ByteString m a terminatingStreamParser f (Fail rest errMsg) = {-# SCC terminatingStreamParser_Fail_p #-} lift . throwError . f . CsvParseError rest . T.pack $ errMsg terminatingStreamParser f (Many ers p) = {-# SCC terminatingStreamParser_Many_p #-}- let- errorHandler :: (Monad m, MonadError e m) => (CsvParseError -> e) -> String -> Conduit BS.ByteString m a- errorHandler f' = mapM . const . throwError . f' . IncrementalError . T.pack+ let+ errorHandler :: (Monad m, MonadError e m) => (CsvParseError -> e) -> String -> Conduit BS.ByteString m a+ errorHandler f' = mapM . const . throwError . f' . IncrementalError . T.pack - safeResultHandler- :: (Monad m)- => (BS.ByteString -> Parser a)- -> (Parser a -> Conduit BS.ByteString m a)- -> [a]- -> Conduit BS.ByteString m a- safeResultHandler p' f' rs = do- mapM_ yield rs- -- wait for more..- await >>= maybe (return ()) (f' . p')- in- -- send the results down the stream..- either (errorHandler f) (safeResultHandler p (terminatingStreamParser f)) (sequence ers)+ safeResultHandler+ :: (Monad m)+ => (BS.ByteString -> Parser a)+ -> (Parser a -> Conduit BS.ByteString m a)+ -> [a]+ -> Conduit BS.ByteString m a+ safeResultHandler p' f' rs = do+ mapM_ yield rs+ -- wait for more..+ await >>= f' . p' . fromMaybe BS.empty+ in+ -- send the results down the stream..+ either (errorHandler f) (safeResultHandler p (terminatingStreamParser f)) (sequence ers) terminatingStreamParser f (Done rs) = {-# SCC terminatingStreamParser_Done_p #-} either (lift . throwError . f . IncrementalError . T.pack) (mapM_ yield) (sequence rs)
src/LocalPrelude.hs view
@@ -9,37 +9,39 @@ -- ------------------------------------------------------------------- module LocalPrelude (- -- * Type Classes- Functor(..)- , A.Applicative(..)- , Monad(..)- , Num(..)- , Show(..)- , Eq(..)- -- * Types- , Char- , Either(..)- , Int- , IO- , Maybe(..)- , String- , Word8- -- * Operators- , (.)- , ($)- , ($!)- , (<$>)- , (++)- -- * Functions- , id- , const- , either- , flip- , fromIntegral- , maybe- , sequence- ) where+ -- * Type Classes+ Functor(..)+ , A.Applicative(..)+ , Monad(..)+ , Num(..)+ , Show(..)+ , Eq(..)+ -- * Types+ , Char+ , Either(..)+ , Int+ , IO+ , Maybe(..)+ , String+ , Word8+ -- * Operators+ , (.)+ , ($)+ , ($!)+ , (<$>)+ , (++)+ -- * Functions+ , id+ , const+ , either+ , flip+ , fromIntegral+ , fromMaybe+ , maybe+ , sequence+ ) where import Prelude import Control.Applicative as A+import Data.Maybe (fromMaybe) import Data.Word