@@ -257,7 +257,7 @@ takeTill p = takeWhile (not . p)
257-- parsers loop until a failure occurs. Careless use will thus result
257-- parsers loop until a failure occurs. Careless use will thus result
258-- in an infinite loop.
258-- in an infinite loop.
259takeWhile :: (Word8 -> Bool) -> Parser ByteString
259takeWhile :: (Word8 -> Bool) -> Parser ByteString
260−takeWhile p = (B.concat . reverse) `fmap` go []
260+takeWhile p = concatReverse `fmap` go []
262 go acc = do
262 go acc = do
263 s <- B8.takeWhile p <$> get
263 s <- B8.takeWhile p <$> get
@@ -329,16 +329,13 @@ scan_ f s0 p = go [] s0
329-- parsers loop until a failure occurs. Careless use will thus result
329-- parsers loop until a failure occurs. Careless use will thus result
330-- in an infinite loop.
330-- in an infinite loop.
331scan :: s -> (s -> Word8 -> Maybe s) -> Parser ByteString
331scan :: s -> (s -> Word8 -> Maybe s) -> Parser ByteString
332−scan = scan_ $ \_ chunks ->
332+scan = scan_ $ \_ chunks -> return $! concatReverse chunks
335− xs -> return $! B.concat $ reverse xs
336{-# INLINE scan #-}
333{-# INLINE scan #-}
338-- | Like 'scan', but generalized to return the final state of the
335-- | Like 'scan', but generalized to return the final state of the
339-- scanner.
336-- scanner.
340runScanner :: s -> (s -> Word8 -> Maybe s) -> Parser (ByteString, s)
337runScanner :: s -> (s -> Word8 -> Maybe s) -> Parser (ByteString, s)
341−runScanner = scan_ $ \s xs -> return (B.concat (reverse xs), s)
338+runScanner = scan_ $ \s xs -> let !sx = concatReverse xs in return (sx, s)
342{-# INLINE runScanner #-}
339{-# INLINE runScanner #-}
344-- | Consume input as long as the predicate returns 'True', and return
341-- | Consume input as long as the predicate returns 'True', and return