scanner-0.2: Fast non-backtracking incremental combinator parsing for bytestrings

Safe HaskellNone
LanguageHaskell2010

Scanner

Description

Fast not-backtracking incremental scanner for bytestrings

Unlike attoparsec or most of other parser combinator libraries, scanner doesn't support backtracking. But you probably don't need it anyway, at least if you need fast parser.

Scanner processes input incrementally. When more input is needed, scanner returns More continuation. All the already processed input is discarded.

Synopsis

Documentation

data Scanner a Source

CPS scanner without backtracking

data Result r Source

Scanner result

Constructors

Done ByteString r

Successful result with the rest of input

Fail ByteString String

Scanner failed with rest of input and error message

More (ByteString -> Result r)

Need more input

scan :: Scanner r -> ByteString -> Result r Source

Run scanner with the input

scanOnly :: Scanner a -> ByteString -> Either String a Source

Scan the complete input, without resupplying

scanLazy :: Scanner a -> ByteString -> Either String a Source

Scan lazy bytestring by resupplying scanner with chunks

scanWith :: Monad m => m ByteString -> Scanner a -> ByteString -> m (Result a) Source

Scan with the provided resupply action

anyWord8 :: Scanner Word8 Source

Consume the next word

It fails if end of input

anyChar8 :: Scanner Char Source

Consume the next 8-bit char

It fails if end of input

word8 :: Word8 -> Scanner () Source

Consume the specified word or fail

char8 :: Char -> Scanner () Source

Consume the specified 8-bit char or fail

take :: Int -> Scanner ByteString Source

Take the specified number of bytes

takeWhile :: (Word8 -> Bool) -> Scanner ByteString Source

Take input while the predicate is True

takeWhileChar8 :: (Char -> Bool) -> Scanner ByteString Source

Take input while the predicate is True

string :: ByteString -> Scanner () Source

Consume the specified string

Warning: it is not optimized yet, so for for small string it is better to consume it byte-by-byte using word8

skipWhile :: (Word8 -> Bool) -> Scanner () Source

Skip any input while the preducate is True

skipSpace :: Scanner () Source

Skip space

lookAhead :: Scanner (Maybe Word8) Source

Return the next byte, if any, without consuming it

lookAheadChar8 :: Scanner (Maybe Char) Source

Return the next byte, if any, without consuming it