binary-ext 2.0.1 → 2.0.2
raw patch · 13 files changed
+66/−43 lines, 13 filesdep ~base
Dependency ranges changed: base
Files
- binary-ext.cabal +4/−4
- src/Control/Monad/Error/Map.hs +18/−0
- src/Data/Conduit/Parsers/Binary/Get.hs +2/−2
- src/Data/Conduit/Parsers/Binary/Put.hs +6/−5
- src/Data/Conduit/Parsers/GetC.hs +1/−1
- src/Data/Conduit/Parsers/PutS.hs +2/−3
- src/Data/Conduit/Parsers/Text/Gen.hs +2/−2
- src/Data/Conduit/Parsers/Text/Parser.hs +2/−12
- src/Data/Conduit/Parsers/Text/TextOffset.hs +0/−10
- test/Data/Conduit/Parsers/Binary/Get/Spec.hs +1/−1
- test/Data/Conduit/Parsers/Binary/Put/Spec.hs +1/−1
- test/Data/Conduit/Parsers/Text/Gen/Spec.hs +1/−1
- test/Data/Conduit/Parsers/Text/Parser/Spec.hs +26/−1
binary-ext.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 2b14ea0ba0ef4c6bc5bea0c2bf4b212481d986cb9267ece31ab81e2b88c012b2+-- hash: adceab08b9d69285d6c3b663ac9de2e05f12135642f1815b44ac5933ec0db13d name: binary-ext-version: 2.0.1+version: 2.0.2 synopsis: An alternate with strong-typed errors for `Data.Binary.Get` monad from `binary` package. description: An alternate with strong-typed errors for `Data.Binary.Get` monad from `binary` package. category: Data, Parsing@@ -45,7 +45,7 @@ ghc-options: -fmax-pmcheck-iterations=100000000 -Wall -fno-warn-unused-imports -fprint-potential-instances -fsimpl-tick-factor=110 build-depends: attoparsec- , base >=4.7 && <5+ , base >=4.11 && <5 , binary , bytestring , conduit >=1.3.0@@ -79,7 +79,7 @@ build-depends: HUnit , attoparsec- , base >=4.7 && <5+ , base >=4.11 && <5 , binary , binary-ext , bytestring
src/Control/Monad/Error/Map.hs view
@@ -13,6 +13,24 @@ -- See the License for the specific language governing permissions and -- limitations under the License. --+-- | This module provides generic functions set useful for errortype-parameterized monads and monad transformers,+-- such as 'Data.Conduit.Parsers.Binary.Get.Get'.+-- Example:+--+-- > pSign :: Parser (Maybe Char) Bool+-- > pSign = do+-- > c <- pChar ?>> return Nothing+-- > case c of+-- > '+' -> return False+-- > '-' -> return True+-- > x -> throwError (Just x)+-- >+-- > pSignedNumber :: Parser String Int+-- > pSignedNumber = do+-- > is_negative <- fromMaybe False <$> option'' pSign+-- > value <- foldl1 (\ !a !b -> a * 10 + b) <$> many1'' pDigit ?>> return "digit or sign expected"+-- > return $ if is_negative then -value else value+ module Control.Monad.Error.Map ( MonadMapError (..)
src/Data/Conduit/Parsers/Binary/Get.hs view
@@ -78,7 +78,7 @@ import qualified Data.ByteString as SB hiding (ByteString, head, last, init, tail) import Data.ByteString.Lazy (ByteString) import qualified Data.ByteString.Lazy as B hiding (ByteString, head, last, init, tail)-import Data.Conduit+import Data.Conduit hiding (ConduitM) import Data.Int import Data.Maybe import Data.Semigroup hiding (Option)@@ -93,7 +93,7 @@ instance (DecodingState s, DecodingToken s ~ S.ByteString, DecodingElemsRead s) => DefaultDecodingState s where --- | The shortening of 'GetT' for the most common use case.+-- | The shortening of 'GetT' for the most common use case of binary deserialization. type Get e a = forall s o m. (DefaultDecodingState s, Monad m) => GetT s S.ByteString o e m a -- | Run a decoder presented as a 'Get' monad.
src/Data/Conduit/Parsers/Binary/Put.hs view
@@ -14,8 +14,8 @@ -- limitations under the License. -- --- | Despite binary's 'S.Put' is fully-functional construction (unlike 'S.Get'),--- we decided to provide this module for symmetry with 'Data.Binary.Conduit.Get'.+-- | Despite binary's 'S.Put' is fully-functional construction (unlike 'Data.Binary.Get.Get'),+-- we decided to provide this module for symmetry with 'Data.Conduit.Parsers.Binary.Get'. module Data.Conduit.Parsers.Binary.Put ( PutM@@ -67,7 +67,7 @@ import qualified Data.ByteString.Lazy as B hiding (ByteString, head, last, init, tail) import Data.ByteString.Short (ShortByteString) import qualified Data.ByteString.Short as HB hiding (ShortByteString)-import Data.Conduit+import Data.Conduit hiding (ConduitM) import Data.Int import Data.Word import Data.Conduit.Parsers.Binary@@ -78,7 +78,7 @@ instance (EncodingState s, EncodingToken s ~ Word64, EncodingBytesWrote s) => DefaultEncodingState s where --- | The shortening of 'PutM' for the most common use case.+-- | The shortening of 'PutM' for the most common use case of binary serialization. type Put = forall s i m. (DefaultEncodingState s, Monad m) => PutM s i S.ByteString m () -- | Run an encoder presented as a 'Put' monad.@@ -88,7 +88,8 @@ {-# INLINE runPut #-} -- | Get the total number of bytes wrote to this point.--- Can be used with 'mfix' to result bytes count prediction:+-- Can be used with 'Control.Monad.Fix.mfix' to result bytes count prediction:+-- -- > putWithSize :: (DefaultEncodingState s, Monad m) => PutM s i S.ByteString m () -> PutM s i S.ByteString m () -- > putWithSize !p = void $ mfix $ \size -> do -- > putWord64le size
src/Data/Conduit/Parsers/GetC.hs view
@@ -78,7 +78,7 @@ import qualified Control.Monad.Trans.State.Lazy as L import Control.Monad.Trans.Writer.Strict import qualified Control.Monad.Trans.Writer.Lazy as L-import Data.Conduit+import Data.Conduit hiding (ConduitM) import Data.Conduit.Lift import Data.Maybe hiding (fromJust)
src/Data/Conduit/Parsers/PutS.hs view
@@ -32,8 +32,7 @@ import Control.Monad.Fix import Control.Monad.Trans.State.Strict-import Data.Conduit-import Data.Semigroup+import Data.Conduit hiding (ConduitM) import Data.String import qualified Data.Text as S (Text) @@ -84,7 +83,7 @@ a <> b = a >> b {-# INLINE (<>) #-} --- | A 'ConduitT' with wrappers supposed to a binary serialization.+-- | A 'ConduitT' with wrappers supposed to a binary or text serialization. type PutM s i o m a = PutS s (ConduitT i o m) a instance (EncodingState s, EncodingToken s ~ (), Monad m) => IsString (PutM s i S.Text m ()) where
src/Data/Conduit/Parsers/Text/Gen.hs view
@@ -31,7 +31,7 @@ import Data.Bits import Data.Char-import Data.Conduit+import Data.Conduit hiding (ConduitM) import qualified Data.Text as S (Text) import qualified Data.Text as ST hiding (Text, head, last, tail, init) import Data.Text.Lazy (Text)@@ -43,7 +43,7 @@ instance (EncodingState s, EncodingToken s ~ ()) => DefaultTextGenState s where --- | The shortening of 'PutM' for the most common use case.+-- | The shortening of 'PutM' for the most common use case of text serialization. type TextGen = forall s i m. (DefaultTextGenState s, Monad m) => PutM s i S.Text m () -- | Run an encoder presented as a 'PutM' monad.
src/Data/Conduit/Parsers/Text/Parser.hs view
@@ -14,16 +14,6 @@ -- limitations under the License. -- --- | At the first look, Data.Binary.Conduit.Get module is very similar with Data.Binary.Get.--- The main differences between them are the following.--- While the 'S.Get' from binary is a very custom monad,--- the local 'Get' is 'ConduitT', which leads to easy integration in complicated format parsing.--- The Data.Binary.Get module does not have a function to create custom 'S.Get' monad,--- this module provides 'getC'.--- Unlike 'isolate' from binary, local 'isolate' does not "cut" bytes counter.--- While the binary's 'S.Get' is 'MonadFail', which leads to very ugly errors handling--- in complicated cases, local 'Get' is 'MonadError'.- module Data.Conduit.Parsers.Text.Parser ( MonadMapError (..) , (?=>>)@@ -101,7 +91,7 @@ import qualified Data.Attoparsec.Text as Tp hiding (parse, parseOnly, Parser, Result, IResult, Done, Partial, Fail, inClass, notInClass, isEndOfLine, isHorizontalSpace) import Data.Bits import Data.Char-import Data.Conduit+import Data.Conduit hiding (ConduitM) import qualified Data.Conduit.Combinators as N import Data.List.NonEmpty hiding (take, takeWhile) import Data.NonNull hiding (head)@@ -120,7 +110,7 @@ instance (DecodingState s, DecodingToken s ~ S.Text, DecodingTextRead s) => DefaultParsingState s where --- | The shortening of 'GetT' for the most common use case.+-- | The shortening of 'GetT' for the most common use case of text deserialization. type Parser e a = forall s o m. (DefaultParsingState s, Monad m) => GetT s S.Text o e m a -- | Run a decoder presented as a 'Get' monad.
src/Data/Conduit/Parsers/Text/TextOffset.hs view
@@ -14,16 +14,6 @@ -- limitations under the License. -- --- | At the first look, Data.Binary.Conduit.Get module is very similar with Data.Binary.Get.--- The main differences between them are the following.--- While the 'S.Get' from binary is a very custom monad,--- the local 'Get' is 'ConduitT', which leads to easy integration in complicated format parsing.--- The Data.Binary.Get module does not have a function to create custom 'S.Get' monad,--- this module provides 'getC'.--- Unlike 'isolate' from binary, local 'isolate' does not "cut" bytes counter.--- While the binary's 'S.Get' is 'MonadFail', which leads to very ugly errors handling--- in complicated cases, local 'Get' is 'MonadError'.- module Data.Conduit.Parsers.Text.TextOffset ( TextOffset (..) ) where
test/Data/Conduit/Parsers/Binary/Get/Spec.hs view
@@ -28,7 +28,7 @@ import qualified Data.ByteString as SB hiding (ByteString, head, last, init, tail) import Data.ByteString.Lazy (ByteString) import Data.Char-import Data.Conduit+import Data.Conduit hiding (ConduitM) import qualified Data.Conduit.Combinators as N import Data.Conduit.Lift import Data.Functor.Identity
test/Data/Conduit/Parsers/Binary/Put/Spec.hs view
@@ -24,7 +24,7 @@ import Control.Monad.Trans.Class import Data.Bits import qualified Data.ByteString as S (ByteString)-import Data.Conduit+import Data.Conduit hiding (ConduitM) import qualified Data.Conduit.Combinators as N import Test.HUnit.Base hiding (Label) import Data.Conduit.Parsers.Binary.Get
test/Data/Conduit/Parsers/Text/Gen/Spec.hs view
@@ -18,7 +18,7 @@ ( tests ) where -import Data.Conduit+import Data.Conduit hiding (ConduitM) import qualified Data.Conduit.Combinators as N import Data.Functor.Identity import qualified Data.Text as S (Text)
test/Data/Conduit/Parsers/Text/Parser/Spec.hs view
@@ -18,9 +18,11 @@ ( tests ) where -import Data.Conduit+import Control.Monad.Error.Class+import Data.Conduit hiding (ConduitM) import qualified Data.Conduit.Combinators as N import Data.Functor.Identity+import Data.Maybe import qualified Data.Text as S (Text) import Test.HUnit.Base hiding (Label) import Data.Conduit.Parsers.Binary.Get hiding (runGet)@@ -29,6 +31,7 @@ tests :: Test tests = TestList [ TestCase testLinesRead+ , TestCase testSignedNumber ] testLinesRead :: Assertion@@ -67,3 +70,25 @@ , "au\nx" , "" ]++pSign :: Parser (Maybe Char) Bool+pSign = do+ c <- pChar ?>> return Nothing+ case c of+ '+' -> return False+ '-' -> return True+ x -> throwError (Just x)++pSignedNumber :: Parser String Int+pSignedNumber = do+ is_negative <- fromMaybe False <$> option'' pSign+ value <- foldl1 (\ !a !b -> a * 10 + b) <$> many1'' pDigit ?>> return "digit or sign expected"+ return $ if is_negative then -value else value++testSignedNumber :: Assertion+testSignedNumber = do+ assertEqual "" (Right 145) $ runIdentity $ yield "145" `connect` runParser pSignedNumber+ assertEqual "" (Right 32) $ runIdentity $ yield "+32" `connect` runParser pSignedNumber+ assertEqual "" (Right (-7)) $ runIdentity $ yield "-7" `connect` runParser pSignedNumber+ assertEqual "" (Left "digit or sign expected") $ runIdentity $ yield "abc" `connect` runParser pSignedNumber+ assertEqual "" (Left "digit or sign expected") $ runIdentity $ yield "-abc" `connect` runParser pSignedNumber