flatparse 0.2.1.0 → 0.2.2.0
raw patch · 7 files changed
+104/−7 lines, 7 filesdep +integer-gmpPVP ok
version bump matches the API change (PVP)
Dependencies added: integer-gmp
API changes (from Hackage documentation)
+ FlatParse.Basic: readInt :: Parser e Int
+ FlatParse.Basic: readInteger :: Parser e Integer
+ FlatParse.Internal: readInt :: Addr# -> Addr# -> (# (# #) | (# Int#, Addr# #) #)
+ FlatParse.Internal: readInteger :: ForeignPtrContents -> Addr# -> Addr# -> (# (# #) | (# Integer, Addr# #) #)
+ FlatParse.Stateful: readInt :: Parser e Int
+ FlatParse.Stateful: readInteger :: Parser e Integer
Files
- bench/Bench.hs +12/−1
- bench/ReadInteger.hs +7/−0
- flatparse.cabal +6/−4
- src/FlatParse/Basic.hs +17/−0
- src/FlatParse/Examples/BasicLambda/Parser.hs +1/−2
- src/FlatParse/Internal.hs +42/−0
- src/FlatParse/Stateful.hs +19/−0
bench/Bench.hs view
@@ -1,8 +1,10 @@+{-# options_ghc -Wno-unused-imports #-} module Main where import Data.Primitive.ByteArray import Gauge+ import qualified Data.ByteString.Char8 as B import qualified Attoparsec@@ -11,6 +13,7 @@ import qualified FPStateful import qualified FPBasic import qualified Bytesmith+import qualified ReadInteger sexpInp :: B.ByteString sexpInp =@@ -31,6 +34,9 @@ numcsvInp' :: ByteArray numcsvInp' = Bytesmith.strToByteArray $ B.unpack numcsvInp +readIntInp :: B.ByteString+readIntInp = "12345678910"+ main :: IO () main = defaultMain [ bgroup "sexp" [@@ -58,5 +64,10 @@ bench "attoparsec" $ whnf Attoparsec.runNumcsv numcsvInp, bench "megaparsec" $ whnf Megaparsec.runNumcsv numcsvInp, bench "parsec" $ whnf Parsec.runNumcsv numcsvInp- ]+ ],++ bgroup "readInt/readInteger" [+ bench "readInt" $ whnf ReadInteger.readInt readIntInp,+ bench "readInteger" $ whnf ReadInteger.readInteger readIntInp+ ] ]
+ bench/ReadInteger.hs view
@@ -0,0 +1,7 @@++module ReadInteger where++import FlatParse.Basic as FPBasic++readInt = runParser FPBasic.readInt+readInteger = runParser FPBasic.readInteger
flatparse.cabal view
@@ -3,11 +3,9 @@ -- This file has been generated from package.yaml by hpack version 0.34.4. -- -- see: https://github.com/sol/hpack------ hash: 2ba3a084128297d0d1b6136ac0a6aff88c0a67a3998844684ae951a9e56aa339 name: flatparse-version: 0.2.1.0+version: 0.2.2.0 synopsis: High-performance parsing from strict bytestrings description: @Flatparse@ is a high-performance parsing library, focusing on programming languages and human-readable data formats. See the README for more information:@@ -20,9 +18,9 @@ copyright: 2021 András Kovács license: MIT license-file: LICENSE+build-type: Simple tested-with: GHC == 8.8.4-build-type: Simple extra-source-files: README.md @@ -35,6 +33,7 @@ FlatParse.Basic FlatParse.Examples.BasicLambda.Lexer FlatParse.Examples.BasicLambda.Parser+ FlatParse.Internal FlatParse.Stateful other-modules: Paths_flatparse@@ -56,6 +55,7 @@ base >=4.7 && <5 , bytestring , containers+ , integer-gmp , template-haskell default-language: Haskell2010 @@ -69,6 +69,7 @@ FPStateful Megaparsec Parsec+ ReadInteger Paths_flatparse hs-source-dirs: bench@@ -91,6 +92,7 @@ , bytestring , flatparse , gauge+ , integer-gmp , megaparsec , parsec , primitive
src/FlatParse/Basic.hs view
@@ -54,6 +54,8 @@ , isDigit , isGreekLetter , isLatinLetter+ , readInt+ , readInteger -- * Combinators , (<|>)@@ -127,6 +129,7 @@ import qualified Data.ByteString.Internal as B import qualified Data.Map.Strict as M +import qualified FlatParse.Internal as Internal -------------------------------------------------------------------------------- @@ -603,6 +606,20 @@ isGreekLetter c = ('Α' <= c && c <= 'Ω') || ('α' <= c && c <= 'ω') {-# inline isGreekLetter #-} +-- | Read an `Int` from the input, as a non-empty digit sequence. The `Int` may+-- overflow in the result.+readInt :: Parser e Int+readInt = Parser \fp eob s -> case Internal.readInt eob s of+ (# (##) | #) -> Fail#+ (# | (# n, s' #) #) -> OK# (I# n) s'+{-# inline readInt #-}++-- | Read an `Integer` from the input, as a non-empty digit sequence.+readInteger :: Parser e Integer+readInteger = Parser \fp eob s -> case Internal.readInteger fp eob s of+ (# (##) | #) -> Fail#+ (# | (# i, s' #) #) -> OK# i s'+{-# inline readInteger #-} --------------------------------------------------------------------------------
src/FlatParse/Examples/BasicLambda/Parser.hs view
@@ -59,7 +59,6 @@ digit = (\c -> ord c - ord '0') <$> satisfyASCII isDigit int :: Parser Int- int = token do (place, n) <- chainr (\n (!place, !acc) -> (place*10,acc+place*n)) digit (pure (1, 0)) case place of@@ -91,7 +90,7 @@ add' :: Parser Tm add' = chainl Add mul' ($(symbol "+") *> mul') --- | Parse an `Eq` or `Lt`-level expression.+-- | Parse an `FlatParse.Examples.BasicLambda.Parser.Eq` or `Lt`-level expression. eqLt' :: Parser Tm eqLt' = add' >>= \e1 ->
+ src/FlatParse/Internal.hs view
@@ -0,0 +1,42 @@+++module FlatParse.Internal (readInt, readInteger) where++import qualified Data.ByteString.Char8 as B+import qualified Data.ByteString.Internal as B++import GHC.Exts+import GHC.ForeignPtr+import GHC.Integer.GMP.Internals (Integer(..))++mul10 :: Int# -> Int#+mul10 n = uncheckedIShiftL# n 3# +# uncheckedIShiftL# n 1#+{-# inline mul10 #-}++readInt' :: Int# -> Addr# -> Addr# -> (# Int#, Addr# #)+readInt' acc s end = case eqAddr# s end of+ 1# -> (# acc, s #)+ _ -> case indexWord8OffAddr# s 0# of+ w | 1# <- leWord# 48## w, 1# <- leWord# w 57## ->+ readInt' (mul10 acc +# (word2Int# w -# 48#)) (plusAddr# s 1#) end+ _ -> (# acc, s #)+++-- | Read an `Int` from the input, as a non-empty digit sequence. The `Int` may+-- overflow in the result.+readInt :: Addr# -> Addr# -> (# (##) | (# Int#, Addr# #) #)+readInt eob s = case readInt' 0# s eob of+ (# n, s' #) | 1# <- eqAddr# s s' -> (# (##) | #)+ | otherwise -> (# | (# n, s' #) #)+{-# inline readInt #-}++-- | Read an `Integer` from the input, as a non-empty digit sequence.+readInteger :: ForeignPtrContents -> Addr# -> Addr# -> (# (##) | (# Integer, Addr# #) #)+readInteger fp eob s = case readInt' 0# s eob of+ (# n, s' #)+ | 1# <- eqAddr# s s' -> (# (##) | #)+ | 1# <- minusAddr# s' s <=# 18# -> (# | (# S# n, s' #) #)+ | otherwise -> case B.readInteger (B.PS (ForeignPtr s fp) 0 (I# (minusAddr# s' s))) of+ Nothing -> (# (##) | #)+ Just (i, _) -> (# | (# i, s' #) #)+{-# inline readInteger #-}
src/FlatParse/Stateful.hs view
@@ -60,6 +60,8 @@ , isDigit , isGreekLetter , isLatinLetter+ , readInt+ , readInteger -- * Combinators , (<|>)@@ -134,6 +136,8 @@ import qualified Data.ByteString.Unsafe as B import qualified Data.Map.Strict as M +import qualified FlatParse.Internal as Internal+ -------------------------------------------------------------------------------- -- | Primitive result of a parser. Possible results are given by `OK#`, `Err#` and `Fail#`@@ -637,6 +641,21 @@ isGreekLetter :: Char -> Bool isGreekLetter c = ('Α' <= c && c <= 'Ω') || ('α' <= c && c <= 'ω') {-# inline isGreekLetter #-}++-- | Read an `Int` from the input, as a non-empty digit sequence. The `Int` may+-- overflow in the result.+readInt :: Parser e Int+readInt = Parser \fp r eob s n -> case Internal.readInt eob s of+ (# (##) | #) -> Fail#+ (# | (# i, s' #) #) -> OK# (I# i) s' n+{-# inline readInt #-}++-- | Read an `Integer` from the input, as a non-empty digit sequence.+readInteger :: Parser e Integer+readInteger = Parser \fp r eob s n -> case Internal.readInteger fp eob s of+ (# (##) | #) -> Fail#+ (# | (# i, s' #) #) -> OK# i s' n+{-# inline readInteger #-} --------------------------------------------------------------------------------