streaming-cassava 0.1.0.2 → 0.2.0.0
raw patch · 3 files changed
+61/−57 lines, 3 filesdep ~streaming-bytestringPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: streaming-bytestring
API changes (from Hackage documentation)
- Streaming.Cassava: decode :: (MonadError CsvParseException m, FromRecord a) => HasHeader -> ByteString m r -> Stream (Of a) m r
+ Streaming.Cassava: decode :: (MonadError CsvParseException m, FromRecord a) => HasHeader -> ByteStream m r -> Stream (Of a) m r
- Streaming.Cassava: decodeByName :: (MonadError CsvParseException m, FromNamedRecord a) => ByteString m r -> Stream (Of a) m r
+ Streaming.Cassava: decodeByName :: (MonadError CsvParseException m, FromNamedRecord a) => ByteStream m r -> Stream (Of a) m r
- Streaming.Cassava: decodeByNameWith :: (MonadError CsvParseException m, FromNamedRecord a) => DecodeOptions -> ByteString m r -> Stream (Of a) m r
+ Streaming.Cassava: decodeByNameWith :: (MonadError CsvParseException m, FromNamedRecord a) => DecodeOptions -> ByteStream m r -> Stream (Of a) m r
- Streaming.Cassava: decodeByNameWithErrors :: (Monad m, FromNamedRecord a) => DecodeOptions -> ByteString m r -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteString m r) r)
+ Streaming.Cassava: decodeByNameWithErrors :: (Monad m, FromNamedRecord a) => DecodeOptions -> ByteStream m r -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteStream m r) r)
- Streaming.Cassava: decodeWith :: (MonadError CsvParseException m, FromRecord a) => DecodeOptions -> HasHeader -> ByteString m r -> Stream (Of a) m r
+ Streaming.Cassava: decodeWith :: (MonadError CsvParseException m, FromRecord a) => DecodeOptions -> HasHeader -> ByteStream m r -> Stream (Of a) m r
- Streaming.Cassava: decodeWithErrors :: (Monad m, FromRecord a) => DecodeOptions -> HasHeader -> ByteString m r -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteString m r) r)
+ Streaming.Cassava: decodeWithErrors :: (Monad m, FromRecord a) => DecodeOptions -> HasHeader -> ByteStream m r -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteStream m r) r)
- Streaming.Cassava: encode :: (ToRecord a, Monad m) => Maybe Header -> Stream (Of a) m r -> ByteString m r
+ Streaming.Cassava: encode :: (ToRecord a, Monad m) => Maybe Header -> Stream (Of a) m r -> ByteStream m r
- Streaming.Cassava: encodeByName :: (ToNamedRecord a, Monad m) => Header -> Stream (Of a) m r -> ByteString m r
+ Streaming.Cassava: encodeByName :: (ToNamedRecord a, Monad m) => Header -> Stream (Of a) m r -> ByteStream m r
- Streaming.Cassava: encodeByNameDefault :: forall a m r. (DefaultOrdered a, ToNamedRecord a, Monad m) => Stream (Of a) m r -> ByteString m r
+ Streaming.Cassava: encodeByNameDefault :: forall a m r. (DefaultOrdered a, ToNamedRecord a, Monad m) => Stream (Of a) m r -> ByteStream m r
- Streaming.Cassava: encodeByNameWith :: (ToNamedRecord a, Monad m) => EncodeOptions -> Header -> Stream (Of a) m r -> ByteString m r
+ Streaming.Cassava: encodeByNameWith :: (ToNamedRecord a, Monad m) => EncodeOptions -> Header -> Stream (Of a) m r -> ByteStream m r
- Streaming.Cassava: encodeDefault :: forall a m r. (ToRecord a, DefaultOrdered a, Monad m) => Stream (Of a) m r -> ByteString m r
+ Streaming.Cassava: encodeDefault :: forall a m r. (ToRecord a, DefaultOrdered a, Monad m) => Stream (Of a) m r -> ByteStream m r
- Streaming.Cassava: encodeWith :: (ToRecord a, Monad m) => EncodeOptions -> Maybe Header -> Stream (Of a) m r -> ByteString m r
+ Streaming.Cassava: encodeWith :: (ToRecord a, Monad m) => EncodeOptions -> Maybe Header -> Stream (Of a) m r -> ByteStream m r
Files
- ChangeLog.md +4/−0
- src/Streaming/Cassava.hs +55/−55
- streaming-cassava.cabal +2/−2
ChangeLog.md view
@@ -1,5 +1,9 @@ # Revision history for streaming-cassava +## 0.2.0.0 -- 2021-02-28++* Support `streaming-bytestring-0.2.*`+ ## 0.1.0.2 -- 2021-02-28 * Fix issues with `readFile`.
src/Streaming/Cassava.hs view
@@ -65,41 +65,40 @@ , defaultEncodeOptions ) where -import qualified Data.ByteString as DB-import qualified Data.ByteString.Lazy as DBL-import Data.ByteString.Streaming (ByteString)-import qualified Data.ByteString.Streaming as B-import qualified Data.ByteString.Streaming.Internal as B-import Streaming (Of, Stream)-import qualified Streaming.Prelude as S+import qualified Data.ByteString as DB+import qualified Data.ByteString.Lazy as DBL+import Streaming (Of, Stream)+import Streaming.ByteString (ByteStream)+import qualified Streaming.ByteString as B+import qualified Streaming.ByteString.Internal as B+import qualified Streaming.Prelude as S -import Data.Csv (DecodeOptions (..),- DefaultOrdered (..),- EncodeOptions (..),- FromNamedRecord (..),- FromRecord (..), Header,- Name, ToNamedRecord (..),- ToRecord (..),- defaultDecodeOptions,- defaultEncodeOptions,- encIncludeHeader, header)-import Data.Csv.Incremental (HasHeader (..),- HeaderParser (..),- Parser (..))-import qualified Data.Csv.Incremental as CI+import Data.Csv (DecodeOptions (..),+ DefaultOrdered (..),+ EncodeOptions (..),+ FromNamedRecord (..),+ FromRecord (..), Header, Name,+ ToNamedRecord (..),+ ToRecord (..),+ defaultDecodeOptions,+ defaultEncodeOptions,+ encIncludeHeader, header)+import Data.Csv.Incremental (HasHeader (..),+ HeaderParser (..), Parser (..))+import qualified Data.Csv.Incremental as CI -import Control.Exception (Exception (..))-import Control.Monad.Error.Class (MonadError, throwError)-import Control.Monad.Trans.Class (lift)-import Data.Bifunctor (first)-import Data.String (IsString (..))-import Data.Typeable (Typeable)+import Control.Exception (Exception (..))+import Control.Monad.Error.Class (MonadError, throwError)+import Control.Monad.Trans.Class (lift)+import Data.Bifunctor (first)+import Data.String (IsString (..))+import Data.Typeable (Typeable) -------------------------------------------------------------------------------- -- | Use 'defaultOptions' for decoding the provided CSV. decode :: (MonadError CsvParseException m, FromRecord a)- => HasHeader -> ByteString m r+ => HasHeader -> ByteStream m r -> Stream (Of a) m r decode = decodeWith defaultDecodeOptions @@ -113,7 +112,7 @@ -- Unlike 'decodeWithErrors', any remaining input is discarded. decodeWith :: (MonadError CsvParseException m, FromRecord a) => DecodeOptions -> HasHeader- -> ByteString m r -> Stream (Of a) m r+ -> ByteStream m r -> Stream (Of a) m r decodeWith opts hdr bs = getValues (decodeWithErrors opts hdr bs) >>= either (throwError . fst) return @@ -123,32 +122,33 @@ -- -- 'S.partitionEithers' may be useful when using this function. decodeWithErrors :: (Monad m, FromRecord a) => DecodeOptions -> HasHeader- -> ByteString m r- -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteString m r) r)+ -> ByteStream m r+ -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteStream m r) r) decodeWithErrors opts = runParser . CI.decodeWith opts -runParser :: (Monad m) => Parser a -> ByteString m r- -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteString m r) r)+runParser :: (Monad m) => Parser a -> ByteStream m r+ -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteStream m r) r) runParser = loop where feed f str = do- nxt <- lift (B.nextChunk str)+ nxt <- lift (B.unconsChunk str) let g = loop . f case nxt of Left r -> pure $ Right r Right (chunk, rest) -> g chunk rest loop p str = case p of- Fail bs err -> return (Left (CsvParseException err, B.consChunk bs str))- Many es get -> withEach es >> feed get str- Done es -> do withEach es- -- This is primarily just to- -- return the @r@ value, but also- -- acts as a check on the parser.- nxt <- lift (B.nextChunk str)- return $ case nxt of- Left r -> Right r- Right _ -> Left ("Unconsumed input", str)+ Fail bs err -> return (Left (CsvParseException err, B.consChunk bs str))+ Many es get -> withEach es >> feed get str+ Done es -> do+ withEach es+ -- This is primarily just to+ -- return the @r@ value, but also+ -- acts as a check on the parser.+ nxt <- lift (B.unconsChunk str)+ return $ case nxt of+ Left r -> Right r+ Right _ -> Left ("Unconsumed input", str) withEach = S.each . map (first CsvParseException) @@ -156,7 +156,7 @@ -- | Use 'defaultOptions' for decoding the provided CSV. decodeByName :: (MonadError CsvParseException m, FromNamedRecord a)- => ByteString m r -> Stream (Of a) m r+ => ByteStream m r -> Stream (Of a) m r decodeByName = decodeByNameWith defaultDecodeOptions -- | Return back a stream of values from the provided CSV, stopping at@@ -173,7 +173,7 @@ -- discarded. decodeByNameWith :: (MonadError CsvParseException m, FromNamedRecord a) => DecodeOptions- -> ByteString m r -> Stream (Of a) m r+ -> ByteStream m r -> Stream (Of a) m r decodeByNameWith opts bs = getValues (decodeByNameWithErrors opts bs) >>= either (throwError . fst) return @@ -186,8 +186,8 @@ -- -- 'S.partitionEithers' may be useful when using this function. decodeByNameWithErrors :: (Monad m, FromNamedRecord a) => DecodeOptions- -> ByteString m r- -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteString m r) r)+ -> ByteStream m r+ -> Stream (Of (Either CsvParseException a)) m (Either (CsvParseException, ByteStream m r) r) decodeByNameWithErrors = loopH . CI.decodeByNameWith where loopH ph str = case ph of@@ -196,7 +196,7 @@ DoneH _ p -> runParser p str feedH f str = do- nxt <- lift (B.nextChunk str)+ nxt <- lift (B.unconsChunk str) let g = loopH . f case nxt of Left r -> pure $ Right r@@ -209,13 +209,13 @@ -- Optionally prefix the stream with headers (the 'header' function -- may be useful). encode :: (ToRecord a, Monad m) => Maybe Header- -> Stream (Of a) m r -> ByteString m r+ -> Stream (Of a) m r -> ByteStream m r encode = encodeWith defaultEncodeOptions -- | Encode a stream of values with the default options and a derived -- header prefixed. encodeDefault :: forall a m r. (ToRecord a, DefaultOrdered a, Monad m)- => Stream (Of a) m r -> ByteString m r+ => Stream (Of a) m r -> ByteStream m r encodeDefault = encode (Just (headerOrder (undefined :: a))) -- | Encode a stream of values with the provided options.@@ -223,7 +223,7 @@ -- Optionally prefix the stream with headers (the 'header' function -- may be useful). encodeWith :: (ToRecord a, Monad m) => EncodeOptions -> Maybe Header- -> Stream (Of a) m r -> ByteString m r+ -> Stream (Of a) m r -> ByteStream m r encodeWith opts mhdr = B.fromChunks . S.concat . addHeaders@@ -238,14 +238,14 @@ -- | Use the default ordering to encode all fields\/columns. encodeByNameDefault :: forall a m r. (DefaultOrdered a, ToNamedRecord a, Monad m)- => Stream (Of a) m r -> ByteString m r+ => Stream (Of a) m r -> ByteStream m r encodeByNameDefault = encodeByName (headerOrder (undefined :: a)) -- | Select the columns that you wish to encode from your data -- structure using default options (which currently includes -- printing the header). encodeByName :: (ToNamedRecord a, Monad m) => Header- -> Stream (Of a) m r -> ByteString m r+ -> Stream (Of a) m r -> ByteStream m r encodeByName = encodeByNameWith defaultEncodeOptions -- | Select the columns that you wish to encode from your data@@ -253,7 +253,7 @@ -- -- Header printing respects 'encIncludeheader'. encodeByNameWith :: (ToNamedRecord a, Monad m) => EncodeOptions -> Header- -> Stream (Of a) m r -> ByteString m r+ -> Stream (Of a) m r -> ByteStream m r encodeByNameWith opts hdr = B.fromChunks . S.concat . addHeaders
streaming-cassava.cabal view
@@ -1,5 +1,5 @@ name: streaming-cassava-version: 0.1.0.2+version: 0.2.0.0 synopsis: Cassava support for the streaming ecosystem description:@@ -31,7 +31,7 @@ , cassava == 0.5.* , mtl , streaming >= 0.1.1.0 && < 0.3- , streaming-bytestring < 0.2+ , streaming-bytestring == 0.2.* , transformers hs-source-dirs: src default-language: Haskell2010