scanner 0.3 → 0.3.1
raw patch · 4 files changed
+21/−38 lines, 4 filesdep +faildep ~base
Dependencies added: fail
Dependency ranges changed: base
Files
- bench/bench.hs +5/−35
- changelog.md +4/−0
- lib/Scanner/Internal.hs +10/−2
- scanner.cabal +2/−1
bench/bench.hs view
@@ -28,9 +28,7 @@ intInput = ":123\r\n" bulkInput = "$10\r\n0123456789\r\n" multiInput = "*3\r\n+A\r\n+B\r\n+C\r\n"- binaryInput =- let str = ByteString.pack [5, 65, 66, 67, 68, 69]- in ByteString.concat (replicate 10 str)+ binaryInput = ByteString.pack [5, 65, 66, 67, 68, 69] print (stringAtto smallStringInput) print (stringScanner smallStringInput) print (stringWordScanner smallStringInput)@@ -47,8 +45,6 @@ print (redisAttoReply multiInput) print (redisZeptoReply multiInput) print (redisScannerReply multiInput)- print (binaryScanner binaryInput)- print (binaryCereal binaryInput) defaultMain [ bgroup "scanner" [ bgroup "string"@@ -160,45 +156,19 @@ _ -> Left "Unknown type" Nothing -> Left "Not enought input" -binaryScanner :: ByteString -> Either String [ByteString]-binaryScanner bs = case Scanner.scan p' bs of+binaryScanner :: ByteString -> Either String ByteString+binaryScanner bs = case Scanner.scan p bs of Scanner.Done _ r -> Right r Scanner.Fail _ err -> Left err Scanner.More _ -> Left "Not enought input" where- p' = do- a0 <- p- a1 <- p- a2 <- p- a3 <- p- a4 <- p- a5 <- p- a6 <- p- a7 <- p- a8 <- p- a9 <- p- return [a0, a1, a2, a3, a4, a5, a6, a7, a8, a9]- {-# INLINE p #-} p = do n <- fromIntegral <$> Scanner.anyWord8 Scanner.take n -binaryCereal :: ByteString -> Either String [ByteString]-binaryCereal bs = Cereal.runGet g' bs+binaryCereal :: ByteString -> Either String ByteString+binaryCereal bs = Cereal.runGet g bs where- g' = do- a0 <- g- a1 <- g- a2 <- g- a3 <- g- a4 <- g- a5 <- g- a6 <- g- a7 <- g- a8 <- g- a9 <- g- return [a0, a1, a2, a3, a4, a5, a6, a7, a8, a9]- {-# INLINE g #-} g = do n <- fromIntegral <$> Cereal.getWord8 Cereal.getBytes n
changelog.md view
@@ -1,3 +1,7 @@+0.3.1++* support ghc-8.8+ 0.3 * add foldWhile, foldWhile1, satisfy, satisfyMaybe
lib/Scanner/Internal.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE RankNTypes, BangPatterns #-}+{-# LANGUAGE RankNTypes, BangPatterns, CPP #-} {-# OPTIONS_HADDOCK not-home #-} -- | Scanner implementation@@ -13,6 +13,7 @@ import qualified Data.ByteString.Unsafe as ByteString (unsafeDrop) import qualified Scanner.OctetPredicates as OctetPredicates import Control.Monad+import Control.Monad.Fail -- | CPS scanner without backtracking newtype Scanner a = Scanner@@ -65,10 +66,17 @@ run s1 bs $ \bs' a -> run (s2 a) bs' next +#if !(MIN_VERSION_base(4,13,0)) {-# INLINE fail #-} fail err = Scanner $ \bs _ -> Fail bs err+#endif +instance MonadFail Scanner where+ {-# INLINE fail #-}+ fail err = Scanner $ \bs _ ->+ Fail bs err+ -- | Consume the next word -- -- It fails if end of input@@ -156,7 +164,7 @@ bs <- take (ByteString.length str) if bs == str then return ()- else fail "Unexpected input"+ else Control.Monad.Fail.fail "Unexpected input" -- | Return the next byte, if any, without consuming it {-# INLINE lookAhead #-}
scanner.cabal view
@@ -1,5 +1,5 @@ name: scanner-version: 0.3+version: 0.3.1 synopsis: Fast non-backtracking incremental combinator parsing for bytestrings homepage: https://github.com/Yuras/scanner license: BSD3@@ -25,6 +25,7 @@ Data.Either Scanner.OctetPredicates build-depends: base <5+ , fail , bytestring hs-source-dirs: lib, compat ghc-options: -O2